From 186621ab812a8dcd36af5d35d711a84db0946038 Mon Sep 17 00:00:00 2001 From: bbedward Date: Thu, 2 Jul 2026 22:57:09 -0400 Subject: [PATCH] lock: set LockedHint when locking with loginctl lock integration - was previously read-only fixes #2732 --- core/internal/server/loginctl/actions.go | 13 +++++++++++++ core/internal/server/loginctl/handlers.go | 16 ++++++++++++++++ quickshell/Modules/Lock/Lock.qml | 7 +++++++ quickshell/Services/DMSService.qml | 6 ++++++ 4 files changed, 42 insertions(+) diff --git a/core/internal/server/loginctl/actions.go b/core/internal/server/loginctl/actions.go index 858248e9a..fddf7f3fe 100644 --- a/core/internal/server/loginctl/actions.go +++ b/core/internal/server/loginctl/actions.go @@ -46,6 +46,19 @@ func (m *Manager) Activate() error { return nil } +func (m *Manager) SetLockedHint(locked bool) error { + err := m.sessionObj.Call(dbusSessionInterface+".SetLockedHint", 0, locked).Err + if err != nil { + if refreshErr := m.refreshSessionBinding(); refreshErr == nil { + err = m.sessionObj.Call(dbusSessionInterface+".SetLockedHint", 0, locked).Err + } + if err != nil { + return fmt.Errorf("failed to set locked hint: %w", err) + } + } + return nil +} + func (m *Manager) SetIdleHint(idle bool) error { err := m.sessionObj.Call(dbusSessionInterface+".SetIdleHint", 0, idle).Err if err != nil { diff --git a/core/internal/server/loginctl/handlers.go b/core/internal/server/loginctl/handlers.go index 564e996df..ded5ed311 100644 --- a/core/internal/server/loginctl/handlers.go +++ b/core/internal/server/loginctl/handlers.go @@ -21,6 +21,8 @@ func HandleRequest(conn net.Conn, req models.Request, manager *Manager) { handleActivate(conn, req, manager) case "loginctl.setIdleHint": handleSetIdleHint(conn, req, manager) + case "loginctl.setLockedHint": + handleSetLockedHint(conn, req, manager) case "loginctl.setLockBeforeSuspend": handleSetLockBeforeSuspend(conn, req, manager) case "loginctl.setSleepInhibitorEnabled": @@ -78,6 +80,20 @@ func handleSetIdleHint(conn net.Conn, req models.Request, manager *Manager) { models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "idle hint set"}) } +func handleSetLockedHint(conn net.Conn, req models.Request, manager *Manager) { + locked, err := params.Bool(req.Params, "locked") + if err != nil { + models.RespondError(conn, req.ID, err.Error()) + return + } + + if err := manager.SetLockedHint(locked); err != nil { + models.RespondError(conn, req.ID, err.Error()) + return + } + models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "locked hint set"}) +} + func handleSetLockBeforeSuspend(conn net.Conn, req models.Request, manager *Manager) { enabled, err := params.Bool(req.Params, "enabled") if err != nil { diff --git a/quickshell/Modules/Lock/Lock.qml b/quickshell/Modules/Lock/Lock.qml index fb5750274..5dd94a0a6 100644 --- a/quickshell/Modules/Lock/Lock.qml +++ b/quickshell/Modules/Lock/Lock.qml @@ -49,6 +49,12 @@ Scope { lock(); } + function notifyLockedHint(locked: bool) { + if (!SettingsData.loginctlLockIntegration || !DMSService.isConnected) + return; + DMSService.setLockedHint(locked, () => {}); + } + function notifyLoginctl(lockAction: bool) { if (!SettingsData.loginctlLockIntegration || !DMSService.isConnected) return; @@ -217,6 +223,7 @@ Scope { target: sessionLock function onLockedChanged() { + notifyLockedHint(sessionLock.locked); if (sessionLock.locked) { pendingLock = false; if (lockPowerOffArmed && SettingsData.lockScreenPowerOffMonitorsOnLock) { diff --git a/quickshell/Services/DMSService.qml b/quickshell/Services/DMSService.qml index e1ef3b6e4..4f99fc93e 100644 --- a/quickshell/Services/DMSService.qml +++ b/quickshell/Services/DMSService.qml @@ -620,6 +620,12 @@ Singleton { sendRequest("loginctl.unlock", null, callback); } + function setLockedHint(locked, callback) { + sendRequest("loginctl.setLockedHint", { + "locked": locked + }, callback); + } + function bluetoothPair(devicePath, callback) { sendRequest("bluetooth.pair", { "device": devicePath