From ba8c4e60a182e896a4618cca0b003fbcc36d945e Mon Sep 17 00:00:00 2001 From: bbedward Date: Tue, 13 Oct 2026 10:18:12 -0400 Subject: [PATCH] lock: hold the fingerprint scan from a sleep request until PrepareForSleep fixes #3774 --- quickshell/Modules/Lock/Pam.qml | 2 +- quickshell/Services/SessionService.qml | 18 ++++++++++++++++++ .../lock/mocks/qs/Services/SessionService.qml | 1 + 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/quickshell/Modules/Lock/Pam.qml b/quickshell/Modules/Lock/Pam.qml index b55d240c1..0ff00340f 100644 --- a/quickshell/Modules/Lock/Pam.qml +++ b/quickshell/Modules/Lock/Pam.qml @@ -335,7 +335,7 @@ Scope { readonly property int verifyStartSlackMs: 10000 readonly property bool retrying: errorRetry.running readonly property int retryInterval: errorRetry.interval - readonly property bool allowed: available && SettingsData.enableFprint && root.lockSecured && !root.fprintSuppressedByPrimaryPam && !root.unlockInProgress && !root.u2fPending && !SessionService.preparingForSleep && !IdleService.monitorsOff && tries < SettingsData.maxFprintTries + readonly property bool allowed: available && SettingsData.enableFprint && root.lockSecured && !root.fprintSuppressedByPrimaryPam && !root.unlockInProgress && !root.u2fPending && !SessionService.preparingForSleep && !SessionService.sleepRequested && !IdleService.monitorsOff && tries < SettingsData.maxFprintTries readonly property string status: { if (!available || !SettingsData.enableFprint || !root.lockSecured || root.fprintSuppressedByPrimaryPam) return "disabled"; diff --git a/quickshell/Services/SessionService.qml b/quickshell/Services/SessionService.qml index 088a821f6..94cbedf57 100644 --- a/quickshell/Services/SessionService.qml +++ b/quickshell/Services/SessionService.qml @@ -35,6 +35,7 @@ Singleton { property bool idleHint: false property bool lockedHint: false property bool preparingForSleep: false + property bool sleepRequested: false property string sessionType: "" property string userName: "" property string seat: "" @@ -85,6 +86,21 @@ Singleton { onTriggered: root.flushPendingSleep() } + Timer { + id: sleepRequestTimeout + // A refused sleep or a command that skips logind never sends PrepareForSleep. + interval: 10000 + repeat: false + onTriggered: root.sleepRequested = false + } + + onPreparingForSleepChanged: { + if (!preparingForSleep) + return; + sleepRequestTimeout.stop(); + sleepRequested = false; + } + Process { id: detectEnvironmentProcess running: false @@ -506,6 +522,8 @@ printf 'uwsm=%s\nelogind=%s\nloginctl=%s\nsystemctl=%s\nusermgr=%s\nhibernate=%s function runSleepAction(run) { cancelPendingSleep(); + sleepRequested = true; + sleepRequestTimeout.restart(); if (!SleepLock.shouldWaitForLock(SettingsData.lockBeforeSuspend, IdleService.isSessionLockSecure)) { run(); return; diff --git a/quickshell/tests/lock/mocks/qs/Services/SessionService.qml b/quickshell/tests/lock/mocks/qs/Services/SessionService.qml index 805dc4734..703dd9292 100644 --- a/quickshell/tests/lock/mocks/qs/Services/SessionService.qml +++ b/quickshell/tests/lock/mocks/qs/Services/SessionService.qml @@ -3,6 +3,7 @@ import QtQuick QtObject { property bool preparingForSleep: false + property bool sleepRequested: false signal sessionResumed signal lidOpened }