Browse Source

Try to set transient hint via pid too

tags/1.9.4
falkTX 11 years ago
parent
commit
5d466f1b56
5 changed files with 56 additions and 19 deletions
  1. +7
    -0
      source/backend/plugin/CarlaPluginThread.cpp
  2. +2
    -0
      source/backend/plugin/CarlaPluginThread.hpp
  3. +45
    -17
      source/backend/plugin/CarlaPluginUi.cpp
  4. +1
    -1
      source/backend/plugin/CarlaPluginUi.hpp
  5. +1
    -1
      source/backend/plugin/DssiPlugin.cpp

+ 7
- 0
source/backend/plugin/CarlaPluginThread.cpp View File

@@ -83,6 +83,13 @@ void CarlaPluginThread::setOscData(const char* const binary, const char* const l
fExtra2 = extra2;
}

ulong CarlaPluginThread::getPid() const
{
CARLA_SAFE_ASSERT_RETURN(fProcess != nullptr, 0);

return (ulong)fProcess->pid();
}

void CarlaPluginThread::run()
{
carla_debug("CarlaPluginThread::run()");


+ 2
- 0
source/backend/plugin/CarlaPluginThread.hpp View File

@@ -48,6 +48,8 @@ public:
void setMode(const CarlaPluginThread::Mode mode);
void setOscData(const char* const binary, const char* const label, const char* const extra1="", const char* const extra2="");

ulong getPid() const;

protected:
void run() override;



+ 45
- 17
source/backend/plugin/CarlaPluginUi.cpp View File

@@ -135,10 +135,10 @@ public:
carla_zeroStruct<XSizeHints>(sizeHints);

sizeHints.flags = PMinSize|PMaxSize;
sizeHints.min_width = width;
sizeHints.min_height = height;
sizeHints.max_width = width;
sizeHints.max_height = height;
sizeHints.min_width = static_cast<int>(width);
sizeHints.min_height = static_cast<int>(height);
sizeHints.max_width = static_cast<int>(width);
sizeHints.max_height = static_cast<int>(height);
XSetNormalHints(fDisplay, fWindow, &sizeHints);

if (forceUpdate)
@@ -174,8 +174,9 @@ private:

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

bool CarlaPluginUi::tryTransientWinIdMatch(const char* const uiTitle, const uintptr_t winId)
bool CarlaPluginUi::tryTransientWinIdMatch(const ulong pid, const char* const uiTitle, const uintptr_t winId)
{
CARLA_SAFE_ASSERT_RETURN(pid != 0, true);
CARLA_SAFE_ASSERT_RETURN(uiTitle != nullptr && uiTitle[0] != '\0', true);
CARLA_SAFE_ASSERT_RETURN(winId != 0, true);

@@ -197,8 +198,9 @@ bool CarlaPluginUi::tryTransientWinIdMatch(const char* const uiTitle, const uint
CARLA_SAFE_ASSERT_RETURN(sd.display != nullptr, true);

Atom _ncl = XInternAtom(sd.display, "_NET_CLIENT_LIST" , True);
Atom _nwn = XInternAtom(sd.display, "_NET_WM_NAME", False);
Atom utf8 = XInternAtom(sd.display, "UTF8_STRING", False);
Atom _nwn = XInternAtom(sd.display, "_NET_WM_NAME", True);
Atom _nwp = XInternAtom(sd.display, "_NET_WM_PID", True);
Atom utf8 = XInternAtom(sd.display, "UTF8_STRING", True);

Atom actualType;
int actualFormat;
@@ -222,23 +224,49 @@ bool CarlaPluginUi::tryTransientWinIdMatch(const char* const uiTitle, const uint
const Window window(windows[i]);
CARLA_SAFE_ASSERT_CONTINUE(window != 0);

// ------------------------------------------------
// try using pid

unsigned long pidSize;
unsigned char* pidData = nullptr;

status = XGetWindowProperty(sd.display, window, _nwp, 0L, (~0L), False, XA_CARDINAL, &actualType, &actualFormat, &pidSize, &bytesAfter, &pidData);

if (pidData != nullptr)
{
const ScopedFreeData sfd2(pidData);

CARLA_SAFE_ASSERT_CONTINUE(status == Success);
CARLA_SAFE_ASSERT_CONTINUE(pidSize != 0);

if (*(ulong*)pidData == pid)
{
CARLA_SAFE_ASSERT_RETURN(lastGoodWindow == window || lastGoodWindow == 0, true);
lastGoodWindow = window;
carla_stdout("Match found using pid");
}
}
// ------------------------------------------------
// try using name

unsigned long nameSize;
unsigned char* nameData = nullptr;

status = XGetWindowProperty(sd.display, window, _nwn, 0L, (~0L), False, utf8, &actualType, &actualFormat, &nameSize, &bytesAfter, &nameData);

if (nameData == nullptr)
continue;

const ScopedFreeData sfd2(nameData);
if (nameData != nullptr)
{
const ScopedFreeData sfd2(nameData);

CARLA_SAFE_ASSERT_CONTINUE(status == Success);
CARLA_SAFE_ASSERT_CONTINUE(nameSize != 0);
CARLA_SAFE_ASSERT_CONTINUE(status == Success);
CARLA_SAFE_ASSERT_CONTINUE(nameSize != 0);

if (std::strcmp((const char*)nameData, uiTitle) == 0)
{
CARLA_SAFE_ASSERT_RETURN(lastGoodWindow == 0, true);
lastGoodWindow = window;
if (std::strcmp((const char*)nameData, uiTitle) == 0)
{
CARLA_SAFE_ASSERT_RETURN(lastGoodWindow == window || lastGoodWindow == 0, true);
lastGoodWindow = window;
carla_stdout("Match found using name");
}
}
}



+ 1
- 1
source/backend/plugin/CarlaPluginUi.hpp View File

@@ -41,7 +41,7 @@ public:
virtual void setTransientWinId(const uintptr_t winId) = 0;
virtual void* getPtr() const noexcept = 0;

static bool tryTransientWinIdMatch(const char* const uiTitle, const uintptr_t winId);
static bool tryTransientWinIdMatch(const ulong pid, const char* const uiTitle, const uintptr_t winId);

#ifdef CARLA_OS_MAC
static CarlaPluginUi* newCocoa(CloseCallback*);


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

@@ -408,7 +408,7 @@ public:
carla_stdout("Trying to get window...");

QString uiTitle(QString("%1 (GUI)").arg(pData->name));
if (CarlaPluginUi::tryTransientWinIdMatch(uiTitle.toUtf8().constData(), carla_standalone_get_transient_win_id()))
if (CarlaPluginUi::tryTransientWinIdMatch(pData->osc.thread.getPid(), uiTitle.toUtf8().constData(), carla_standalone_get_transient_win_id()))
fTransientTryCounter = 0;
}



Loading…
Cancel
Save