1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2025-12-11 07:52:50 -05:00

Add systemd-inhibit widget

This commit is contained in:
bbedward
2025-08-15 21:52:44 -04:00
parent f67b90cfbe
commit af9607fdbe
6 changed files with 335 additions and 0 deletions

View File

@@ -0,0 +1,110 @@
import QtQuick
import Quickshell
import Quickshell.Io
import qs.Common
pragma Singleton
pragma ComponentBehavior: Bound
Singleton {
id: root
property bool inhibitorAvailable: true
property bool idleInhibited: false
property string inhibitReason: "Keep system awake"
signal inhibitorChanged()
function enableIdleInhibit() {
if (idleInhibited) return;
idleInhibited = true;
inhibitorChanged();
}
function disableIdleInhibit() {
if (!idleInhibited) return;
idleInhibited = false;
inhibitorChanged();
}
function toggleIdleInhibit() {
if (idleInhibited) {
disableIdleInhibit();
} else {
enableIdleInhibit();
}
}
function setInhibitReason(reason) {
inhibitReason = reason;
if (idleInhibited) {
const wasActive = idleInhibited;
idleInhibited = false;
Qt.callLater(() => {
if (wasActive) idleInhibited = true;
});
}
}
Process {
id: idleInhibitProcess
command: {
if (!idleInhibited) {
return ["true"];
}
return [
"systemd-inhibit",
"--what=idle",
"--who=quickshell",
"--why=" + inhibitReason,
"--mode=block",
"sleep", "infinity"
];
}
running: idleInhibited
onExited: function(exitCode) {
if (idleInhibited && exitCode !== 0) {
console.warn("IdleInhibitorService: Inhibitor process crashed with exit code:", exitCode);
idleInhibited = false;
ToastService.showWarning("Idle inhibitor failed");
}
}
}
IpcHandler {
function toggle() : string {
root.toggleIdleInhibit();
return root.idleInhibited ? "Idle inhibit enabled" : "Idle inhibit disabled";
}
function enable() : string {
root.enableIdleInhibit();
return "Idle inhibit enabled";
}
function disable() : string {
root.disableIdleInhibit();
return "Idle inhibit disabled";
}
function status() : string {
return root.idleInhibited ? "Idle inhibit is enabled" : "Idle inhibit is disabled";
}
function reason(newReason: string) : string {
if (!newReason) {
return "Current reason: " + root.inhibitReason;
}
root.setInhibitReason(newReason);
return "Inhibit reason set to: " + newReason;
}
target: "inhibit"
}
}