From 6d21deb6e48627922fb223a4281ade46d6d230ec Mon Sep 17 00:00:00 2001 From: Nicolas Fella Date: Thu, 15 Dec 2022 00:56:11 +0100 Subject: [PATCH] Properly use X11 startup ids When one instance of Dolphin activates another it passes a startupId (X11) / activation token (wayland) along. On X11 this is passed using the DESKTOP_STARTUP_ID environment variable. The code tries to read that through KStartupInfo::startupId(). That doesn't work though, since Qt at startup reads the environment variable afterwards. However, it is nice enough to allow us to access it through QX11Info::nextStartupId(). Use that to read the token in the first instance and pass it to the second instance like we do on Wayland The user-facing impact of this is minimal since KStartupInfo::setNewStartupId internally falls back to KWindowSystem::forceActiveWindow when no startupId is passed. --- CMakeLists.txt | 8 ++++++++ src/CMakeLists.txt | 8 ++++++++ src/config-dolphin.h.cmake | 1 + src/dolphinmainwindow.cpp | 2 +- src/main.cpp | 12 ++++++++++++ 5 files changed, 30 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1df8c19a01..d5aa7b1129 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,6 +50,14 @@ find_package(Qt${QT_MAJOR_VERSION} ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS DBus ) +if (UNIX AND NOT APPLE) + set(HAVE_X11 TRUE) + + if (QT_MAJOR_VERSION STREQUAL "5") + find_package(Qt5X11Extras REQUIRED) + endif() +endif() + find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS KCMUtils NewStuff diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7642c5c674..2d7cba7900 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -471,6 +471,14 @@ target_link_libraries(dolphin KF5::Crash ) +if (HAVE_X11) + if (QT_MAJOR_VERSION STREQUAL "5") + target_link_libraries(dolphin PRIVATE Qt5::X11Extras) + else() + target_link_libraries(dolphin PRIVATE Qt::GuiPrivate) + endif() +endif() + include(DbusInterfaceMacros) generate_and_install_dbus_interface( diff --git a/src/config-dolphin.h.cmake b/src/config-dolphin.h.cmake index 61440cf3c3..af78c8622c 100644 --- a/src/config-dolphin.h.cmake +++ b/src/config-dolphin.h.cmake @@ -3,3 +3,4 @@ #cmakedefine01 HAVE_KUSERFEEDBACK #cmakedefine01 HAVE_PACKAGEKIT #cmakedefine01 HAVE_TERMINAL +#cmakedefine01 HAVE_X11 diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index e4aa16d5fa..f3ec70753c 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -289,7 +289,7 @@ void DolphinMainWindow::activateWindow(const QString &activationToken) if (KWindowSystem::isPlatformWayland()) { KWindowSystem::setCurrentXdgActivationToken(activationToken); } else { - KStartupInfo::setNewStartupId(window()->windowHandle(), KStartupInfo::startupId()); + KStartupInfo::setNewStartupId(window()->windowHandle(), activationToken.toUtf8()); } KWindowSystem::activateWindow(window()->windowHandle()); diff --git a/src/main.cpp b/src/main.cpp index a45083e400..a9b85dbcc8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -35,6 +35,14 @@ #include #include +#if HAVE_X11 +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +#include +#else +#include +#endif +#endif + #ifndef Q_OS_WIN #include #endif @@ -181,6 +189,10 @@ int main(int argc, char **argv) if (KWindowSystem::isPlatformWayland()) { token = qEnvironmentVariable("XDG_ACTIVATION_TOKEN"); qunsetenv("XDG_ACTIVATION_TOKEN"); + } else if (KWindowSystem::isPlatformX11()) { +#if HAVE_X11 + token = QX11Info::nextStartupId(); +#endif } if (Dolphin::attachToExistingInstance(urls, openFiles, splitView, QString(), token)) {