From f9ab1e2a10d71deb286b9d79db131c24616e282c Mon Sep 17 00:00:00 2001 From: AramJonghu Date: Wed, 3 Jun 2026 16:51:15 +0200 Subject: [PATCH] inability to connect to DBus.Properties resolved --- Plugins/ZShell/lidwatcher.cpp | 84 +++++++++++++++++++++++++---------- Plugins/ZShell/lidwatcher.hpp | 16 ++++--- 2 files changed, 71 insertions(+), 29 deletions(-) diff --git a/Plugins/ZShell/lidwatcher.cpp b/Plugins/ZShell/lidwatcher.cpp index 4ad1b49..20036e0 100644 --- a/Plugins/ZShell/lidwatcher.cpp +++ b/Plugins/ZShell/lidwatcher.cpp @@ -3,7 +3,9 @@ #include #include #include +#include #include +#include Q_LOGGING_CATEGORY(lcLidWatcher, "ZShell.lidwatcher", QtInfoMsg) @@ -15,32 +17,32 @@ static constexpr auto kLogin1Interface = "org.freedesktop.login1.Manager"; static constexpr auto kDBusPropertiesInterface = "org.freedesktop.DBus.Properties"; -LidWatcher::LidWatcher(QObject* parent) : QObject(parent), m_available(false) { +LidWatcher::LidWatcher(QObject* parent) + : QObject(parent) + , m_watcher(nullptr) + , m_pollTimer(nullptr) + , m_available(false) +{ QDBusConnection bus = QDBusConnection::systemBus(); - m_available = bus.isConnected(); - - if (!m_available) { + if (!bus.isConnected()) { qCWarning(lcLidWatcher) << "system bus unavailable"; emit availableChanged(); return; } - const auto ok = bus.connect( + m_pollTimer = new QTimer(this); + m_pollTimer->setInterval(5000); + connect(m_pollTimer, &QTimer::timeout, this, &LidWatcher::queryLidState); + + m_watcher = new QDBusServiceWatcher( kLogin1Service, - kLogin1Path, - kDBusPropertiesInterface, - "PropertiesChanged", - this, - SLOT(onPropertiesChanged(QString, QVariantMap, QStringList))); + bus, + QDBusServiceWatcher::WatchForRegistration, + this); + connect(m_watcher, &QDBusServiceWatcher::serviceRegistered, + this, &LidWatcher::tryConnect); - m_available = ok; - emit availableChanged(); - if (!m_available) { - qCWarning(lcLidWatcher) << "login1 properties signal unavailable"; - return; - } - - queryInitialState(); + tryConnect(); } bool LidWatcher::available() const { @@ -51,7 +53,37 @@ LidWatcher::LidState LidWatcher::state() const { return m_state; } -void LidWatcher::queryInitialState() { +void LidWatcher::tryConnect() { + QDBusConnection bus = QDBusConnection::systemBus(); + + const auto connected = bus.connect( + kLogin1Service, + kLogin1Path, + kDBusPropertiesInterface, + "PropertiesChanged", + this, + SLOT(onPropertiesChanged(QString, QVariantMap, QStringList))); + + queryLidState(); + + if (connected) { + m_pollTimer->stop(); + qCInfo(lcLidWatcher) << "login1 PropertiesChanged connected"; + } else { + qCWarning(lcLidWatcher) + << "login1 PropertiesChanged unavailable, polling"; + if (!m_pollTimer->isActive()) { + m_pollTimer->start(); +} + } + + if (!m_available) { + m_available = true; + emit availableChanged(); + } +} + +void LidWatcher::queryLidState() { auto msg = QDBusMessage::createMethodCall(kLogin1Service, kLogin1Path, kDBusPropertiesInterface, @@ -63,8 +95,11 @@ void LidWatcher::queryInitialState() { << "cannot query LidClosed:" << reply.error().message(); return; } - m_state = reply.value().toBool() ? Closed : Opened; - emit stateChanged(); + const auto newState = reply.value().toBool() ? Closed : Opened; + if (m_state != newState) { + m_state = newState; + emit stateChanged(); + } } void LidWatcher::onPropertiesChanged(const QString& interface, @@ -76,8 +111,11 @@ void LidWatcher::onPropertiesChanged(const QString& interface, if (!changed.contains("LidClosed")) { return; } - m_state = changed.value("LidClosed").toBool() ? Closed : Opened; - emit stateChanged(); + const auto newState = changed.value("LidClosed").toBool() ? Closed : Opened; + if (m_state != newState) { + m_state = newState; + emit stateChanged(); + } } } // namespace ZShell diff --git a/Plugins/ZShell/lidwatcher.hpp b/Plugins/ZShell/lidwatcher.hpp index 7579bcc..e7685ec 100644 --- a/Plugins/ZShell/lidwatcher.hpp +++ b/Plugins/ZShell/lidwatcher.hpp @@ -6,6 +6,9 @@ #include #include +class QDBusServiceWatcher; +class QTimer; + namespace ZShell { class LidWatcher : public QObject { @@ -26,16 +29,17 @@ class LidWatcher : public QObject { [[nodiscard]] LidState state() const; private: - void queryInitialState(); - - bool m_available; - LidState m_state = Opened; - - + void tryConnect(); + void queryLidState(); void onPropertiesChanged(const QString& interface, const QVariantMap& changed, const QStringList& invalidated); + QDBusServiceWatcher* m_watcher; + QTimer* m_pollTimer; + bool m_available; + LidState m_state = Opened; + Q_SIGNALS: void availableChanged(); void stateChanged();