From 1d7d10a12dd75d2037caec5c59efb68bab862df6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Blin?=
 <sebastien.blin@savoirfairelinux.com>
Date: Wed, 22 Nov 2023 15:42:20 -0500
Subject: [PATCH] mainapplication: retranslate systray

Change-Id: Ib8e7407fa702f4003b33b688fa0dca517ff9a7fd
GitLab: #1396
---
 src/app/mainapplication.cpp | 40 +++++++++++++++++++++++++------------
 src/app/mainapplication.h   |  3 +++
 2 files changed, 30 insertions(+), 13 deletions(-)

diff --git a/src/app/mainapplication.cpp b/src/app/mainapplication.cpp
index d94b0f27c..118f3e56f 100644
--- a/src/app/mainapplication.cpp
+++ b/src/app/mainapplication.cpp
@@ -105,7 +105,8 @@ ScreenInfo::onPhysicalDotsPerInchChanged()
 }
 
 MainApplication::MainApplication(int& argc, char** argv)
-    : QApplication(argc, argv), isCleanupped(false)
+    : QApplication(argc, argv)
+    , isCleanupped(false)
 {
     const char* qtVersion = qVersion();
     qInfo() << "Using Qt runtime version:" << qtVersion;
@@ -134,10 +135,19 @@ MainApplication::init()
     settingsManager_ = new AppSettingsManager(this);
     systemTray_ = new SystemTray(settingsManager_, this);
 
+    // These should should be QueuedConnection to ensure that the
+    // they are executed after the QML engine has been initialized,
+    // and after the QSystemTrayIcon has been created and shown.
     QObject::connect(settingsManager_,
                      &AppSettingsManager::retranslate,
                      engine_.get(),
-                     &QQmlApplicationEngine::retranslate);
+                     &QQmlApplicationEngine::retranslate,
+                     Qt::QueuedConnection);
+    QObject::connect(settingsManager_,
+                     &AppSettingsManager::retranslate,
+                     this,
+                     &MainApplication::initSystray,
+                     Qt::QueuedConnection);
 
     setWindowIcon(QIcon(":/images/jami.ico"));
 
@@ -361,7 +371,8 @@ MainApplication::initSystray()
 {
     systemTray_->setIcon(QIcon(":/images/jami.svg"));
 
-    QMenu* systrayMenu = new QMenu();
+    // Create a new menu
+    systemTrayMenu_.reset(new QMenu);
 
     QString quitString;
 #ifdef Q_OS_WINDOWS
@@ -370,10 +381,10 @@ MainApplication::initSystray()
     quitString = tr("&Quit");
 #endif
 
-    QAction* quitAction = new QAction(quitString, this);
+    QAction* quitAction = new QAction(quitString, systemTrayMenu_.get());
     connect(quitAction, &QAction::triggered, this, &MainApplication::closeRequested);
 
-    QAction* restoreAction = new QAction(tr("&Show Jami"), this);
+    QAction* restoreAction = new QAction(tr("&Show Jami"), systemTrayMenu_.get());
     connect(restoreAction, &QAction::triggered, this, &MainApplication::restoreApp);
 
     connect(systemTray_,
@@ -384,18 +395,21 @@ 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
                 }
             });
 
-    systrayMenu->addAction(restoreAction);
-    systrayMenu->addAction(quitAction);
-    systemTray_->setContextMenu(systrayMenu);
+    systemTrayMenu_->addAction(restoreAction);
+    systemTrayMenu_->addAction(quitAction);
+
+    // Set the new menu as the context menu
+    systemTray_->setContextMenu(systemTrayMenu_.get());
+
     systemTray_->show();
 }
 
diff --git a/src/app/mainapplication.h b/src/app/mainapplication.h
index 8f0f9952b..a9625a33a 100644
--- a/src/app/mainapplication.h
+++ b/src/app/mainapplication.h
@@ -124,5 +124,8 @@ private:
 
     ScreenInfo screenInfo_;
 
+    // We will recreate the system tray menu when the user changes the language.
+    QScopedPointer<QMenu> systemTrayMenu_;
+
     bool isCleanupped;
 };
-- 
GitLab