Browse Source

Implement transient windows (out of process) for win32

tags/1.9.8
falkTX 8 years ago
parent
commit
ca5df4f151
6 changed files with 41 additions and 21 deletions
  1. +5
    -1
      source/backend/plugin/CarlaPlugin.cpp
  2. +1
    -0
      source/backend/plugin/CarlaPluginInternal.cpp
  3. +1
    -0
      source/backend/plugin/CarlaPluginInternal.hpp
  4. +1
    -2
      source/bridges-ui/CarlaBridgeToolkitNative.cpp
  5. +0
    -16
      source/modules/dgl/src/Window.cpp
  6. +33
    -2
      source/utils/CarlaPluginUI.cpp

+ 5
- 1
source/backend/plugin/CarlaPlugin.cpp View File

@@ -2210,8 +2210,12 @@ void CarlaPlugin::uiIdle()
CarlaString uiTitle(pData->name);
uiTitle += " (GUI)";

if (CarlaPluginUI::tryTransientWinIdMatch(getUiBridgeProcessId(), uiTitle, pData->engine->getOptions().frontendWinId, true))
if (CarlaPluginUI::tryTransientWinIdMatch(getUiBridgeProcessId(), uiTitle,
pData->engine->getOptions().frontendWinId, pData->transientFirstTry))
{
pData->transientTryCounter = 0;
pData->transientFirstTry = false;
}
}

void CarlaPlugin::uiParameterChange(const uint32_t index, const float value) noexcept


+ 1
- 0
source/backend/plugin/CarlaPluginInternal.cpp View File

@@ -592,6 +592,7 @@ CarlaPlugin::ProtectedData::ProtectedData(CarlaEngine* const eng, const uint idx
ctrlChannel(0),
extraHints(0x0),
transientTryCounter(0),
transientFirstTry(true),
name(nullptr),
filename(nullptr),
iconName(nullptr),


+ 1
- 0
source/backend/plugin/CarlaPluginInternal.hpp View File

@@ -228,6 +228,7 @@ struct CarlaPlugin::ProtectedData {
int8_t ctrlChannel;
uint extraHints;
uint transientTryCounter;
bool transientFirstTry;

// data 1
const char* name;


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

@@ -68,8 +68,7 @@ public:

fHostUI->setTitle(options.windowTitle.buffer());

#ifdef HAVE_X11
// Out-of-process reparenting only possible on X11
#if (defined(CARLA_OS_WIN) && defined(BRIDGE_HWND)) || (defined(HAVE_X11) && defined(BRIDGE_X11))
if (options.transientWindowId != 0)
{
fHostUI->setTransientWinId(options.transientWindowId);


+ 0
- 16
source/modules/dgl/src/Window.cpp View File

@@ -346,22 +346,6 @@ struct Window::PrivateData {
fModal.enabled = true;
fModal.parent->fModal.childFocus = this;

#ifdef DISTRHO_OS_WINDOWS
// Center this window
PuglInternals* const parentImpl = fModal.parent->fView->impl;

RECT curRect;
RECT parentRect;
GetWindowRect(hwnd, &curRect);
GetWindowRect(parentImpl->hwnd, &parentRect);

int x = parentRect.left+(parentRect.right-curRect.right)/2;
int y = parentRect.top +(parentRect.bottom-curRect.bottom)/2;

SetWindowPos(hwnd, 0, x, y, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);
UpdateWindow(hwnd);
#endif

fModal.parent->setVisible(true);
setVisible(true);



+ 33
- 2
source/utils/CarlaPluginUI.cpp View File

@@ -1046,10 +1046,41 @@ bool CarlaPluginUI::tryTransientWinIdMatch(const uintptr_t pid, const char* cons

XFlush(sd.display);
return true;
#else
#endif

#ifdef CARLA_OS_MAC
// TODO
#endif

#ifdef CARLA_OS_WIN
if (HWND const childWindow = FindWindowA(nullptr, uiTitle))
{
HWND const parentWindow = (HWND)winId;
SetWindowLongPtr(childWindow, GWLP_HWNDPARENT, (LONG_PTR)parentWindow);

if (centerUI)
{
RECT rectChild, rectParent;

if (GetWindowRect(childWindow, &rectChild) && GetWindowRect(parentWindow, &rectParent))
{
SetWindowPos(childWindow, parentWindow,
rectParent.left + (rectChild.right-rectChild.left)/2,
rectParent.top + (rectChild.bottom-rectChild.top)/2,
0, 0, SWP_NOSIZE);
}
}

carla_stdout("Match found using window name");
return true;
}

return false;
#endif

// fallback, may be unused
return true;
(void)pid; (void)centerUI;
#endif
}

// -----------------------------------------------------


Loading…
Cancel
Save