From 23e9b57e3d261f66168a8a28ccb8e5c886b4841f Mon Sep 17 00:00:00 2001 From: Shawn Rutledge Date: Thu, 19 Feb 2015 13:47:22 +0100 Subject: [PATCH] D-Bus system tray: properly check whether StatusNotifierHost available MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit "org.kde.StatusNotifierWatcher" is just a watcher/helper, whereas the actual systray object is "org.kde.StatusNotifierHost-$PID". The org.kde.StatusNotifierWatcher.IsStatusNotifierHostRegistered property can tell us whether there is an actual system tray. Also renamed the accessor to isStatusNotifierHostRegistered since we are checking for the host, and also because it can be confusing that it's a member of QDBusMenuConnection if the name isn't clear. See also KDE bug 339707 Change-Id: I218c5357b9cc5a62e5cc07abe980893b826f98f4 Reviewed-by: Martin Klapetek Reviewed-by: Jørgen Lind Reviewed-by: Dmitry Shachnev --- src/platformsupport/dbusmenu/qdbusmenuconnection.cpp | 10 +++++----- src/platformsupport/dbusmenu/qdbusmenuconnection_p.h | 4 ++-- src/platformsupport/dbustray/qdbustrayicon.cpp | 7 ++----- .../themes/genericunix/qgenericunixthemes.cpp | 2 +- 4 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/platformsupport/dbusmenu/qdbusmenuconnection.cpp b/src/platformsupport/dbusmenu/qdbusmenuconnection.cpp index a8211f63ce..73793d7497 100644 --- a/src/platformsupport/dbusmenu/qdbusmenuconnection.cpp +++ b/src/platformsupport/dbusmenu/qdbusmenuconnection.cpp @@ -63,14 +63,14 @@ QDBusMenuConnection::QDBusMenuConnection(QObject *parent) : QObject(parent) , m_connection(QDBusConnection::sessionBus()) , m_dbusWatcher(new QDBusServiceWatcher(StatusNotifierWatcherService, m_connection, QDBusServiceWatcher::WatchForRegistration, this)) - , m_watcherRegistered(false) + , m_statusNotifierHostRegistered(false) { #ifndef QT_NO_SYSTEMTRAYICON - // Start monitoring if any known tray-related services are registered. - if (m_connection.interface()->isServiceRegistered(StatusNotifierWatcherService)) - m_watcherRegistered = true; + QDBusInterface systrayHost(StatusNotifierWatcherService, StatusNotifierWatcherPath, StatusNotifierWatcherService, m_connection); + if (systrayHost.isValid() && systrayHost.property("IsStatusNotifierHostRegistered").toBool()) + m_statusNotifierHostRegistered = true; else - qCDebug(qLcMenu) << "failed to find service" << StatusNotifierWatcherService; + qCDebug(qLcMenu) << "StatusNotifierHost is not registered"; #endif } diff --git a/src/platformsupport/dbusmenu/qdbusmenuconnection_p.h b/src/platformsupport/dbusmenu/qdbusmenuconnection_p.h index 377999c365..8d230bd3bf 100644 --- a/src/platformsupport/dbusmenu/qdbusmenuconnection_p.h +++ b/src/platformsupport/dbusmenu/qdbusmenuconnection_p.h @@ -63,7 +63,7 @@ class QDBusMenuConnection : public QObject public: QDBusMenuConnection(QObject *parent = 0); QDBusConnection connection() const { return m_connection; } - bool isWatcherRegistered() const { return m_watcherRegistered; } + bool isStatusNotifierHostRegistered() const { return m_statusNotifierHostRegistered; } #ifndef QT_NO_SYSTEMTRAYICON bool registerTrayIcon(QDBusTrayIcon *item); bool unregisterTrayIcon(QDBusTrayIcon *item); @@ -80,7 +80,7 @@ private Q_SLOTS: private: QDBusConnection m_connection; QDBusServiceWatcher *m_dbusWatcher; - bool m_watcherRegistered; + bool m_statusNotifierHostRegistered; }; QT_END_NAMESPACE diff --git a/src/platformsupport/dbustray/qdbustrayicon.cpp b/src/platformsupport/dbustray/qdbustrayicon.cpp index 18e72d852a..d85d29a5c7 100644 --- a/src/platformsupport/dbustray/qdbustrayicon.cpp +++ b/src/platformsupport/dbustray/qdbustrayicon.cpp @@ -281,11 +281,8 @@ void QDBusTrayIcon::notificationClosed(uint id, uint reason) bool QDBusTrayIcon::isSystemTrayAvailable() const { QDBusMenuConnection * conn = const_cast(this)->dBusConnection(); - - // If the KDE watcher service is registered, we must be on a desktop - // where a StatusNotifier-conforming system tray exists. - qCDebug(qLcTray) << conn->isWatcherRegistered(); - return conn->isWatcherRegistered(); + qCDebug(qLcTray) << conn->isStatusNotifierHostRegistered(); + return conn->isStatusNotifierHostRegistered(); } QT_END_NAMESPACE diff --git a/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp b/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp index 3fffec0dfd..ba328bfb41 100644 --- a/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp +++ b/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp @@ -98,7 +98,7 @@ static bool isDBusTrayAvailable() { static bool dbusTrayAvailableKnown = false; if (!dbusTrayAvailableKnown) { QDBusMenuConnection conn; - if (conn.isWatcherRegistered()) + if (conn.isStatusNotifierHostRegistered()) dbusTrayAvailable = true; dbusTrayAvailableKnown = true; qCDebug(qLcTray) << "D-Bus tray available:" << dbusTrayAvailable;