From 69f466be66651df352c8a46337bba078aeb62c9b Mon Sep 17 00:00:00 2001 From: Martchus Date: Thu, 15 Jul 2021 02:21:18 +0200 Subject: [PATCH] Fix crash when systemd unit status changes when settings page has already been destroyed --- CMakeLists.txt | 2 +- widgets/settings/settingsdialog.cpp | 16 ++++++++++++---- widgets/settings/settingsdialog.h | 4 ++++ 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b7923e5..bbcfce1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,7 +11,7 @@ set(META_APP_CATEGORIES "Network;FileTransfer") set(META_GUI_OPTIONAL false) set(META_VERSION_MAJOR 1) set(META_VERSION_MINOR 1) -set(META_VERSION_PATCH 8) +set(META_VERSION_PATCH 9) set(META_VERSION_EXACT_SONAME ON) set(META_ADD_DEFAULT_CPP_UNIT_TEST_APPLICATION ON) diff --git a/widgets/settings/settingsdialog.cpp b/widgets/settings/settingsdialog.cpp index b4f38d8..2c7b687 100644 --- a/widgets/settings/settingsdialog.cpp +++ b/widgets/settings/settingsdialog.cpp @@ -1209,6 +1209,10 @@ SystemdOptionPage::SystemdOptionPage(QWidget *parentWidget) SystemdOptionPage::~SystemdOptionPage() { + QObject::disconnect(m_unitChangedConn); + QObject::disconnect(m_descChangedConn); + QObject::disconnect(m_statusChangedConn); + QObject::disconnect(m_enabledChangedConn); } QWidget *SystemdOptionPage::setupWidget() @@ -1218,14 +1222,18 @@ QWidget *SystemdOptionPage::setupWidget() return widget; } QObject::connect(ui()->syncthingUnitLineEdit, &QLineEdit::textChanged, m_service, &SyncthingService::setUnitName); - QObject::connect(ui()->systemUnitCheckBox, &QCheckBox::clicked, m_service, bind(&SystemdOptionPage::handleSystemUnitChanged, this)); QObject::connect(ui()->startPushButton, &QPushButton::clicked, m_service, &SyncthingService::start); QObject::connect(ui()->stopPushButton, &QPushButton::clicked, m_service, &SyncthingService::stop); QObject::connect(ui()->enablePushButton, &QPushButton::clicked, m_service, &SyncthingService::enable); QObject::connect(ui()->disablePushButton, &QPushButton::clicked, m_service, &SyncthingService::disable); - QObject::connect(m_service, &SyncthingService::descriptionChanged, bind(&SystemdOptionPage::handleDescriptionChanged, this, _1)); - QObject::connect(m_service, &SyncthingService::stateChanged, bind(&SystemdOptionPage::handleStatusChanged, this, _1, _2, _3)); - QObject::connect(m_service, &SyncthingService::unitFileStateChanged, bind(&SystemdOptionPage::handleEnabledChanged, this, _1)); + m_unitChangedConn + = QObject::connect(ui()->systemUnitCheckBox, &QCheckBox::clicked, m_service, bind(&SystemdOptionPage::handleSystemUnitChanged, this)); + m_descChangedConn + = QObject::connect(m_service, &SyncthingService::descriptionChanged, bind(&SystemdOptionPage::handleDescriptionChanged, this, _1)); + m_statusChangedConn + = QObject::connect(m_service, &SyncthingService::stateChanged, bind(&SystemdOptionPage::handleStatusChanged, this, _1, _2, _3)); + m_enabledChangedConn + = QObject::connect(m_service, &SyncthingService::unitFileStateChanged, bind(&SystemdOptionPage::handleEnabledChanged, this, _1)); return widget; } diff --git a/widgets/settings/settingsdialog.h b/widgets/settings/settingsdialog.h index ca347d6..e218382 100644 --- a/widgets/settings/settingsdialog.h +++ b/widgets/settings/settingsdialog.h @@ -148,6 +148,10 @@ void handleDescriptionChanged(const QString &description); void handleStatusChanged(const QString &activeState, const QString &subState, CppUtilities::DateTime activeSince); void handleEnabledChanged(const QString &unitFileState); Data::SyncthingService *const m_service; +QMetaObject::Connection m_unitChangedConn; +QMetaObject::Connection m_descChangedConn; +QMetaObject::Connection m_statusChangedConn; +QMetaObject::Connection m_enabledChangedConn; END_DECLARE_OPTION_PAGE #endif