Revert "D-Bus system tray: properly check whether StatusNotifierHost available"
authorDebian Qt/KDE Maintainers <debian-qt-kde@lists.debian.org>
Sat, 8 Feb 2025 16:24:33 +0000 (19:24 +0300)
committerDmitry Shachnev <mitya57@debian.org>
Sat, 8 Feb 2025 16:24:33 +0000 (19:24 +0300)
Origin: upstream, https://code.qt.io/cgit/qt/qtbase.git/commit/?id=447f3ade9a284d52
Last-Update: 2024-07-24

The original commit was made based on a KDE workaround for
libdbusmenu-qt crash, but Qt is not using libdbusmenu-qt, Qt is not
watching for StatusNotifierHost registration and Qt is not capable
to switch backends on the fly leading to tray support being
not detected on Plasma Wayland sessions and falling back to the poor
legacy protocol on X11.

Gbp-Pq: Name revert_statusnotifierhost_checking.diff

src/platformsupport/themes/genericunix/dbusmenu/qdbusmenuconnection.cpp
src/platformsupport/themes/genericunix/dbusmenu/qdbusmenuconnection_p.h
src/platformsupport/themes/genericunix/dbustray/qdbustrayicon.cpp
src/platformsupport/themes/genericunix/qgenericunixthemes.cpp

index 09470bccc6cc36dc56aedbc7e8231e61c628fdc2..ce2d63e0dcb66636f737e8825c67e0e2c1b43295 100644 (file)
@@ -72,14 +72,14 @@ QDBusMenuConnection::QDBusMenuConnection(QObject *parent, const QString &service
     , m_connection(serviceName.isNull() ? QDBusConnection::sessionBus()
                                         : QDBusConnection::connectToBus(QDBusConnection::SessionBus, serviceName))
     , m_dbusWatcher(new QDBusServiceWatcher(StatusNotifierWatcherService, m_connection, QDBusServiceWatcher::WatchForRegistration, this))
-    , m_statusNotifierHostRegistered(false)
+    , m_watcherRegistered(false)
 {
 #ifndef QT_NO_SYSTEMTRAYICON
-    QDBusInterface systrayHost(StatusNotifierWatcherService, StatusNotifierWatcherPath, StatusNotifierWatcherService, m_connection);
-    if (systrayHost.isValid() && systrayHost.property("IsStatusNotifierHostRegistered").toBool())
-        m_statusNotifierHostRegistered = true;
+    // Start monitoring if any known tray-related services are registered.
+    if (m_connection.interface()->isServiceRegistered(StatusNotifierWatcherService))
+        m_watcherRegistered = true;
     else
-        qCDebug(qLcMenu) << "StatusNotifierHost is not registered";
+        qCDebug(qLcMenu) << "failed to find service" << StatusNotifierWatcherService;
 #endif
 }
 
index f484795fbb7eb0fb19ecb9663cacfbb46698b67c..0eaafe225883c7475b1cecd21f1b67665b5b918b 100644 (file)
@@ -72,7 +72,7 @@ public:
     QDBusMenuConnection(QObject *parent = nullptr, const QString &serviceName = QString());
     QDBusConnection connection() const { return m_connection; }
     QDBusServiceWatcher *dbusWatcher() const { return m_dbusWatcher; }
-    bool isStatusNotifierHostRegistered() const { return m_statusNotifierHostRegistered; }
+    bool isWatcherRegistered() const { return m_watcherRegistered; }
 #ifndef QT_NO_SYSTEMTRAYICON
     bool registerTrayIconMenu(QDBusTrayIcon *item);
     void unregisterTrayIconMenu(QDBusTrayIcon *item);
@@ -92,7 +92,7 @@ private Q_SLOTS:
 private:
     QDBusConnection m_connection;
     QDBusServiceWatcher *m_dbusWatcher;
-    bool m_statusNotifierHostRegistered;
+    bool m_watcherRegistered;
 };
 
 QT_END_NAMESPACE
index b4b1fcaba7a3c4fcb987aefecafee8bf93625b95..3894b189273e0d1fc303d8f49c73b2fc2a054b1f 100644 (file)
@@ -352,8 +352,11 @@ void QDBusTrayIcon::notificationClosed(uint id, uint reason)
 bool QDBusTrayIcon::isSystemTrayAvailable() const
 {
     QDBusMenuConnection * conn = const_cast<QDBusTrayIcon *>(this)->dBusConnection();
-    qCDebug(qLcTray) << conn->isStatusNotifierHostRegistered();
-    return conn->isStatusNotifierHostRegistered();
+
+    // 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();
 }
 
 QT_END_NAMESPACE
index cb1b39db646337088632eb0854d53e638fe07b78..1d2c67d62a21494857e9b0d471e9725f4a1f8204 100644 (file)
@@ -106,7 +106,7 @@ static bool isDBusTrayAvailable() {
     static bool dbusTrayAvailableKnown = false;
     if (!dbusTrayAvailableKnown) {
         QDBusMenuConnection conn;
-        if (conn.isStatusNotifierHostRegistered())
+        if (conn.isWatcherRegistered())
             dbusTrayAvailable = true;
         dbusTrayAvailableKnown = true;
         qCDebug(qLcTray) << "D-Bus tray available:" << dbusTrayAvailable;