Browse Source

Improve CLAP host vs plugin side UI resize

Signed-off-by: falkTX <falktx@falktx.com>
pull/1689/head
falkTX 2 years ago
parent
commit
703972c1d4
Signed by: falkTX <falktx@falktx.com> GPG Key ID: CDBAA37ABC74FBA0
8 changed files with 129 additions and 25 deletions
  1. +1
    -0
      source/backend/engine/CarlaEngine.cpp
  2. +115
    -12
      source/backend/plugin/CarlaPluginCLAP.cpp
  3. +1
    -1
      source/backend/plugin/CarlaPluginLV2.cpp
  4. +2
    -2
      source/backend/plugin/CarlaPluginVST2.cpp
  5. +1
    -1
      source/backend/plugin/CarlaPluginVST3.cpp
  6. +1
    -1
      source/bridges-ui/CarlaBridgeToolkitNative.cpp
  7. +7
    -7
      source/utils/CarlaPluginUI.cpp
  8. +1
    -1
      source/utils/CarlaPluginUI.hpp

+ 1
- 0
source/backend/engine/CarlaEngine.cpp View File

@@ -3145,6 +3145,7 @@ bool CarlaEngine::loadProjectInternal(water::XmlDocument& xmlDoc, const bool alw
case PLUGIN_LV2:
case PLUGIN_VST2:
case PLUGIN_VST3:
case PLUGIN_CLAP:
btype = getBinaryTypeFromFile(stateSave.binary);
break;
default:


+ 115
- 12
source/backend/plugin/CarlaPluginCLAP.cpp View File

@@ -1101,7 +1101,12 @@ public:

uint32_t width, height;
if (fExtensions.gui->get_size(fPlugin, &width, &height))
fUI.window->setSize(width, height, false);
{
fUI.isResizingFromInit = true;
fUI.width = width;
fUI.height = height;
fUI.window->setSize(width, height, true, true);
}

fExtensions.gui->show(fPlugin);
fUI.window->show();
@@ -1162,7 +1167,48 @@ public:

void uiIdle() override
{
#ifdef CLAP_WINDOW_API_NATIVE
if (fUI.shouldClose)
{
fUI.shouldClose = false;
fUI.isResizingFromHost = fUI.isResizingFromInit = false;
fUI.isResizingFromPlugin = 0;

showCustomUI(false);
pData->engine->callback(true, true,
ENGINE_CALLBACK_UI_STATE_CHANGED,
pData->id,
0,
0, 0, 0.0f, nullptr);
}

if (fUI.isResizingFromHost)
{
fUI.isResizingFromHost = false;

if (fUI.isResizingFromPlugin == 0 && !fUI.isResizingFromInit == false)
{
carla_stdout("Host resize restarted");
fExtensions.gui->set_size(fPlugin, fUI.width, fUI.height);
}
}

if (fUI.window != nullptr)
fUI.window->idle();

if (fUI.isResizingFromPlugin == 2)
{
fUI.isResizingFromPlugin = 1;
}
else if (fUI.isResizingFromPlugin == 1)
{
fUI.isResizingFromPlugin = 0;
carla_stdout("Plugin resize stopped");
}
#endif

runIdleCallbacksAsNeeded();

CarlaPlugin::uiIdle();
}

@@ -2451,23 +2497,66 @@ protected:
void handlePluginUIClosed() override
{
CARLA_SAFE_ASSERT_RETURN(fUI.window != nullptr,);
carla_debug("CarlaPluginCLAP::handlePluginUIClosed()");
carla_stdout("CarlaPluginCLAP::handlePluginUIClosed()");

showCustomUI(false);
pData->engine->callback(true, true,
ENGINE_CALLBACK_UI_STATE_CHANGED,
pData->id,
0,
0, 0, 0.0f, nullptr);
fUI.shouldClose = true;
}

void handlePluginUIResized(const uint width, const uint height) override
{
CARLA_SAFE_ASSERT_RETURN(fUI.window != nullptr,);
carla_debug("CarlaPluginCLAP::handlePluginUIResized(%u, %u)", width, height);
carla_stdout("CarlaPluginCLAP::handlePluginUIResized(%u, %u | vs %u %u) %d %s %s",
width, height,
fUI.width, fUI.height,
fUI.isResizingFromPlugin, bool2str(fUI.isResizingFromInit), bool2str(fUI.isResizingFromHost));

if (fExtensions.gui == nullptr)
return;

if (fUI.isResizingFromPlugin != 0)
{
CARLA_SAFE_ASSERT_UINT2_RETURN(fUI.width == width, fUI.width, width,);
CARLA_SAFE_ASSERT_UINT2_RETURN(fUI.height == height, fUI.height, height,);
fUI.isResizingFromPlugin = 2;
return;
}

if (fExtensions.gui != nullptr)
fExtensions.gui->set_size(fPlugin, width, height);
if (fUI.isResizingFromInit)
{
CARLA_SAFE_ASSERT_UINT2_RETURN(fUI.width == width, fUI.width, width,);
CARLA_SAFE_ASSERT_UINT2_RETURN(fUI.height == height, fUI.height, height,);
fUI.isResizingFromInit = false;
return;
}

if (fUI.isResizingFromHost)
{
CARLA_SAFE_ASSERT_UINT2_RETURN(fUI.width == width, fUI.width, width,);
CARLA_SAFE_ASSERT_UINT2_RETURN(fUI.height == height, fUI.height, height,);
fUI.isResizingFromHost = false;
return;
}

if (fUI.width != width || fUI.height != height)
{
uint width2 = width;
uint height2 = height;

if (fExtensions.gui->adjust_size(fPlugin, &width2, &height2))
{
if (width2 != width || height2 != height)
{
fUI.isResizingFromHost = true;
fUI.width = width2;
fUI.height = height2;
fUI.window->setSize(width2, height2, false, false);
}
else
{
fExtensions.gui->set_size(fPlugin, width2, height2);
}
}
}
}
#endif

@@ -2511,7 +2600,10 @@ protected:
CARLA_SAFE_ASSERT_RETURN(fUI.window != nullptr, false);
carla_stdout("CarlaPluginCLAP::hostRequestResize(%u, %u)", width, height);

fUI.window->setSize(width, height, true);
fUI.isResizingFromPlugin = 3;
fUI.width = width;
fUI.height = height;
fUI.window->setSize(width, height, true, false);
return true;
}

@@ -2964,6 +3056,11 @@ private:
bool isCreated;
bool isEmbed;
bool isVisible;
bool isResizingFromHost;
bool isResizingFromInit;
int isResizingFromPlugin;
bool shouldClose;
uint32_t width, height;
CarlaPluginUI* window;

UI()
@@ -2971,6 +3068,12 @@ private:
isCreated(false),
isEmbed(false),
isVisible(false),
isResizingFromHost(false),
isResizingFromInit(false),
isResizingFromPlugin(0),
shouldClose(false),
width(0),
height(0),
window(nullptr) {}

~UI()


+ 1
- 1
source/backend/plugin/CarlaPluginLV2.cpp View File

@@ -6181,7 +6181,7 @@ public:
else
{
CARLA_SAFE_ASSERT_RETURN(fUI.window != nullptr, 1);
fUI.window->setSize(static_cast<uint>(width), static_cast<uint>(height), true);
fUI.window->setSize(static_cast<uint>(width), static_cast<uint>(height), true, true);
}

return 0;


+ 2
- 2
source/backend/plugin/CarlaPluginVST2.cpp View File

@@ -589,7 +589,7 @@ public:
CARLA_SAFE_ASSERT_INT2(width > 1 && height > 1, width, height);

if (width > 1 && height > 1)
fUI.window->setSize(static_cast<uint>(width), static_cast<uint>(height), true);
fUI.window->setSize(static_cast<uint>(width), static_cast<uint>(height), true, true);
}
}
else
@@ -2213,7 +2213,7 @@ protected:
else
{
CARLA_SAFE_ASSERT_BREAK(fUI.window != nullptr);
fUI.window->setSize(static_cast<uint>(index), static_cast<uint>(value), true);
fUI.window->setSize(static_cast<uint>(index), static_cast<uint>(value), true, false);
}
ret = 1;
break;


+ 1
- 1
source/backend/plugin/CarlaPluginVST3.cpp View File

@@ -799,7 +799,7 @@ public:
CARLA_SAFE_ASSERT_INT2(width > 1 && height > 1, width, height);

if (width > 1 && height > 1)
fUI.window->setSize(static_cast<uint>(width), static_cast<uint>(height), true);
fUI.window->setSize(static_cast<uint>(width), static_cast<uint>(height), true, true);
}
}
else


+ 1
- 1
source/bridges-ui/CarlaBridgeToolkitNative.cpp View File

@@ -178,7 +178,7 @@ public:
CARLA_SAFE_ASSERT_RETURN(height > 0,);
carla_debug("CarlaBridgeToolkitNative::resize(%i, %i)", width, height);

fHostUI->setSize(width, height, false);
fHostUI->setSize(width, height, false, false);
}

void setTitle(const char* const title) override


+ 7
- 7
source/utils/CarlaPluginUI.cpp View File

@@ -202,7 +202,7 @@ public:
}

if (width > 1 && height > 1)
setSize(static_cast<uint>(width), static_cast<uint>(height), false);
setSize(static_cast<uint>(width), static_cast<uint>(height), false, false);
}

const Atom _xevp = XInternAtom(fDisplay, "_XEventProc", False);
@@ -391,7 +391,7 @@ public:
}
}

void setSize(const uint width, const uint height, const bool forceUpdate) override
void setSize(const uint width, const uint height, const bool forceUpdate, const bool resizeChild) override
{
CARLA_SAFE_ASSERT_RETURN(fDisplay != nullptr,);
CARLA_SAFE_ASSERT_RETURN(fHostWindow != 0,);
@@ -399,7 +399,7 @@ public:
fSetSizeCalledAtLeastOnce = true;
XResizeWindow(fDisplay, fHostWindow, width, height);

if (fChildWindow != 0)
if (fChildWindow != 0 && resizeChild)
XResizeWindow(fDisplay, fChildWindow, width, height);

if (! fIsResizable)
@@ -763,7 +763,7 @@ public:
[NSApp activateIgnoringOtherApps:YES];
}

void setSize(const uint width, const uint height, const bool forceUpdate) override
void setSize(const uint width, const uint height, const bool forceUpdate, const bool resizeChild) override
{
carla_debug("CocoaPluginUI::setSize(%u, %u, %s)", width, height, bool2str(forceUpdate));
CARLA_SAFE_ASSERT_RETURN(fWindow != nullptr,);
@@ -775,7 +775,7 @@ public:
[fWindow setContentSize:size];

// this is needed for a few plugins
if (forceUpdate)
if (forceUpdate && resizeChild)
{
for (NSView* subview in [fView subviews])
{
@@ -978,7 +978,7 @@ public:
RECT rectChild, rectParent;

if (fChildWindow != nullptr && GetWindowRect(fChildWindow, &rectChild))
setSize(rectChild.right - rectChild.left, rectChild.bottom - rectChild.top, false);
setSize(rectChild.right - rectChild.left, rectChild.bottom - rectChild.top, false, false);

if (fParentWindow != nullptr &&
GetWindowRect(fWindow, &rectChild) &&
@@ -1074,7 +1074,7 @@ public:
SetFocus(fWindow);
}

void setSize(const uint width, const uint height, const bool forceUpdate) override
void setSize(const uint width, const uint height, const bool forceUpdate, bool) override
{
CARLA_SAFE_ASSERT_RETURN(fWindow != nullptr,);



+ 1
- 1
source/utils/CarlaPluginUI.hpp View File

@@ -37,7 +37,7 @@ public:
virtual void hide() = 0;
virtual void focus() = 0;
virtual void idle() = 0;
virtual void setSize(uint with, uint height, bool forceUpdate) = 0;
virtual void setSize(uint with, uint height, bool forceUpdate, bool resizeChild) = 0;
virtual void setTitle(const char* title) = 0;
virtual void setChildWindow(void* ptr) = 0;
virtual void setTransientWinId(uintptr_t winId) = 0;


Loading…
Cancel
Save