Tray: Try to establish tray after 10s if failed initially #6518
authorChristian Kamm <mail@ckamm.de>
Wed, 6 Mar 2019 09:55:45 +0000 (10:55 +0100)
committerKevin Ottens <kevin.ottens@nextcloud.com>
Tue, 15 Dec 2020 09:58:43 +0000 (10:58 +0100)
When owncloud is started during desktop startup the tray may not yet
be running when the client starts. This will make the client attempt
to create a tray icon again after 10 seconds if there's no tray
during initial startup.

src/gui/application.cpp
src/gui/application.h
src/gui/main.cpp
src/gui/owncloudgui.cpp
src/gui/owncloudgui.h

index fed5c6388ef2f39c3a41d23a78eeae6a0959992a..63edc4b0068c0a51facdbafac3915f92f6e1a8c6 100644 (file)
@@ -804,6 +804,12 @@ void Application::openVirtualFile(const QString &filename)
     });
 }
 
+void Application::tryTrayAgain()
+{
+    qCInfo(lcApplication) << "Trying tray icon, tray available:" << QSystemTrayIcon::isSystemTrayAvailable();
+    _gui->hideAndShowTray();
+}
+
 bool Application::event(QEvent *event)
 {
 #ifdef Q_OS_MAC
index 72a9f1f4e30ba4e42ef3ab3ac23b604779412f4b..f6f84ee2d80e39253800d9b560419263e44bea74 100644 (file)
@@ -79,6 +79,9 @@ public slots:
      */
     void openVirtualFile(const QString &filename);
 
+    /// Attempt to show() the tray icon again. Used if no systray was available initially.
+    void tryTrayAgain();
+
 protected:
     void parseOptions(const QStringList &);
     void setupTranslations();
index dd030328a7a9cc5740d1e418fd41e775c2e73c90..e668da62b4ae6ce3dd7ee93a1f01de16942c59a2 100644 (file)
@@ -154,6 +154,7 @@ int main(int argc, char **argv)
         }
         return 0;
     }
+
     // We can't call isSystemTrayAvailable with appmenu-qt5 begause it hides the systemtray
     // (issue #4693)
     if (qgetenv("QT_QPA_PLATFORMTHEME") != "appmenu-qt5")
@@ -162,27 +163,36 @@ int main(int argc, char **argv)
             // If the systemtray is not there, we will wait one second for it to maybe start
             // (eg boot time) then we show the settings dialog if there is still no systemtray.
             // On XFCE however, we show a message box with explainaition how to install a systemtray.
+            qCInfo(lcApplication) << "System tray is not available, waiting...";
             Utility::sleep(1);
+
             auto desktopSession = qgetenv("XDG_CURRENT_DESKTOP").toLower();
             if (desktopSession.isEmpty()) {
                 desktopSession = qgetenv("DESKTOP_SESSION").toLower();
             }
             if (desktopSession == "xfce") {
                 int attempts = 0;
-                forever {
-                    if (!QSystemTrayIcon::isSystemTrayAvailable()) {
-                        Utility::sleep(1);
-                        attempts++;
-                        if (attempts < 30)
-                            continue;
-                    } else {
+                while (!QSystemTrayIcon::isSystemTrayAvailable()) {
+                    attempts++;
+                    if (attempts >= 30) {
+                        qCWarning(lcApplication) << "System tray unavailable (xfce)";
+                        warnSystray();
                         break;
                     }
-                    warnSystray();
+                    Utility::sleep(1);
                 }
             }
-            if (!app.backgroundMode() && !QSystemTrayIcon::isSystemTrayAvailable() && desktopSession != "ubuntu") {
-                app.showMainDialog();
+
+            if (QSystemTrayIcon::isSystemTrayAvailable()) {
+                app.tryTrayAgain();
+            } else if (!app.backgroundMode()) {
+                if (desktopSession != "ubuntu") {
+                    qCInfo(lcApplication) << "System tray still not available, showing window and trying again later";
+                    app.showMainDialog();
+                    QTimer::singleShot(10000, &app, &Application::tryTrayAgain);
+                } else {
+                    qCInfo(lcApplication) << "System tray still not available, but assuming it's fine on 'ubuntu' desktop";
+                }
             }
         }
     }
index cb86c70743570022118d7e312be8cb7d314f7db1..d650b96e48f3d3dc52dec8911b0424d713003e65 100644 (file)
@@ -367,6 +367,12 @@ void ownCloudGui::slotComputeOverallSyncStatus()
     }
 }
 
+void ownCloudGui::hideAndShowTray()
+{
+    _tray->hide();
+    _tray->show();
+}
+
 void ownCloudGui::slotShowTrayMessage(const QString &title, const QString &msg)
 {
     if (_tray)
index f0c34b0e786cfd4474ebc107f1e4f1809bfd377a..cd664e0a8075f9db2f86353a74fb806463a6b0b5 100644 (file)
@@ -65,6 +65,8 @@ public:
 #endif
     void createTray();
 
+    void hideAndShowTray();
+
 signals:
     void setupProxy();
     void serverError(int code, const QString &message);