From d4dde2c02de48a0a8d89662519f0bf22bdd570e1 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 27 Sep 2025 15:13:49 +1000 Subject: idlemonitor: handle logind lock/unlock Fixes #705 --- plugin/src/Caelestia/Internal/logindmanager.cpp | 65 +++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 plugin/src/Caelestia/Internal/logindmanager.cpp (limited to 'plugin/src/Caelestia/Internal/logindmanager.cpp') diff --git a/plugin/src/Caelestia/Internal/logindmanager.cpp b/plugin/src/Caelestia/Internal/logindmanager.cpp new file mode 100644 index 0000000..4194ee1 --- /dev/null +++ b/plugin/src/Caelestia/Internal/logindmanager.cpp @@ -0,0 +1,65 @@ +#include "logindmanager.hpp" + +#include +#include +#include +#include + +namespace caelestia::internal { + +LogindManager::LogindManager(QObject* parent) + : QObject(parent) { + auto bus = QDBusConnection::systemBus(); + if (!bus.isConnected()) { + qWarning() << "LogindManager::LogindManager: failed to connect to system bus:" << bus.lastError().message(); + return; + } + + bool ok = bus.connect("org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", + "PrepareForSleep", this, SLOT(handlePrepareForSleep(bool))); + + if (!ok) { + qWarning() << "LogindManager::LogindManager: failed to connect to PrepareForSleep signal:" + << bus.lastError().message(); + } + + QDBusInterface login1("org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", bus); + const QDBusReply reply = login1.call("GetSession", "auto"); + if (!reply.isValid()) { + qWarning() << "LogindManager::LogindManager: failed to get session path"; + return; + } + const auto sessionPath = reply.value().path(); + + ok = bus.connect("org.freedesktop.login1", sessionPath, "org.freedesktop.login1.Session", "Lock", this, + SLOT(handleLockRequested())); + + if (!ok) { + qWarning() << "LogindManager::LogindManager: failed to connect to Lock signal:" << bus.lastError().message(); + } + + ok = bus.connect("org.freedesktop.login1", sessionPath, "org.freedesktop.login1.Session", "Unlock", this, + SLOT(handleUnlockRequested())); + + if (!ok) { + qWarning() << "LogindManager::LogindManager: failed to connect to Unlock signal:" << bus.lastError().message(); + } +} + +void LogindManager::handlePrepareForSleep(bool sleep) { + if (sleep) { + emit aboutToSleep(); + } else { + emit resumed(); + } +} + +void LogindManager::handleLockRequested() { + emit lockRequested(); +} + +void LogindManager::handleUnlockRequested() { + emit unlockRequested(); +} + +} // namespace caelestia::internal -- cgit v1.2.3-freya