40 lines
1.7 KiB
QML
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);
|
|
}
|
|
}
|
|
}
|