From: Christian Kamm Date: Wed, 6 Mar 2019 09:55:45 +0000 (+0100) Subject: Tray: Try to establish tray after 10s if failed initially #6518 X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~12^2~21^2~468^2~277 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=2f7cdb81cf2ac5db78190ed0a2f72952ea526d74;p=nextcloud-desktop.git Tray: Try to establish tray after 10s if failed initially #6518 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. --- diff --git a/src/gui/application.cpp b/src/gui/application.cpp index fed5c6388..63edc4b00 100644 --- a/src/gui/application.cpp +++ b/src/gui/application.cpp @@ -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 diff --git a/src/gui/application.h b/src/gui/application.h index 72a9f1f4e..f6f84ee2d 100644 --- a/src/gui/application.h +++ b/src/gui/application.h @@ -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(); diff --git a/src/gui/main.cpp b/src/gui/main.cpp index dd030328a..e668da62b 100644 --- a/src/gui/main.cpp +++ b/src/gui/main.cpp @@ -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"; + } } } } diff --git a/src/gui/owncloudgui.cpp b/src/gui/owncloudgui.cpp index cb86c7074..d650b96e4 100644 --- a/src/gui/owncloudgui.cpp +++ b/src/gui/owncloudgui.cpp @@ -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) diff --git a/src/gui/owncloudgui.h b/src/gui/owncloudgui.h index f0c34b0e7..cd664e0a8 100644 --- a/src/gui/owncloudgui.h +++ b/src/gui/owncloudgui.h @@ -65,6 +65,8 @@ public: #endif void createTray(); + void hideAndShowTray(); + signals: void setupProxy(); void serverError(int code, const QString &message);