From 64c3845a7c709687fba9f0a385bb356738924729 Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Tue, 18 Jul 2023 15:34:32 +0800 Subject: [PATCH] Detect D-Bus interface --- .../powermanagement/powermanagement_x11.cpp | 85 +++++++------------ src/gui/powermanagement/powermanagement_x11.h | 12 ++- 2 files changed, 39 insertions(+), 58 deletions(-) diff --git a/src/gui/powermanagement/powermanagement_x11.cpp b/src/gui/powermanagement/powermanagement_x11.cpp index 94f4dc8ea..ee4a85c79 100644 --- a/src/gui/powermanagement/powermanagement_x11.cpp +++ b/src/gui/powermanagement/powermanagement_x11.cpp @@ -29,7 +29,7 @@ #include "powermanagement_x11.h" #include -#include +#include #include #include @@ -37,16 +37,27 @@ PowerManagementInhibitor::PowerManagementInhibitor(QObject *parent) : QObject(parent) + , m_busInterface {new QDBusInterface(u"org.gnome.SessionManager"_s, u"/org/gnome/SessionManager"_s + , u"org.gnome.SessionManager"_s, QDBusConnection::sessionBus(), this)} { - if (!QDBusConnection::sessionBus().isConnected()) + if (!m_busInterface->isValid()) { - qDebug("D-Bus: Could not connect to session bus"); - m_state = Error; - } - else - { - m_state = Idle; + delete m_busInterface; + + m_busInterface = new QDBusInterface(u"org.freedesktop.PowerManagement"_s, u"/org/freedesktop/PowerManagement/Inhibit"_s + , u"org.freedesktop.PowerManagement.Inhibit"_s, QDBusConnection::sessionBus(), this); + m_manager = ManagerType::Freedesktop; + if (!m_busInterface->isValid()) + { + delete m_busInterface; + m_busInterface = nullptr; + + m_state = Error; + return; + } } + + m_busInterface->setTimeout(1000); } void PowerManagementInhibitor::requestIdle() @@ -58,20 +69,10 @@ void PowerManagementInhibitor::requestIdle() m_state = RequestIdle; qDebug("D-Bus: PowerManagementInhibitor: Requesting idle"); - QDBusMessage call = m_useGSM - ? QDBusMessage::createMethodCall( - u"org.gnome.SessionManager"_s, - u"/org/gnome/SessionManager"_s, - u"org.gnome.SessionManager"_s, - u"Uninhibit"_s) - : QDBusMessage::createMethodCall( - u"org.freedesktop.PowerManagement"_s, - u"/org/freedesktop/PowerManagement/Inhibit"_s, - u"org.freedesktop.PowerManagement.Inhibit"_s, - u"UnInhibit"_s); - call.setArguments({m_cookie}); - - const QDBusPendingCall pcall = QDBusConnection::sessionBus().asyncCall(call, 1000); + const QString method = (m_manager == ManagerType::Gnome) + ? u"Uninhibit"_s + : u"UnInhibit"_s; + const QDBusPendingCall pcall = m_busInterface->asyncCall(method, m_cookie); const auto *watcher = new QDBusPendingCallWatcher(pcall, this); connect(watcher, &QDBusPendingCallWatcher::finished, this, &PowerManagementInhibitor::onAsyncReply); } @@ -85,27 +86,11 @@ void PowerManagementInhibitor::requestBusy() m_state = RequestBusy; qDebug("D-Bus: PowerManagementInhibitor: Requesting busy"); - QDBusMessage call = m_useGSM - ? QDBusMessage::createMethodCall( - u"org.gnome.SessionManager"_s, - u"/org/gnome/SessionManager"_s, - u"org.gnome.SessionManager"_s, - u"Inhibit"_s) - : QDBusMessage::createMethodCall( - u"org.freedesktop.PowerManagement"_s, - u"/org/freedesktop/PowerManagement/Inhibit"_s, - u"org.freedesktop.PowerManagement.Inhibit"_s, - u"Inhibit"_s); - - QList args = {u"qBittorrent"_s}; - if (m_useGSM) - args << 0u; - args << u"Active torrents are presented"_s; - if (m_useGSM) - args << 4u; - call.setArguments(args); - - const QDBusPendingCall pcall = QDBusConnection::sessionBus().asyncCall(call, 1000); + const QString message = u"Active torrents are presented"_s; + const auto args = (m_manager == ManagerType::Gnome) + ? QList {u"qBittorrent"_s, 0u, message, 4u} + : QList {u"qBittorrent"_s, message}; + const QDBusPendingCall pcall = m_busInterface->asyncCallWithArgumentList(u"Inhibit"_s, args); const auto *watcher = new QDBusPendingCallWatcher(pcall, this); connect(watcher, &QDBusPendingCallWatcher::finished, this, &PowerManagementInhibitor::onAsyncReply); } @@ -138,19 +123,7 @@ void PowerManagementInhibitor::onAsyncReply(QDBusPendingCallWatcher *call) if (reply.isError()) { qDebug("D-Bus: Reply: Error: %s", qUtf8Printable(reply.error().message())); - - if (m_useGSM) - { - qDebug("D-Bus: Falling back to org.freedesktop.PowerManagement"); - m_useGSM = false; - m_state = Idle; - if (m_intendedState == Busy) - requestBusy(); - } - else - { - m_state = Error; - } + m_state = Error; } else { diff --git a/src/gui/powermanagement/powermanagement_x11.h b/src/gui/powermanagement/powermanagement_x11.h index c40502e20..02c93d089 100644 --- a/src/gui/powermanagement/powermanagement_x11.h +++ b/src/gui/powermanagement/powermanagement_x11.h @@ -30,6 +30,7 @@ #include +class QDBusInterface; class QDBusPendingCallWatcher; class PowerManagementInhibitor final : public QObject @@ -57,9 +58,16 @@ private: RequestIdle }; + enum class ManagerType + { + Freedesktop, // https://www.freedesktop.org/wiki/Specifications/power-management-spec/ + Gnome // https://github.com/GNOME/gnome-settings-daemon/blob/master/gnome-settings-daemon/org.gnome.SessionManager.xml + }; + + QDBusInterface *m_busInterface = nullptr; + ManagerType m_manager = ManagerType::Gnome; + enum State m_state = Error; enum State m_intendedState = Idle; quint32 m_cookie = 0; - - bool m_useGSM = true; };