nova-shell/shell/services/LockService.qml

88 lines
2.8 KiB
QML

pragma Singleton
import QtQuick
import Quickshell.Io
import "." as S
QtObject {
id: root
readonly property bool enabled: S.Modules.lock.enable
property string sessionPath: ""
// Lock/unlock requests from logind
signal lockRequested
signal unlockRequested
// Set logind LockedHint
function setLockedHint(locked) {
if (!sessionPath)
return;
_lockedHint._locked = locked;
_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 {
property bool _locked: false
command: ["busctl", "call", "--system", "org.freedesktop.login1", root.sessionPath || "/org/freedesktop/login1/session/auto", "org.freedesktop.login1.Session", "SetLockedHint", "b", _locked ? "true" : "false"]
}
}