From ac503776496e2ba21654c916e4984bba76d9a01e Mon Sep 17 00:00:00 2001
From: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com>
Date: Mon, 31 Aug 2020 15:57:10 -0400
Subject: [PATCH] mainview: implement systray icon and runguard

- adds a systray icon with and exit option when the app starts
- removes the systray icon when the app exits
- restores the app when a second instance is run

Change-Id: I81e4552bdf0ce76a520cbae90e519efff0b13495
---
 src/MainApplicationWindow.qml | 10 ++++++++++
 src/lrcinstance.h             |  1 +
 src/mainapplication.cpp       | 25 +++++++++++++++++++++++++
 src/runguard.cpp              |  7 ++++---
 4 files changed, 40 insertions(+), 3 deletions(-)

diff --git a/src/MainApplicationWindow.qml b/src/MainApplicationWindow.qml
index 784b13ef8..8f5901317 100644
--- a/src/MainApplicationWindow.qml
+++ b/src/MainApplicationWindow.qml
@@ -123,4 +123,14 @@ ApplicationWindow {
             duration: 500
         }
     }
+
+    Connections {
+        target: ClientWrapper.lrcInstance
+        onRestoreAppRequested: {
+            if (mainViewLoader.item)
+                mainViewLoader.item.show()
+            else
+                wizardView.show()
+        }
+    }
 }
diff --git a/src/lrcinstance.h b/src/lrcinstance.h
index 19d15e5f7..776c3a1f5 100644
--- a/src/lrcinstance.h
+++ b/src/lrcinstance.h
@@ -444,6 +444,7 @@ public:
 signals:
     void accountListChanged();
     void currentAccountChanged();
+    void restoreAppRequested();
 
 private:
     LRCInstance(migrateCallback willMigrateCb = {}, migrateCallback didMigrateCb = {})
diff --git a/src/mainapplication.cpp b/src/mainapplication.cpp
index c6087be04..d3d6a68b5 100644
--- a/src/mainapplication.cpp
+++ b/src/mainapplication.cpp
@@ -58,7 +58,9 @@
 #include "videoformatresolutionmodel.h"
 #include "videoinputdevicemodel.h"
 
+#include <QAction>
 #include <QFontDatabase>
+#include <QMenu>
 #include <QQmlContext>
 #include <QtWebEngine>
 
@@ -455,5 +457,28 @@ MainApplication::applicationSetup()
      */
     qmlInitialization();
 
+    /*
+     * Systray menu.
+     */
+    GlobalSystemTray& sysIcon = GlobalSystemTray::instance();
+    sysIcon.setIcon(QIcon(":images/jami.png"));
+
+    QMenu* systrayMenu = new QMenu();
+
+    QAction* exitAction = new QAction(tr("Exit"), this);
+    connect(exitAction, &QAction::triggered,
+            [this] {
+                QCoreApplication::exit();
+            });
+
+     connect(&sysIcon, &QSystemTrayIcon::activated,
+             [this](QSystemTrayIcon::ActivationReason reason) {
+                 emit LRCInstance::instance().restoreAppRequested();
+             });
+
+    systrayMenu->addAction(exitAction);
+    sysIcon.setContextMenu(systrayMenu);
+    sysIcon.show();
+
     return true;
 }
diff --git a/src/runguard.cpp b/src/runguard.cpp
index 4d22959d2..b3c126edc 100644
--- a/src/runguard.cpp
+++ b/src/runguard.cpp
@@ -18,6 +18,9 @@
 // Based on: https://stackoverflow.com/a/28172162
 
 #include "runguard.h"
+
+#include "lrcinstance.h"
+
 #include <QCryptographicHash>
 
 namespace {
@@ -52,9 +55,7 @@ RunGuard::~RunGuard()
 void
 RunGuard::tryRestorePrimaryInstance()
 {
-    /*
-     * TODO: relaunch application
-     */
+    emit LRCInstance::instance().restoreAppRequested();
 }
 
 bool
-- 
GitLab