pragma Singleton import QtQuick import Quickshell.Io import "." as S QtObject { id: root readonly property bool enabled: S.Modules.lock.enable property bool locked: false property string sessionPath: "" // Lock/unlock requests from logind signal lockRequested signal unlockRequested // Set logind LockedHint function setLockedHint(isLocked) { if (!sessionPath) return; root.locked = isLocked; _lockedHint.running = true; } // Check if session is currently locked (crash recovery) function checkLockState() { if (sessionPath) _lockStateCheck.running = true; } signal sessionLocked // fired if LockedHint is true on startup // Resolve the actual logind session object path at startup property Process _sessionResolver: Process { command: ["busctl", "call", "--system", "org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", "GetSession", "s", "auto"] running: root.enabled stdout: SplitParser { onRead: data => { const match = data.match(/"([^"]+)"/); if (match) root.sessionPath = match[1]; } } onExited: { if (root.sessionPath) { _logindMonitor.running = true; root.checkLockState(); } } } // Listen for logind Lock/Unlock signals via gdbus monitor. // TODO: replace with native D-Bus integration when nova-stats becomes a quickshell plugin property Process _logindMonitor: Process { command: ["gdbus", "monitor", "--system", "--dest", "org.freedesktop.login1", "--object-path", root.sessionPath] running: false stdout: SplitParser { onRead: data => { if (data.indexOf(".Lock ()") !== -1) root.lockRequested(); else if (data.indexOf(".Unlock ()") !== -1) root.unlockRequested(); } } } // Check if session is already locked on startup (crash recovery) property Process _lockStateCheck: Process { running: false command: ["busctl", "get-property", "--system", "org.freedesktop.login1", root.sessionPath, "org.freedesktop.login1.Session", "LockedHint"] stdout: SplitParser { onRead: data => { if (data.indexOf("true") !== -1) root.sessionLocked(); } } } // Set logind LockedHint property Process _lockedHint: Process { command: ["busctl", "call", "--system", "org.freedesktop.login1", root.sessionPath || "/org/freedesktop/login1/session/auto", "org.freedesktop.login1.Session", "SetLockedHint", "b", root.locked ? "true" : "false"] } }