]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Properly use X11 startup ids
authorNicolas Fella <nicolas.fella@gmx.de>
Wed, 14 Dec 2022 23:56:11 +0000 (00:56 +0100)
committerNicolas Fella <nicolas.fella@gmx.de>
Fri, 30 Dec 2022 12:33:01 +0000 (12:33 +0000)
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
src/CMakeLists.txt
src/config-dolphin.h.cmake
src/dolphinmainwindow.cpp
src/main.cpp

index 1df8c19a01a0f24e48058de619924850c1d8211b..d5aa7b112999b5b57984937ac03a2ec2fcd24534 100644 (file)
@@ -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
index 7642c5c674e26a6c79f644c95b68ed68dc998671..2d7cba7900e822642f9ee021231218a1805a2d2f 100644 (file)
@@ -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(
index 61440cf3c3f4d70d11fc55fd64e8f0c96314e562..af78c8622c6beef1a49643ade7006e44e3adcfa4 100644 (file)
@@ -3,3 +3,4 @@
 #cmakedefine01 HAVE_KUSERFEEDBACK
 #cmakedefine01 HAVE_PACKAGEKIT
 #cmakedefine01 HAVE_TERMINAL
+#cmakedefine01 HAVE_X11
index e4aa16d5fae8f809de810fb590770aa04dd1c05d..f3ec70753ca4f502b10fda1a3ea2915602cbd460 100644 (file)
@@ -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());
index a45083e400e434019321d1685db024e07c4a304a..a9b85dbcc8971ea82fc292a67ba8ea5e44f87c2a 100644 (file)
 #include <QDBusConnectionInterface>
 #include <QSessionManager>
 
+#if HAVE_X11
+#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
+#include <private/qtx11extras_p.h>
+#else
+#include <QX11Info>
+#endif
+#endif
+
 #ifndef Q_OS_WIN
 #include <unistd.h>
 #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)) {