From b16b52b40b48ebb4f2f388248d50f3d35900a3ce Mon Sep 17 00:00:00 2001
From: Nicolas Werner <nicolas.werner@hotmail.de>
Date: Mon, 20 Nov 2023 13:59:20 +0100
Subject: [PATCH] Support activation tokens for notifications

---
 src/notifications/Manager.h        |  1 +
 src/notifications/ManagerLinux.cpp | 15 +++++++++++++++
 src/notifications/ManagerMac.mm    |  2 ++
 src/notifications/ManagerWin.cpp   |  4 ++++
 4 files changed, 22 insertions(+)

diff --git a/src/notifications/Manager.h b/src/notifications/Manager.h
index 7686d78e9..fbebfcbac 100644
--- a/src/notifications/Manager.h
+++ b/src/notifications/Manager.h
@@ -101,6 +101,7 @@ private:
     // but Qt slot declarations can not be inside an ifdef!
 private slots:
     void actionInvoked(uint id, QString action);
+    void activationToken(uint id, QString action);
     void notificationClosed(uint id, uint reason);
     void notificationReplied(uint id, QString reply);
 
diff --git a/src/notifications/ManagerLinux.cpp b/src/notifications/ManagerLinux.cpp
index e838bb85b..b181fdc39 100644
--- a/src/notifications/ManagerLinux.cpp
+++ b/src/notifications/ManagerLinux.cpp
@@ -22,6 +22,7 @@
 
 #include "Cache.h"
 #include "EventAccessors.h"
+#include "Logging.h"
 #include "MxcImageProvider.h"
 #include "UserSettingsPage.h"
 #include "Utils.h"
@@ -58,6 +59,12 @@ NotificationsManager::NotificationsManager(QObject *parent)
                                           QStringLiteral("ActionInvoked"),
                                           this,
                                           SLOT(actionInvoked(uint,QString)));
+    QDBusConnection::sessionBus().connect(QStringLiteral("org.freedesktop.Notifications"),
+                                          QStringLiteral("/org/freedesktop/Notifications"),
+                                          QStringLiteral("org.freedesktop.Notifications"),
+                                          QStringLiteral("ActivationToken"),
+                                          this,
+                                          SLOT(activationToken(uint,QString)));
     QDBusConnection::sessionBus().connect(QStringLiteral("org.freedesktop.Notifications"),
                                           QStringLiteral("/org/freedesktop/Notifications"),
                                           QStringLiteral("org.freedesktop.Notifications"),
@@ -256,6 +263,14 @@ NotificationsManager::actionInvoked(uint id, QString action)
     }
 }
 
+// receive a wayland activation token from the notification manager
+void
+NotificationsManager::activationToken(uint, QString action)
+{
+    nhlog::net()->debug("Got activation token for notification");
+    qputenv("XDG_ACTIVATION_TOKEN", action.toUtf8());
+}
+
 void
 NotificationsManager::notificationReplied(uint id, QString reply)
 {
diff --git a/src/notifications/ManagerMac.mm b/src/notifications/ManagerMac.mm
index 69914ac63..06e6e55e2 100644
--- a/src/notifications/ManagerMac.mm
+++ b/src/notifications/ManagerMac.mm
@@ -182,6 +182,8 @@ void NotificationsManager::attachToMacNotifCenter()
 // unused
 void NotificationsManager::actionInvoked(uint, QString) { }
 
+void NotificationsManager::activationToken(uint, QString) { }
+
 void NotificationsManager::notificationReplied(uint, QString) { }
 
 void NotificationsManager::notificationClosed(uint, uint) { }
diff --git a/src/notifications/ManagerWin.cpp b/src/notifications/ManagerWin.cpp
index ce0143b0a..8d200abcf 100644
--- a/src/notifications/ManagerWin.cpp
+++ b/src/notifications/ManagerWin.cpp
@@ -95,6 +95,10 @@ void
 NotificationsManager::actionInvoked(uint, QString)
 {}
 
+void
+NotificationsManager::activationToken(uint, QString)
+{}
+
 void
 NotificationsManager::notificationReplied(uint, QString)
 {}
-- 
GitLab