diff --git a/connector/syncthingnotifier.cpp b/connector/syncthingnotifier.cpp index ce60fbe..54063ec 100644 --- a/connector/syncthingnotifier.cpp +++ b/connector/syncthingnotifier.cpp @@ -33,6 +33,7 @@ SyncthingNotifier::SyncthingNotifier(const SyncthingConnection &connection, QObj #endif , m_process(SyncthingProcess::mainInstance()) , m_enabledNotifications(SyncthingHighLevelNotification::None) + , m_consideredIntegrations(SyncthingStartupIntegration::None) , m_previousStatus(SyncthingStatus::Disconnected) , m_ignoreInavailabilityAfterStart(15) , m_initialized(false) @@ -132,20 +133,20 @@ bool SyncthingNotifier::isDisconnectRelevant() const } // consider process/launcher or systemd unit status - if (m_process && m_process->isManuallyStopped()) { + if ((m_consideredIntegrations & SyncthingStartupIntegration::Process) && m_process && m_process->isManuallyStopped()) { return false; } #ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD - if (m_service && m_service->isManuallyStopped()) { + if ((m_consideredIntegrations & SyncthingStartupIntegration::Service) && m_service && m_service->isManuallyStopped()) { return false; } #endif // ignore inavailability after start or standby-wakeup if (m_ignoreInavailabilityAfterStart) { - if ((m_process && m_process->isRunning()) + if (((m_consideredIntegrations & SyncthingStartupIntegration::Process) && m_process && m_process->isRunning()) #ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD - && ((m_service && m_service->isSystemdAvailable() + && (((m_consideredIntegrations & SyncthingStartupIntegration::Service) && m_service && m_service->isSystemdAvailable() && !m_service->isActiveWithoutSleepFor(m_process->activeSince(), m_ignoreInavailabilityAfterStart)) || !m_process->isActiveFor(m_ignoreInavailabilityAfterStart)) #else @@ -155,7 +156,8 @@ bool SyncthingNotifier::isDisconnectRelevant() const return false; } #ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD - if (m_service && m_service->isRunning() && !m_service->isActiveWithoutSleepFor(m_ignoreInavailabilityAfterStart)) { + if ((m_consideredIntegrations & SyncthingStartupIntegration::Service) && m_service && m_service->isRunning() + && !m_service->isActiveWithoutSleepFor(m_ignoreInavailabilityAfterStart)) { return false; } #endif diff --git a/connector/syncthingnotifier.h b/connector/syncthingnotifier.h index 370ac32..b49e9dd 100644 --- a/connector/syncthingnotifier.h +++ b/connector/syncthingnotifier.h @@ -41,9 +41,20 @@ enum class SyncthingHighLevelNotification { SyncthingProcessError = (1 << 5), }; +/*! + * \brief The SyncthingStartupIntegration enum specifies one or more startup integrations for Syncthing. + * \remarks The enum is supposed to be used as flag-enum. + */ +enum class SyncthingStartupIntegration { + None = 0, + Process = (1 << 0), + Service = (1 << 1), +}; + class LIB_SYNCTHING_CONNECTOR_EXPORT SyncthingNotifier : public QObject { Q_OBJECT Q_PROPERTY(SyncthingHighLevelNotification enabledNotifications READ enabledNotifications WRITE setEnabledNotifications) + Q_PROPERTY(SyncthingStartupIntegration consideredIntegrations READ consideredIntegrations WRITE setConsideredIntegrations) Q_PROPERTY(bool ignoreInavailabilityAfterStart READ ignoreInavailabilityAfterStart WRITE setIgnoreInavailabilityAfterStart) #ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD Q_PROPERTY(const SyncthingService *service READ service WRITE setService) @@ -51,10 +62,11 @@ class LIB_SYNCTHING_CONNECTOR_EXPORT SyncthingNotifier : public QObject { Q_PROPERTY(const SyncthingProcess *process READ process WRITE setProcess) public: - SyncthingNotifier(const SyncthingConnection &connection, QObject *parent = nullptr); + explicit SyncthingNotifier(const SyncthingConnection &connection, QObject *parent = nullptr); const SyncthingConnection &connection() const; SyncthingHighLevelNotification enabledNotifications() const; + SyncthingStartupIntegration consideredIntegrations() const; unsigned int ignoreInavailabilityAfterStart() const; #ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD const SyncthingService *service() const; @@ -63,6 +75,7 @@ public: public Q_SLOTS: void setEnabledNotifications(SyncthingHighLevelNotification enabledNotifications); + void setConsideredIntegrations(SyncthingStartupIntegration consideredIntegrations); void setIgnoreInavailabilityAfterStart(unsigned int seconds); #ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD void setService(const SyncthingService *service); @@ -103,6 +116,7 @@ private: #endif const SyncthingProcess *m_process; SyncthingHighLevelNotification m_enabledNotifications; + SyncthingStartupIntegration m_consideredIntegrations; SyncthingStatus m_previousStatus; unsigned int m_ignoreInavailabilityAfterStart; bool m_initialized; @@ -125,6 +139,14 @@ inline SyncthingHighLevelNotification SyncthingNotifier::enabledNotifications() } /*! + * \brief Returns which startup integrations are considered for filtering notifications (by default none). + */ +inline SyncthingStartupIntegration SyncthingNotifier::consideredIntegrations() const +{ + return m_consideredIntegrations; +} + +/*!< * \brief Sets which notifications are enabled. */ inline void SyncthingNotifier::setEnabledNotifications(SyncthingHighLevelNotification enabledNotifications) @@ -132,6 +154,14 @@ inline void SyncthingNotifier::setEnabledNotifications(SyncthingHighLevelNotific m_enabledNotifications = enabledNotifications; } +/*! + * \brief Sets which startup integrations are considered for filtering notifications. + */ +inline void SyncthingNotifier::setConsideredIntegrations(SyncthingStartupIntegration consideredIntegrations) +{ + m_consideredIntegrations = consideredIntegrations; +} + /*! * \brief Returns the number of seconds after startup or standby-wakeup to suppress disconnect notifications. */ @@ -185,5 +215,6 @@ inline void SyncthingNotifier::setProcess(const SyncthingProcess *process) } // namespace Data CPP_UTILITIES_MARK_FLAG_ENUM_CLASS(Data, Data::SyncthingHighLevelNotification) +CPP_UTILITIES_MARK_FLAG_ENUM_CLASS(Data, Data::SyncthingStartupIntegration) #endif // DATA_SYNCTHINGNOTIFIER_H diff --git a/widgets/settings/launcheroptionpage.ui b/widgets/settings/launcheroptionpage.ui index 6ee4a50..9eb75b7 100644 --- a/widgets/settings/launcheroptionpage.ui +++ b/widgets/settings/launcheroptionpage.ui @@ -14,7 +14,6 @@ - 75 true @@ -134,9 +133,10 @@ - Consider process status for reconnect attempts to local instance + Consider process status for notifications and reconnect attempts concerning local instance • Don't reconnect when the process is not running - • Try to reconnect when starting the process + • Try to reconnect when starting the process + • Suppress notification about disconnect when Syncthing has been stopped manually @@ -159,7 +159,6 @@ - 75 true diff --git a/widgets/settings/settings.cpp b/widgets/settings/settings.cpp index 7258f70..9995443 100644 --- a/widgets/settings/settings.cpp +++ b/widgets/settings/settings.cpp @@ -528,7 +528,8 @@ void save() */ void Settings::apply(SyncthingNotifier ¬ifier) const { - auto notifications(SyncthingHighLevelNotification::None); + auto notifications = SyncthingHighLevelNotification::None; + auto integrations = SyncthingStartupIntegration::None; if (notifyOn.disconnect) { notifications |= SyncthingHighLevelNotification::ConnectedDisconnected; } @@ -547,7 +548,14 @@ void Settings::apply(SyncthingNotifier ¬ifier) const if (notifyOn.launcherErrors) { notifications |= SyncthingHighLevelNotification::SyncthingProcessError; } + if (launcher.considerForReconnect) { + integrations |= SyncthingStartupIntegration::Process; + } + if (systemd.considerForReconnect) { + integrations |= SyncthingStartupIntegration::Service; + } notifier.setEnabledNotifications(notifications); + notifier.setConsideredIntegrations(integrations); notifier.setIgnoreInavailabilityAfterStart(ignoreInavailabilityAfterStart); } diff --git a/widgets/settings/systemdoptionpage.ui b/widgets/settings/systemdoptionpage.ui index 1409f17..7654927 100644 --- a/widgets/settings/systemdoptionpage.ui +++ b/widgets/settings/systemdoptionpage.ui @@ -6,14 +6,14 @@ Systemd - + + .. - 75 true @@ -25,9 +25,10 @@ - Consider systemd unit status for reconnect attempts to local instance + Consider systemd unit status for notifications and reconnect attempts concerning local instance • Don't reconnect when unit not active/running - • Try to reconnect when unit becomes active/running + • Try to reconnect when unit becomes active/running + • Suppress notification about disconnect when Syncthing has been stopped manually