diff --git a/tray/application/main.cpp b/tray/application/main.cpp index c093264..9e57d73 100644 --- a/tray/application/main.cpp +++ b/tray/application/main.cpp @@ -49,19 +49,25 @@ void handleSystemdServiceError(const QString &context, const QString &name, cons } #endif -int initSyncthingTray(bool windowed, bool waitForTray, const char *connectionConfig) +int initSyncthingTray(bool windowed, bool waitForTray, const Argument &connectionConfigArg) { // get settings auto &settings = Settings::values(); - const auto connectionConfigQStr(connectionConfig ? QString::fromLocal8Bit(connectionConfig) : QString()); + static const auto defaultConnection = std::vector({""}); + const auto &connectionConfigurations = connectionConfigArg.isPresent() && !connectionConfigArg.values().empty() ? connectionConfigArg.values() : defaultConnection; // handle "windowed" case if (windowed) { + // launch Syncthing if configured settings.launcher.autostart(); - auto *const trayWidget = new TrayWidget(); - trayWidget->setAttribute(Qt::WA_DeleteOnClose); - trayWidget->show(); - trayWidget->applySettings(connectionConfigQStr); + + // show a window for each connection + for (const auto *const connectionConfig : connectionConfigurations) { + auto *const trayWidget = new TrayWidget(); + trayWidget->setAttribute(Qt::WA_DeleteOnClose); + trayWidget->show(); + trayWidget->applySettings(QString::fromLocal8Bit(connectionConfig)); + } return 0; } @@ -76,22 +82,28 @@ int initSyncthingTray(bool windowed, bool waitForTray, const char *connectionCon return -1; } - // show tray icon + // launch Syncthing if configured settings.launcher.autostart(); - auto *const trayIcon = new TrayIcon(connectionConfigQStr, QApplication::instance()); - trayIcon->show(); - if (!settings.firstLaunch) { - return 0; + + // show a tray icon for each connection + TrayWidget *widget; + for (const auto *const connectionConfig : connectionConfigurations) { + auto *const trayIcon = new TrayIcon(QString::fromLocal8Bit(connectionConfig), QApplication::instance()); + trayIcon->show(); + widget = &trayIcon->trayMenu().widget(); } // show "first launch" message box + if (!settings.firstLaunch) { + return 0; + } QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setText(QCoreApplication::translate("main", "You must configure how to connect to Syncthing when using Syncthing Tray the first time.")); msgBox.setInformativeText(QCoreApplication::translate( "main", "Note that the settings dialog allows importing URL, credentials and API-key from the local Syncthing configuration.")); msgBox.exec(); - trayIcon->trayMenu().widget().showSettingsDialog(); + widget->showSettingsDialog(); return 0; #else @@ -141,7 +153,8 @@ int runApplication(int argc, const char *const *argv) Argument waitForTrayArg("wait", '\0', "wait until the system tray becomes available instead of showing an error message if the system tray is not available on start-up"); waitForTrayArg.setCombinable(true); - ConfigValueArgument connectionArg("connection", '\0', "specifies the connection configuration to be used", { "config name" }); + ConfigValueArgument connectionArg("connection", '\0', "specifies one or more connection configurations to be used", { "config name" }); + connectionArg.setRequiredValueCount(Argument::varValueCount); Argument &widgetsGuiArg = qtConfigArgs.qtWidgetsGuiArg(); widgetsGuiArg.addSubArgument(&windowedArg); widgetsGuiArg.addSubArgument(&showWebUiArg); @@ -181,7 +194,7 @@ int runApplication(int argc, const char *const *argv) #endif // init Syncthing Tray and immediately shutdown on failure - if (const auto res = initSyncthingTray(windowedArg.isPresent(), waitForTrayArg.isPresent(), connectionArg.firstValue())) { + if (const auto res = initSyncthingTray(windowedArg.isPresent(), waitForTrayArg.isPresent(), connectionArg)) { shutdownSyncthingTray(); return res; } @@ -199,7 +212,7 @@ int runApplication(int argc, const char *const *argv) } // create new/additional tray icon - const auto res = initSyncthingTray(windowedArg.isPresent(), waitForTrayArg.isPresent(), connectionArg.firstValue()); + const auto res = initSyncthingTray(windowedArg.isPresent(), waitForTrayArg.isPresent(), connectionArg); if (!res) { trigger(triggerArg.isPresent(), showWebUiArg.isPresent()); } diff --git a/tray/gui/traywidget.cpp b/tray/gui/traywidget.cpp index 320c1ad..2fb3338 100644 --- a/tray/gui/traywidget.cpp +++ b/tray/gui/traywidget.cpp @@ -57,6 +57,7 @@ using namespace std; namespace QtGui { +std::unique_ptr TrayWidget::s_dialogParent; SettingsDialog *TrayWidget::s_settingsDlg = nullptr; QtUtilities::AboutDialog *TrayWidget::s_aboutDlg = nullptr; vector TrayWidget::s_instances; @@ -214,11 +215,11 @@ TrayWidget::~TrayWidget() void TrayWidget::showSettingsDialog() { - if (!m_dialogParent) { - m_dialogParent = make_unique(); + if (!s_dialogParent) { + s_dialogParent = make_unique(); } if (!s_settingsDlg) { - s_settingsDlg = new SettingsDialog(&m_connection, m_dialogParent.get()); + s_settingsDlg = new SettingsDialog(&m_connection, s_dialogParent.get()); connect(s_settingsDlg, &SettingsDialog::applied, &TrayWidget::applySettingsOnAllInstances); // save settings to disk when applied @@ -233,11 +234,11 @@ void TrayWidget::showSettingsDialog() void TrayWidget::showAboutDialog() { - if (!m_dialogParent) { - m_dialogParent = make_unique(); + if (!s_dialogParent) { + s_dialogParent = make_unique(); } if (!s_aboutDlg) { - s_aboutDlg = new AboutDialog(m_dialogParent.get(), QString(), + s_aboutDlg = new AboutDialog(s_dialogParent.get(), QString(), QStringLiteral( "

Developed by " APP_AUTHOR "
Fallback icons from KDE/Breeze project
Syncthing icons from Syncthing project
Using " diff --git a/tray/gui/traywidget.h b/tray/gui/traywidget.h index 2c6b13e..2be03b6 100644 --- a/tray/gui/traywidget.h +++ b/tray/gui/traywidget.h @@ -105,8 +105,8 @@ private Q_SLOTS: private: TrayMenu *m_menu; - std::unique_ptr m_dialogParent; std::unique_ptr m_ui; + static std::unique_ptr s_dialogParent; static SettingsDialog *s_settingsDlg; static QtUtilities::AboutDialog *s_aboutDlg; #ifndef SYNCTHINGWIDGETS_NO_WEBVIEW