Index: src/kglobalaccel.cpp =================================================================== --- src/kglobalaccel.cpp +++ src/kglobalaccel.cpp @@ -101,6 +101,14 @@ return QStringLiteral("org.kde.kglobalaccel"); } } +void KGlobalAccelPrivate::cleanup() +{ + qDeleteAll(components); + delete m_iface; + m_iface = nullptr; + delete m_watcher; + m_watcher = nullptr; +} KGlobalAccelPrivate::KGlobalAccelPrivate(KGlobalAccel *q) : @@ -110,11 +118,11 @@ q(q), m_iface(Q_NULLPTR) { - QDBusServiceWatcher *watcher = new QDBusServiceWatcher(serviceName(), + m_watcher = new QDBusServiceWatcher(serviceName(), QDBusConnection::sessionBus(), QDBusServiceWatcher::WatchForOwnerChange, q); - q->connect(watcher, SIGNAL(serviceOwnerChanged(QString,QString,QString)), + q->connect(m_watcher, SIGNAL(serviceOwnerChanged(QString,QString,QString)), q, SLOT(_k_serviceOwnerChanged(QString,QString,QString))); } @@ -204,11 +212,20 @@ class KGlobalAccelSingleton { public: + KGlobalAccelSingleton(); + KGlobalAccel instance; }; Q_GLOBAL_STATIC(KGlobalAccelSingleton, s_instance) +KGlobalAccelSingleton::KGlobalAccelSingleton() +{ + qAddPostRoutine([]() { + s_instance->instance.d->cleanup(); + }); +} + KGlobalAccel *KGlobalAccel::self() { return &s_instance()->instance; Index: src/kglobalaccel_p.h =================================================================== --- src/kglobalaccel_p.h +++ src/kglobalaccel_p.h @@ -72,6 +72,8 @@ QList intListFromShortcut(const QList &cut); QList shortcutFromIntList(const QList &list); + void cleanup(); + //private slot implementations void _k_invokeAction(const QString &, const QString &, qlonglong); void _k_shortcutGotChanged(const QStringList &, const QList &); @@ -100,6 +102,7 @@ private: org::kde::KGlobalAccel *m_iface; + QDBusServiceWatcher *m_watcher; }; Q_DECLARE_OPERATORS_FOR_FLAGS(KGlobalAccelPrivate::ShortcutTypes)