Browse Source

Add support for systemd power management

adaptive-webui-19844
Chocobo1 1 year ago
parent
commit
f3f9cfe44e
No known key found for this signature in database
GPG Key ID: 210D9C873253A68C
  1. 59
      src/gui/powermanagement/powermanagement_x11.cpp
  2. 5
      src/gui/powermanagement/powermanagement_x11.h

59
src/gui/powermanagement/powermanagement_x11.cpp

@ -41,6 +41,13 @@ PowerManagementInhibitor::PowerManagementInhibitor(QObject *parent)
, m_busInterface {new QDBusInterface(u"org.gnome.SessionManager"_s, u"/org/gnome/SessionManager"_s , m_busInterface {new QDBusInterface(u"org.gnome.SessionManager"_s, u"/org/gnome/SessionManager"_s
, u"org.gnome.SessionManager"_s, QDBusConnection::sessionBus(), this)} , u"org.gnome.SessionManager"_s, QDBusConnection::sessionBus(), this)}
{ {
if (!m_busInterface->isValid())
{
delete m_busInterface;
m_busInterface = new QDBusInterface(u"org.freedesktop.login1"_s, u"/org/freedesktop/login1"_s
, u"org.freedesktop.login1.Manager"_s, QDBusConnection::systemBus(), this);
m_manager = ManagerType::Systemd;
if (!m_busInterface->isValid()) if (!m_busInterface->isValid())
{ {
delete m_busInterface; delete m_busInterface;
@ -52,14 +59,14 @@ PowerManagementInhibitor::PowerManagementInhibitor(QObject *parent)
{ {
delete m_busInterface; delete m_busInterface;
m_busInterface = nullptr; m_busInterface = nullptr;
}
m_state = Error;
} }
} }
if (m_busInterface) if (m_busInterface)
{ {
m_busInterface->setTimeout(1000); m_busInterface->setTimeout(1000);
m_state = Idle;
LogMsg(tr("Power management found suitable D-Bus interface. Interface: %1").arg(m_busInterface->interface())); LogMsg(tr("Power management found suitable D-Bus interface. Interface: %1").arg(m_busInterface->interface()));
} }
else else
@ -77,6 +84,13 @@ void PowerManagementInhibitor::requestIdle()
m_state = RequestIdle; m_state = RequestIdle;
qDebug("D-Bus: PowerManagementInhibitor: Requesting idle"); qDebug("D-Bus: PowerManagementInhibitor: Requesting idle");
if (m_manager == ManagerType::Systemd)
{
QDBusUnixFileDescriptor dummy;
m_fd.swap(dummy);
return;
}
const QString method = (m_manager == ManagerType::Gnome) const QString method = (m_manager == ManagerType::Gnome)
? u"Uninhibit"_s ? u"Uninhibit"_s
: u"UnInhibit"_s; : u"UnInhibit"_s;
@ -95,9 +109,21 @@ void PowerManagementInhibitor::requestBusy()
qDebug("D-Bus: PowerManagementInhibitor: Requesting busy"); qDebug("D-Bus: PowerManagementInhibitor: Requesting busy");
const QString message = u"Active torrents are currently present"_s; const QString message = u"Active torrents are currently present"_s;
const auto args = (m_manager == ManagerType::Gnome)
? QList<QVariant> {u"qBittorrent"_s, 0u, message, 4u} QList<QVariant> args;
: QList<QVariant> {u"qBittorrent"_s, message}; switch (m_manager)
{
case ManagerType::Freedesktop:
args = {u"qBittorrent"_s, message};
break;
case ManagerType::Gnome:
args = {u"qBittorrent"_s, 0u, message, 4u};
break;
case ManagerType::Systemd:
args = {u"sleep"_s, u"qBittorrent"_s, message, u"block"_s};
break;
}
const QDBusPendingCall pcall = m_busInterface->asyncCallWithArgumentList(u"Inhibit"_s, args); const QDBusPendingCall pcall = m_busInterface->asyncCallWithArgumentList(u"Inhibit"_s, args);
const auto *watcher = new QDBusPendingCallWatcher(pcall, this); const auto *watcher = new QDBusPendingCallWatcher(pcall, this);
connect(watcher, &QDBusPendingCallWatcher::finished, this, &PowerManagementInhibitor::onAsyncReply); connect(watcher, &QDBusPendingCallWatcher::finished, this, &PowerManagementInhibitor::onAsyncReply);
@ -127,6 +153,28 @@ void PowerManagementInhibitor::onAsyncReply(QDBusPendingCallWatcher *call)
} }
} }
else if (m_state == RequestBusy) else if (m_state == RequestBusy)
{
if (m_manager == ManagerType::Systemd)
{
const QDBusPendingReply<QDBusUnixFileDescriptor> reply = *call;
if (reply.isError())
{
qDebug("D-Bus: Reply: Error: %s", qUtf8Printable(reply.error().message()));
LogMsg(tr("Power management error. Action: %1. Error: %2").arg(u"RequestBusy"_s
, reply.error().message()), Log::WARNING);
m_state = Error;
}
else
{
m_state = Busy;
m_fd = reply.value();
qDebug("D-Bus: PowerManagementInhibitor: Request successful, cookie is %d", m_cookie);
if (m_intendedState == Idle)
requestIdle();
}
}
else
{ {
const QDBusPendingReply<quint32> reply = *call; const QDBusPendingReply<quint32> reply = *call;
@ -146,6 +194,7 @@ void PowerManagementInhibitor::onAsyncReply(QDBusPendingCallWatcher *call)
requestIdle(); requestIdle();
} }
} }
}
else else
{ {
const QDBusPendingReply reply = *call; const QDBusPendingReply reply = *call;

5
src/gui/powermanagement/powermanagement_x11.h

@ -28,6 +28,7 @@
#pragma once #pragma once
#include <QDBusUnixFileDescriptor>
#include <QObject> #include <QObject>
class QDBusInterface; class QDBusInterface;
@ -61,7 +62,8 @@ private:
enum class ManagerType enum class ManagerType
{ {
Freedesktop, // https://www.freedesktop.org/wiki/Specifications/power-management-spec/ 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 Gnome, // https://github.com/GNOME/gnome-settings-daemon/blob/master/gnome-settings-daemon/org.gnome.SessionManager.xml
Systemd // https://www.freedesktop.org/software/systemd/man/org.freedesktop.login1.html
}; };
QDBusInterface *m_busInterface = nullptr; QDBusInterface *m_busInterface = nullptr;
@ -70,4 +72,5 @@ private:
enum State m_state = Error; enum State m_state = Error;
enum State m_intendedState = Idle; enum State m_intendedState = Idle;
quint32 m_cookie = 0; quint32 m_cookie = 0;
QDBusUnixFileDescriptor m_fd;
}; };

Loading…
Cancel
Save