From 09449c0b37295c5ead24dc36aaf5440599ec7eaa Mon Sep 17 00:00:00 2001 From: Guillem CANAL Date: Thu, 22 Oct 2026 23:12:36 +0200 Subject: [PATCH] idle: retry suspend when a logind sleep inhibitor is released (#3866) (cherry picked from commit 668dde2a337acb0b6587e85cf54d9d53985dc373) --- quickshell/Services/IdleService.qml | 30 +++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/quickshell/Services/IdleService.qml b/quickshell/Services/IdleService.qml index 22ad5cd49..bbbfaff8a 100644 --- a/quickshell/Services/IdleService.qml +++ b/quickshell/Services/IdleService.qml @@ -67,6 +67,12 @@ Singleton { property bool isShellLocked: false property bool isSessionLockSecure: false property bool lockPowerOffRequested: false + property bool sleepBlocked: false + + function _updateSleepBlocked(blockInhibited) { + if (typeof blockInhibited === "string") + sleepBlocked = blockInhibited.split(":").includes("sleep"); + } function reapplyDpmsIfNeeded() { if (monitorsOff) @@ -170,6 +176,22 @@ Singleton { } } + Connections { + target: DMSService + + function onCapabilitiesReceived() { + if (!DMSService.capabilities.includes("dbus")) + return; + DMSService.dbusSubscribe("system", "org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.DBus.Properties", "PropertiesChanged"); + DMSService.dbusGetProperty("system", "org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", "BlockInhibited", r => root._updateSleepBlocked(r.result?.value)); + } + + function onDbusSignalReceived(subscriptionId, data) { + if (data.path === "/org/freedesktop/login1") + root._updateSleepBlocked(data.body?.[1]?.BlockInhibited); + } + } + Connections { target: root function onRequestMonitorOff() { @@ -197,5 +219,13 @@ Singleton { _rearmIdleMonitors(); } + onSleepBlockedChanged: { + log.info(sleepBlocked ? "Sleep blocked by logind inhibitor" : "Sleep inhibitor released"); + if (sleepBlocked || !suspendMonitor.enabled || !suspendMonitor.isIdle) + return; + log.info("Sleep inhibitor released while idle, retrying suspend"); + requestSuspend(); + } + Component.onCompleted: _applyMonitorEnableds() }