summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorNicolas Werner <nicolas.werner@hotmail.de>2023-11-20 02:38:58 +0100
committerNicolas Werner <nicolas.werner@hotmail.de>2023-11-20 02:56:42 +0100
commit8ea03e41e063314ea712f4b81db80c2a4cd85c2d (patch)
tree8b4b37014345cd4004d525adb942c8675c8b2730 /src
parentAutomatically increase database limits when hit (diff)
downloadnheko-8ea03e41e063314ea712f4b81db80c2a4cd85c2d.tar.xz
Switch to KDSingleApplication
Diffstat (limited to 'src')
-rw-r--r--src/main.cpp55
1 files changed, 31 insertions, 24 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 36326b13..e740b27a 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -20,6 +20,8 @@
 #include <QStandardPaths>
 #include <QTranslator>
 
+#include <kdsingleapplication.h>
+
 #include "Cache.h"
 #include "ChatPage.h"
 #include "Logging.h"
@@ -27,7 +29,6 @@
 #include "MatrixClient.h"
 #include "Utils.h"
 #include "config/nheko.h"
-#include "singleapplication.h"
 
 #if defined(Q_OS_MAC)
 #include "emoji/MacHelper.h"
@@ -196,14 +197,11 @@ main(int argc, char *argv[])
         }
     }
 
-    SingleApplication app(argc,
-                          argv,
-                          true,
-                          SingleApplication::Mode::User | SingleApplication::Mode::ExcludeAppPath |
-                            SingleApplication::Mode::ExcludeAppVersion |
-                            SingleApplication::Mode::SecondaryNotification,
-                          100,
-                          userdata == QLatin1String("default") ? QLatin1String("") : userdata);
+    QApplication app(argc, argv);
+
+    KDSingleApplication singleapp(
+      QStringLiteral("im.nheko.nheko-%1")
+        .arg(userdata == QLatin1String("default") ? QLatin1String("") : userdata));
 
     QCommandLineParser parser;
     parser.addHelpOption();
@@ -249,11 +247,19 @@ main(int argc, char *argv[])
 
     // This check needs to happen _after_ process(), so that we actually print help for --help when
     // Nheko is already running.
-    if (app.isSecondary()) {
-        std::cout << "Sending Matrix URL to main application: " << matrixUri.toStdString()
-                  << std::endl;
+    if (!singleapp.isPrimaryInstance()) {
+        std::cout << "Activating main app (instead of opening it a second time)." << std::endl;
         //  open uri in main instance
-        app.sendMessage(matrixUri.toUtf8());
+        //  TODO(Nico): Send also an activation token.
+        singleapp.sendMessage("activate");
+
+        if (!matrixUri.isEmpty()) {
+            std::cout << "Sending Matrix URL to main application: " << matrixUri.toStdString()
+                      << std::endl;
+            //  open uri in main instance
+            singleapp.sendMessage(matrixUri.toUtf8());
+        }
+
         return 0;
     }
 
@@ -384,27 +390,28 @@ main(int argc, char *argv[])
             nhlog::net()->debug("bye");
         }
     });
-    QObject::connect(&app, &SingleApplication::instanceStarted, &w, [&w]() {
-        w.show();
-        w.raise();
-        w.requestActivate();
-    });
 
     // It seems like handling the message in a blocking manner is a no-go. I have no idea how to
     // fix that, so just use a queued connection for now...  (ASAN does not cooperate and just
     // hides the crash D:)
     QObject::connect(
-      &app,
-      &SingleApplication::receivedMessage,
+      &singleapp,
+      &KDSingleApplication::messageReceived,
       ChatPage::instance(),
-      [&](quint32, QByteArray message) {
-          QString m = QString::fromUtf8(message);
-          ChatPage::instance()->handleMatrixUri(m);
+      [&](QByteArray message) {
+          if (message.isEmpty() || message.startsWith("activate")) {
+              w.show();
+              w.raise();
+              w.requestActivate();
+          } else {
+              QString m = QString::fromUtf8(message);
+              ChatPage::instance()->handleMatrixUri(m);
+          }
       },
       Qt::QueuedConnection);
 
     QMetaObject::Connection uriConnection;
-    if (app.isPrimary() && !matrixUri.isEmpty()) {
+    if (singleapp.isPrimaryInstance() && !matrixUri.isEmpty()) {
         uriConnection = QObject::connect(ChatPage::instance(),
                                          &ChatPage::contentLoaded,
                                          ChatPage::instance(),