Files

40 lines
1.7 KiB
QML

pragma Singleton
// ─────────────────────────────────────────────────────────────────────────────
// Idle inhibit — the replacement for the GNOME Caffeine extension.
//
// Implemented with systemd-inhibit rather than the Wayland idle-inhibit
// protocol because the Wayland version is scoped to a surface (it would only
// hold while some window of ours is mapped) and it cannot block *sleep*, only
// the screensaver. A logind lock covers both, and outlives any UI.
// ─────────────────────────────────────────────────────────────────────────────
import Quickshell
import Quickshell.Io
import QtQuick
Singleton {
id: root
// Writable: the quick-settings tile and the bar indicator both bind to it.
property bool enabled: false
function toggle(): void {
root.enabled = !root.enabled;
}
// `sleep infinity` is the process the lock is held *for*: systemd releases
// the inhibitor when its child exits, so stopping this Process (SIGTERM)
// is all that's needed to drop it.
Process {
command: ["systemd-inhibit", "--what=idle:sleep", "--mode=block", "--who=Panama", "--why=Caffeine", "sleep", "infinity"]
running: root.enabled
onExited: (code, status) => {
// Only interesting if it died while we still wanted the lock.
if (root.enabled)
console.warn("Caffeine: systemd-inhibit exited unexpectedly, code", code);
}
}
}