]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Restrict attaching instances to those on the same activity or same virtual desktop
authorMéven Car <meven.car@kdemail.net>
Thu, 20 Apr 2023 08:50:40 +0000 (08:50 +0000)
committerMéven Car <meven.car@kdemail.net>
Thu, 20 Apr 2023 08:50:40 +0000 (08:50 +0000)
CCBUG: 408919

src/dolphinmainwindow.cpp
src/dolphinmainwindow.h
src/global.cpp

index 5061a10afcae788c6c8b9a5ceb94c76f0701bbdf..76b8ded6f5a7045f0f4f4464811c8ac0a34a539b 100644 (file)
@@ -277,6 +277,31 @@ void DolphinMainWindow::openFiles(const QStringList &files, bool splitView)
     openFiles(QUrl::fromStringList(files), splitView);
 }
 
+bool DolphinMainWindow::isOnCurrentDesktop() const
+{
+#if HAVE_X11
+    if (KWindowSystem::isPlatformX11()) {
+        const NET::Properties properties = NET::WMDesktop;
+        KWindowInfo info(this->winId(), properties);
+        return info.isOnCurrentDesktop();
+    }
+#endif
+    return true;
+}
+
+bool DolphinMainWindow::isOnActivity(const QString &activityId) const
+{
+#if HAVE_X11 && HAVE_KACTIVITIES
+    if (KWindowSystem::isPlatformX11()) {
+        const NET::Properties properties = NET::Supported;
+        const NET::Properties2 properties2 = NET::WM2Activities;
+        KWindowInfo info(this->winId(), properties, properties2);
+        return info.activities().contains(activityId);
+    }
+#endif
+    return true;
+}
+
 void DolphinMainWindow::activateWindow(const QString &activationToken)
 {
     window()->setAttribute(Qt::WA_NativeWindow, true);
index 2c68749665378cf6fb186da42d2d3162c1dac79b..fe07cbc1740f5038ccf3c755c995dc1b80488b53 100644 (file)
@@ -204,6 +204,9 @@ public Q_SLOTS:
     /** @see GeneralSettings::splitViewChanged() */
     void slotSplitViewChanged();
 
+    bool isOnActivity(const QString &activityId) const;
+    bool isOnCurrentDesktop() const;
+
 Q_SIGNALS:
     /**
      * Is sent if the selection of the currently active view has
index 554eb41fad8db76f454356222aadc46c85574027..8babbbddc05fae6e03b1d0437dc51aceb912a4d6 100644 (file)
@@ -16,6 +16,9 @@
 #include <KIO/ApplicationLauncherJob>
 #include <KService>
 #include <KWindowSystem>
+#ifdef HAVE_KACTIVITIES
+#include <KActivities/Consumer>
+#endif
 
 #include <QApplication>
 
@@ -140,13 +143,37 @@ bool Dolphin::attachToExistingInstance(const QList<QUrl> &inputUrls,
 
 QVector<QPair<QSharedPointer<OrgKdeDolphinMainWindowInterface>, QStringList>> Dolphin::dolphinGuiInstances(const QString &preferredService)
 {
+#ifdef HAVE_KACTIVITIES
+    static std::once_flag one_consumer;
+    static KActivities::Consumer *consumer;
+    std::call_once(one_consumer, []() {
+        consumer = new KActivities::Consumer();
+        // ensures the consumer is ready for query
+        QEventLoop loop;
+        QObject::connect(consumer, &KActivities::Consumer::serviceStatusChanged, &loop, &QEventLoop::quit);
+        loop.exec();
+    });
+#endif
+
     QVector<QPair<QSharedPointer<OrgKdeDolphinMainWindowInterface>, QStringList>> dolphinInterfaces;
-    if (!preferredService.isEmpty()) {
-        QSharedPointer<OrgKdeDolphinMainWindowInterface> preferredInterface(
-            new OrgKdeDolphinMainWindowInterface(preferredService, QStringLiteral("/dolphin/Dolphin_1"), QDBusConnection::sessionBus()));
-        if (preferredInterface->isValid() && !preferredInterface->lastError().isValid()) {
-            dolphinInterfaces.append(qMakePair(preferredInterface, QStringList()));
+    const auto tryAppendInterface = [&dolphinInterfaces](const QString &service) {
+        // Check if instance can handle our URLs
+        QSharedPointer<OrgKdeDolphinMainWindowInterface> interface(
+            new OrgKdeDolphinMainWindowInterface(service, QStringLiteral("/dolphin/Dolphin_1"), QDBusConnection::sessionBus()));
+        if (interface->isValid() && !interface->lastError().isValid()) {
+#ifdef HAVE_KACTIVITIES
+            const auto currentActivity = consumer->currentActivity();
+            if (currentActivity.isEmpty() || currentActivity == QStringLiteral("00000000-0000-0000-0000-000000000000")
+                || interface->isOnActivity(consumer->currentActivity()))
+#endif
+                if (interface->isOnCurrentDesktop()) {
+                    dolphinInterfaces.append(qMakePair(interface, QStringList()));
+                }
         }
+    };
+
+    if (!preferredService.isEmpty()) {
+        tryAppendInterface(preferredService);
     }
 
     // Look for dolphin instances among all available dbus services.
@@ -158,12 +185,7 @@ QVector<QPair<QSharedPointer<OrgKdeDolphinMainWindowInterface>, QStringList>> Do
     const QString myPid = QLatin1Char('-') + QString::number(QCoreApplication::applicationPid());
     for (const QString &service : dbusServices) {
         if (service.startsWith(pattern) && !service.endsWith(myPid)) {
-            // Check if instance can handle our URLs
-            QSharedPointer<OrgKdeDolphinMainWindowInterface> interface(
-                new OrgKdeDolphinMainWindowInterface(service, QStringLiteral("/dolphin/Dolphin_1"), QDBusConnection::sessionBus()));
-            if (interface->isValid() && !interface->lastError().isValid()) {
-                dolphinInterfaces.append(qMakePair(interface, QStringList()));
-            }
+            tryAppendInterface(service);
         }
     }