QGnomeTheme: Prevent leak of QDBusPendingCallWatcher
Otherwise the watcher can outlive the theme and the connected lambda calls into the already destroyed theme. Change-Id: I55e7834d1eb806d9f5f1945a4e1016d14b2969b6 Reviewed-by: Axel Spoerl <axel.spoerl@qt.io>
This commit is contained in:
parent
ab7eb492cb
commit
677ee0cf7c
@ -66,15 +66,14 @@ QGnomeThemePrivate::QGnomeThemePrivate()
|
||||
|
||||
message.setArguments({});
|
||||
message << appearanceNamespace << contrastKey;
|
||||
QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(dbus.asyncCall(message));
|
||||
QObject::connect(watcher, &QDBusPendingCallWatcher::finished, watcher, [this](QDBusPendingCallWatcher *watcher) {
|
||||
pendingCallWatcher = std::make_unique<QDBusPendingCallWatcher>(dbus.asyncCall(message));
|
||||
QObject::connect(pendingCallWatcher.get(), &QDBusPendingCallWatcher::finished, pendingCallWatcher.get(), [this](QDBusPendingCallWatcher *watcher) {
|
||||
if (!watcher->isError()) {
|
||||
QDBusPendingReply<QVariant> reply = *watcher;
|
||||
if (Q_LIKELY(reply.isValid()))
|
||||
updateHighContrast(static_cast<Qt::ContrastPreference>(reply.value().toUInt()));
|
||||
}
|
||||
initDbus();
|
||||
watcher->deleteLater();
|
||||
});
|
||||
} else {
|
||||
qCWarning(lcQpaThemeGnome) << "dbus connection failed. Last error: " << dbus.lastError();
|
||||
|
@ -24,6 +24,7 @@ QT_BEGIN_NAMESPACE
|
||||
class QGnomeThemePrivate;
|
||||
#if QT_CONFIG(dbus)
|
||||
class QDBusListener;
|
||||
class QDBusPendingCallWatcher;
|
||||
#endif
|
||||
|
||||
class Q_GUI_EXPORT QGnomeTheme : public QGenericUnixTheme
|
||||
@ -66,6 +67,7 @@ public:
|
||||
Qt::ContrastPreference m_contrast = Qt::ContrastPreference::NoPreference;
|
||||
private:
|
||||
std::unique_ptr<QDBusListener> dbus;
|
||||
std::unique_ptr<QDBusPendingCallWatcher> pendingCallWatcher;
|
||||
bool initDbus();
|
||||
void updateColorScheme(const QString &themeName);
|
||||
void updateHighContrast(Qt::ContrastPreference contrast);
|
||||
|
Loading…
x
Reference in New Issue
Block a user