From 5d466f1b565d8bf63bc395ad138c5a9ad50ec2ba Mon Sep 17 00:00:00 2001 From: falkTX Date: Fri, 31 Jan 2014 11:37:25 +0000 Subject: [PATCH] Try to set transient hint via pid too --- source/backend/plugin/CarlaPluginThread.cpp | 7 +++ source/backend/plugin/CarlaPluginThread.hpp | 2 + source/backend/plugin/CarlaPluginUi.cpp | 62 +++++++++++++++------ source/backend/plugin/CarlaPluginUi.hpp | 2 +- source/backend/plugin/DssiPlugin.cpp | 2 +- 5 files changed, 56 insertions(+), 19 deletions(-) diff --git a/source/backend/plugin/CarlaPluginThread.cpp b/source/backend/plugin/CarlaPluginThread.cpp index e13397f7a..2f78da608 100644 --- a/source/backend/plugin/CarlaPluginThread.cpp +++ b/source/backend/plugin/CarlaPluginThread.cpp @@ -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()"); diff --git a/source/backend/plugin/CarlaPluginThread.hpp b/source/backend/plugin/CarlaPluginThread.hpp index fac3cd941..79565f6bb 100644 --- a/source/backend/plugin/CarlaPluginThread.hpp +++ b/source/backend/plugin/CarlaPluginThread.hpp @@ -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; diff --git a/source/backend/plugin/CarlaPluginUi.cpp b/source/backend/plugin/CarlaPluginUi.cpp index 7ee605842..44461c083 100644 --- a/source/backend/plugin/CarlaPluginUi.cpp +++ b/source/backend/plugin/CarlaPluginUi.cpp @@ -135,10 +135,10 @@ public: carla_zeroStruct(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(width); + sizeHints.min_height = static_cast(height); + sizeHints.max_width = static_cast(width); + sizeHints.max_height = static_cast(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"); + } } } diff --git a/source/backend/plugin/CarlaPluginUi.hpp b/source/backend/plugin/CarlaPluginUi.hpp index 9b14ce0c4..29bb3ad76 100644 --- a/source/backend/plugin/CarlaPluginUi.hpp +++ b/source/backend/plugin/CarlaPluginUi.hpp @@ -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*); diff --git a/source/backend/plugin/DssiPlugin.cpp b/source/backend/plugin/DssiPlugin.cpp index a72522f64..7b482f781 100644 --- a/source/backend/plugin/DssiPlugin.cpp +++ b/source/backend/plugin/DssiPlugin.cpp @@ -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; }