From bb8f4cc3a7ae321ea84235e137a15ff578bc5015 Mon Sep 17 00:00:00 2001
From: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com>
Date: Fri, 24 Nov 2023 12:01:19 -0500
Subject: [PATCH] systray: fix crash on linux

QSystemTray::setContextMenu isn't working using a QScopedPointer on GNU/Linux, don't know why, not investigating.
Also, resetting the contextMenu has different behaviour on different platforms, so avoid that.

Change-Id: I3464e4c5e410a2c7028555b8177e0e56f7c5d1c3
---
 src/app/mainapplication.cpp | 31 +++++++++++++++++--------------
 src/app/mainapplication.h   |  3 ---
 2 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/src/app/mainapplication.cpp b/src/app/mainapplication.cpp
index 118f3e56f..e10e877d7 100644
--- a/src/app/mainapplication.cpp
+++ b/src/app/mainapplication.cpp
@@ -371,8 +371,13 @@ MainApplication::initSystray()
 {
     systemTray_->setIcon(QIcon(":/images/jami.svg"));
 
-    // Create a new menu
-    systemTrayMenu_.reset(new QMenu);
+    QMenu* menu {nullptr};
+    // If there was a previous menu, reuse it, otherwise create a new one.
+    if ((menu = systemTray_->contextMenu())) {
+        menu->clear();
+    } else {
+        menu = new QMenu;
+    }
 
     QString quitString;
 #ifdef Q_OS_WINDOWS
@@ -381,10 +386,10 @@ MainApplication::initSystray()
     quitString = tr("&Quit");
 #endif
 
-    QAction* quitAction = new QAction(quitString, systemTrayMenu_.get());
+    QAction* quitAction = new QAction(quitString, this);
     connect(quitAction, &QAction::triggered, this, &MainApplication::closeRequested);
 
-    QAction* restoreAction = new QAction(tr("&Show Jami"), systemTrayMenu_.get());
+    QAction* restoreAction = new QAction(tr("&Show Jami"), this);
     connect(restoreAction, &QAction::triggered, this, &MainApplication::restoreApp);
 
     connect(systemTray_,
@@ -395,20 +400,18 @@ MainApplication::initSystray()
 #ifdef Q_OS_WINDOWS
                     restoreApp();
 #elif !defined(Q_OS_MACOS)
-                QWindow* window = focusWindow();
-                if (window)
-                    window->close();
-                else
-                    restoreApp();
+                    QWindow* window = focusWindow();
+                    if (window)
+                        window->close();
+                    else
+                        restoreApp();
 #endif
                 }
             });
 
-    systemTrayMenu_->addAction(restoreAction);
-    systemTrayMenu_->addAction(quitAction);
-
-    // Set the new menu as the context menu
-    systemTray_->setContextMenu(systemTrayMenu_.get());
+    menu->addAction(restoreAction);
+    menu->addAction(quitAction);
+    systemTray_->setContextMenu(menu);
 
     systemTray_->show();
 }
diff --git a/src/app/mainapplication.h b/src/app/mainapplication.h
index a9625a33a..8f0f9952b 100644
--- a/src/app/mainapplication.h
+++ b/src/app/mainapplication.h
@@ -124,8 +124,5 @@ private:
 
     ScreenInfo screenInfo_;
 
-    // We will recreate the system tray menu when the user changes the language.
-    QScopedPointer<QMenu> systemTrayMenu_;
-
     bool isCleanupped;
 };
-- 
GitLab