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:
110
Services/IdleInhibitorService.qml
Normal file
110
Services/IdleInhibitorService.qml
Normal 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"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user