diff --git a/carla b/carla index 862c1ec..0032f18 160000 --- a/carla +++ b/carla @@ -1 +1 @@ -Subproject commit 862c1ec129111f25a3af972851f8adb0a102b521 +Subproject commit 0032f18fad01806c512f1e12804d8c7adffb4e8a diff --git a/plugins/Common/IldaeilBasePlugin.hpp b/plugins/Common/IldaeilBasePlugin.hpp index af401b3..b521e91 100644 --- a/plugins/Common/IldaeilBasePlugin.hpp +++ b/plugins/Common/IldaeilBasePlugin.hpp @@ -61,6 +61,7 @@ public: const char* ildaeilConfigDir(); void ildaeilProjectLoadedFromDSP(void* ui); void ildaeilParameterChangeForUI(void* ui, uint32_t index, float value); +void ildaeilResizeUI(void* ui, uint32_t width, uint32_t height); void ildaeilCloseUI(void* ui); const char* ildaeilOpenFileForUI(void* ui, bool isDir, const char* title, const char* filter); diff --git a/plugins/Common/IldaeilPlugin.cpp b/plugins/Common/IldaeilPlugin.cpp index f7dac5b..5ca4030 100644 --- a/plugins/Common/IldaeilPlugin.cpp +++ b/plugins/Common/IldaeilPlugin.cpp @@ -18,6 +18,7 @@ #include "IldaeilBasePlugin.hpp" #include "DistrhoPluginUtils.hpp" +#include "CarlaBackendUtils.hpp" #include "CarlaEngine.hpp" #include "water/files/File.h" #include "water/streams/MemoryOutputStream.h" @@ -535,10 +536,13 @@ public: case NATIVE_HOST_OPCODE_UI_TOUCH_PARAMETER: case NATIVE_HOST_OPCODE_REQUEST_IDLE: case NATIVE_HOST_OPCODE_GET_FILE_PATH: - case NATIVE_HOST_OPCODE_UI_RESIZE: case NATIVE_HOST_OPCODE_PREVIEW_BUFFER_DATA: // TESTING - d_stdout("dispatcher %i, %i, %li, %p, %f", opcode, index, value, ptr, opt); + d_stdout("dispatcher %i:%s, %i, %li, %p, %f", + opcode, NativeHostDispatcherOpcode2Str(opcode), index, value, ptr, opt); + break; + case NATIVE_HOST_OPCODE_UI_RESIZE: + ildaeilResizeUI(fUI, index, value); break; } diff --git a/plugins/Common/IldaeilUI.cpp b/plugins/Common/IldaeilUI.cpp index 921347d..000694c 100644 --- a/plugins/Common/IldaeilUI.cpp +++ b/plugins/Common/IldaeilUI.cpp @@ -382,6 +382,11 @@ public: repaint(); } + void resizeUI(uint32_t, uint32_t) + { + // unused for now + } + void closeUI() { if (fIdleState == kIdleGiveIdleToUI) @@ -416,6 +421,7 @@ public: fPluginHostWindow.restart(); carla_embed_custom_ui(handle, fPluginId, fNativeWindowHandle); + fPluginHostWindow.idle(); } else #endif @@ -610,9 +616,20 @@ public: if (ok) { + d_debug("loadeded a plugin with label '%s' and name '%s' %lu", + info.name.c_str(), info.label.c_str(), info.uniqueId); + fPluginRunning = true; fPluginGenericUI = nullptr; fPluginFilename.clear(); + + #ifdef DISTRHO_OS_MAC + const bool brokenOffset = fPluginType == PLUGIN_VST2 + && info.name == "Renoise Redux" + && info.uniqueId == d_cconst('R', 'R', 'D', 'X'); + fPluginHostWindow.setOffsetBroken(brokenOffset); + #endif + showPluginUI(handle, false); #ifdef WASM_TESTING @@ -1777,7 +1794,14 @@ void ildaeilParameterChangeForUI(void* const ui, const uint32_t index, const flo static_cast(ui)->changeParameterFromDSP(index, value); } -void ildaeilCloseUI(void* ui) +void ildaeilResizeUI(void* const ui, const uint32_t width, const uint32_t height) +{ + DISTRHO_SAFE_ASSERT_RETURN(ui != nullptr,); + + static_cast(ui)->resizeUI(width, height); +} + +void ildaeilCloseUI(void* const ui) { DISTRHO_SAFE_ASSERT_RETURN(ui != nullptr,); diff --git a/plugins/Common/PluginHostWindow.cpp b/plugins/Common/PluginHostWindow.cpp index 81ef7af..ce2a17f 100644 --- a/plugins/Common/PluginHostWindow.cpp +++ b/plugins/Common/PluginHostWindow.cpp @@ -66,6 +66,7 @@ struct PluginHostWindow::PrivateData #endif uint xOffset, yOffset; + bool brokenOffsetFactor; bool lookingForChildren; PrivateData(void* const wh, Callbacks* const cbs) @@ -83,6 +84,7 @@ struct PluginHostWindow::PrivateData #endif xOffset(0), yOffset(0), + brokenOffsetFactor(false), lookingForChildren(false) { #if defined(DISTRHO_OS_HAIKU) @@ -118,6 +120,9 @@ struct PluginHostWindow::PrivateData pluginWindow = nullptr; #else pluginWindow = 0; + + for (XEvent event; XPending(display) > 0;) + XNextEvent(display, &event); #endif } @@ -156,8 +161,8 @@ struct PluginHostWindow::PrivateData { if (lookingForChildren) { -#if defined(DISTRHO_OS_HAIKU) -#elif defined(DISTRHO_OS_MAC) + #if defined(DISTRHO_OS_HAIKU) + #elif defined(DISTRHO_OS_MAC) if (pluginView == nullptr) { bool first = true; @@ -172,15 +177,12 @@ struct PluginHostWindow::PrivateData break; } } -#elif defined(DISTRHO_OS_WASM) -#elif defined(DISTRHO_OS_WINDOWS) + #elif defined(DISTRHO_OS_WASM) + #elif defined(DISTRHO_OS_WINDOWS) if (pluginWindow == nullptr) pluginWindow = FindWindowExA((::HWND)windowHandle, nullptr, nullptr, nullptr); -#else - if (display == nullptr) - return; - - if (pluginWindow == 0) + #else + if (display != nullptr && pluginWindow == 0) { ::Window rootWindow, parentWindow; ::Window* childWindows = nullptr; @@ -196,11 +198,11 @@ struct PluginHostWindow::PrivateData XFree(childWindows); } } -#endif + #endif } -#if defined(DISTRHO_OS_HAIKU) -#elif defined(DISTRHO_OS_MAC) + #if defined(DISTRHO_OS_HAIKU) + #elif defined(DISTRHO_OS_MAC) if (pluginView != nullptr) { const double scaleFactor = [[[pluginView window] screen] backingScaleFactor]; @@ -213,14 +215,16 @@ struct PluginHostWindow::PrivateData if (width > 1.0 && height > 1.0) { + NSPoint origin = brokenOffsetFactor ? NSMakePoint(xOffset, yOffset) + : NSMakePoint(xOffset / scaleFactor, yOffset / scaleFactor); + lookingForChildren = false; - [pluginView setFrameOrigin:NSMakePoint(xOffset / scaleFactor, yOffset / scaleFactor)]; - [pluginView setNeedsDisplay:YES]; + [pluginView setFrameOrigin:origin]; pluginWindowCallbacks->pluginWindowResized(width * scaleFactor, height * scaleFactor); } } -#elif defined(DISTRHO_OS_WASM) -#elif defined(DISTRHO_OS_WINDOWS) + #elif defined(DISTRHO_OS_WASM) + #elif defined(DISTRHO_OS_WINDOWS) if (pluginWindow != nullptr) { int width = 0; @@ -244,7 +248,7 @@ struct PluginHostWindow::PrivateData pluginWindowCallbacks->pluginWindowResized(width, height); } } -#else + #else for (XEvent event; XPending(display) > 0;) XNextEvent(display, &event); @@ -300,7 +304,7 @@ struct PluginHostWindow::PrivateData pluginWindowCallbacks->pluginWindowResized(width, height); } } -#endif + #endif } void setOffset(const uint x, const uint y) @@ -309,6 +313,11 @@ struct PluginHostWindow::PrivateData yOffset = y; } + void setOffsetBroken(const bool broken) + { + brokenOffsetFactor = broken; + } + void setSize(const uint width, const uint height) { #if defined(DISTRHO_OS_HAIKU) @@ -355,6 +364,11 @@ void PluginHostWindow::setOffset(const uint x, const uint y) pData->setOffset(x, y); } +void PluginHostWindow::setOffsetBroken(bool brokenOffsetFactor) +{ + pData->setOffsetBroken(brokenOffsetFactor); +} + void PluginHostWindow::setSize(const uint width, const uint height) { pData->setSize(width, height); diff --git a/plugins/Common/PluginHostWindow.hpp b/plugins/Common/PluginHostWindow.hpp index d944b5e..35636a3 100644 --- a/plugins/Common/PluginHostWindow.hpp +++ b/plugins/Common/PluginHostWindow.hpp @@ -39,6 +39,7 @@ public: bool hide(); void idle(); void setOffset(uint x, uint y); + void setOffsetBroken(bool brokenOffsetFactor); void setSize(uint width, uint height); };