summaryrefslogtreecommitdiff
path: root/raveos-hyprland-theme/theme-data/dms/Services/IdleService.qml
diff options
context:
space:
mode:
authorNippy <nippy@rp1.hu>2026-05-08 19:50:49 +0200
committerNippy <nippy@rp1.hu>2026-05-08 19:50:49 +0200
commit3462bcc46ecf74f576ea4397f16492c16bd75b10 (patch)
treec5ab7aef4498647e057bda8d49c11e5f9dda74c9 /raveos-hyprland-theme/theme-data/dms/Services/IdleService.qml
parent56616f693b4f263cbf0d47da43b67424efa6022d (diff)
downloadRaveOS-PKGBUILD-3462bcc46ecf74f576ea4397f16492c16bd75b10.tar.gz
RaveOS-PKGBUILD-3462bcc46ecf74f576ea4397f16492c16bd75b10.zip
raveos update
Diffstat (limited to 'raveos-hyprland-theme/theme-data/dms/Services/IdleService.qml')
-rw-r--r--raveos-hyprland-theme/theme-data/dms/Services/IdleService.qml191
1 files changed, 191 insertions, 0 deletions
diff --git a/raveos-hyprland-theme/theme-data/dms/Services/IdleService.qml b/raveos-hyprland-theme/theme-data/dms/Services/IdleService.qml
new file mode 100644
index 0000000..9965e47
--- /dev/null
+++ b/raveos-hyprland-theme/theme-data/dms/Services/IdleService.qml
@@ -0,0 +1,191 @@
+pragma Singleton
+pragma ComponentBehavior: Bound
+
+import QtQuick
+import Quickshell
+import Quickshell.Wayland
+import qs.Common
+
+Singleton {
+ id: root
+
+ readonly property bool idleMonitorAvailable: {
+ try {
+ return typeof IdleMonitor !== "undefined";
+ } catch (e) {
+ return false;
+ }
+ }
+
+ readonly property bool idleInhibitorAvailable: {
+ try {
+ return typeof IdleInhibitor !== "undefined";
+ } catch (e) {
+ return false;
+ }
+ }
+
+ property bool enabled: true
+ property bool respectInhibitors: true
+ property bool _enableGate: true
+
+ readonly property bool externalInhibitActive: DMSService.screensaverInhibited
+
+ readonly property bool isOnBattery: BatteryService.batteryAvailable && !BatteryService.isPluggedIn
+ readonly property int monitorTimeout: isOnBattery ? SettingsData.batteryMonitorTimeout : SettingsData.acMonitorTimeout
+ readonly property int lockTimeout: isOnBattery ? SettingsData.batteryLockTimeout : SettingsData.acLockTimeout
+ readonly property int suspendTimeout: isOnBattery ? SettingsData.batterySuspendTimeout : SettingsData.acSuspendTimeout
+ readonly property int suspendBehavior: isOnBattery ? SettingsData.batterySuspendBehavior : SettingsData.acSuspendBehavior
+
+ readonly property bool mediaPlaying: MprisController.activePlayer !== null && MprisController.activePlayer.isPlaying
+
+ onMonitorTimeoutChanged: _rearmIdleMonitors()
+ onLockTimeoutChanged: _rearmIdleMonitors()
+ onSuspendTimeoutChanged: _rearmIdleMonitors()
+
+ function _rearmIdleMonitors() {
+ _enableGate = false;
+ Qt.callLater(() => {
+ _enableGate = true;
+ });
+ }
+
+ signal lockRequested
+ signal fadeToLockRequested
+ signal cancelFadeToLock
+ signal fadeToDpmsRequested
+ signal cancelFadeToDpms
+ signal requestMonitorOff
+ signal requestMonitorOn
+ signal requestSuspend
+
+ property var monitorOffMonitor: null
+ property var lockMonitor: null
+ property var suspendMonitor: null
+ property var lockComponent: null
+ property bool monitorsOff: false
+ property bool isShellLocked: false
+
+ function wake() {
+ requestMonitorOn();
+ }
+
+ function reapplyDpmsIfNeeded() {
+ if (monitorsOff)
+ CompositorService.powerOffMonitors();
+ }
+
+ function createIdleMonitors() {
+ if (!idleMonitorAvailable) {
+ console.info("IdleService: IdleMonitor not available, skipping creation");
+ return;
+ }
+
+ try {
+ const qmlString = `
+ import QtQuick
+ import Quickshell.Wayland
+
+ IdleMonitor {
+ enabled: false
+ respectInhibitors: true
+ timeout: 0
+ }
+ `;
+
+ monitorOffMonitor = Qt.createQmlObject(qmlString, root, "IdleService.MonitorOffMonitor");
+ monitorOffMonitor.timeout = Qt.binding(() => root.monitorTimeout > 0 ? root.monitorTimeout : 86400);
+ monitorOffMonitor.respectInhibitors = Qt.binding(() => root.respectInhibitors);
+ monitorOffMonitor.enabled = Qt.binding(() => root._enableGate && root.enabled && root.idleMonitorAvailable && root.monitorTimeout > 0);
+ monitorOffMonitor.isIdleChanged.connect(function () {
+ if (monitorOffMonitor.isIdle) {
+ if (SettingsData.fadeToDpmsEnabled) {
+ root.fadeToDpmsRequested();
+ } else {
+ root.requestMonitorOff();
+ }
+ } else {
+ if (SettingsData.fadeToDpmsEnabled) {
+ root.cancelFadeToDpms();
+ }
+ root.requestMonitorOn();
+ }
+ });
+
+ lockMonitor = Qt.createQmlObject(qmlString, root, "IdleService.LockMonitor");
+ lockMonitor.timeout = Qt.binding(() => root.lockTimeout > 0 ? root.lockTimeout : 86400);
+ lockMonitor.respectInhibitors = Qt.binding(() => root.respectInhibitors);
+ lockMonitor.enabled = Qt.binding(() => root._enableGate && root.enabled && root.idleMonitorAvailable && root.lockTimeout > 0);
+ lockMonitor.isIdleChanged.connect(function () {
+ if (lockMonitor.isIdle) {
+ if (SettingsData.fadeToLockEnabled) {
+ root.fadeToLockRequested();
+ } else {
+ root.lockRequested();
+ }
+ } else {
+ if (SettingsData.fadeToLockEnabled) {
+ root.cancelFadeToLock();
+ }
+ }
+ });
+
+ suspendMonitor = Qt.createQmlObject(qmlString, root, "IdleService.SuspendMonitor");
+ suspendMonitor.timeout = Qt.binding(() => root.suspendTimeout > 0 ? root.suspendTimeout : 86400);
+ suspendMonitor.respectInhibitors = Qt.binding(() => root.respectInhibitors);
+ suspendMonitor.enabled = Qt.binding(() => root._enableGate && root.enabled && root.idleMonitorAvailable && root.suspendTimeout > 0);
+ suspendMonitor.isIdleChanged.connect(function () {
+ if (suspendMonitor.isIdle) {
+ root.requestSuspend();
+ }
+ });
+ } catch (e) {
+ console.warn("IdleService: Error creating IdleMonitors:", e);
+ }
+ }
+
+ Connections {
+ target: root
+ function onRequestMonitorOff() {
+ monitorsOff = true;
+ CompositorService.powerOffMonitors();
+ }
+
+ function onRequestMonitorOn() {
+ monitorsOff = false;
+ CompositorService.powerOnMonitors();
+ }
+
+ function onRequestSuspend() {
+ SessionService.suspendWithBehavior(root.suspendBehavior);
+ }
+ }
+
+ onExternalInhibitActiveChanged: {
+ if (externalInhibitActive) {
+ const apps = DMSService.screensaverInhibitors.map(i => i.appName).join(", ");
+ console.info("IdleService: External idle inhibit active from:", apps || "unknown");
+ SessionService.idleInhibited = true;
+ SessionService.inhibitReason = "External app: " + (apps || "unknown");
+ } else {
+ console.info("IdleService: External idle inhibit released");
+ SessionService.idleInhibited = false;
+ SessionService.inhibitReason = "Keep system awake";
+ }
+ }
+
+ Component.onCompleted: {
+ if (!idleMonitorAvailable) {
+ console.warn("IdleService: IdleMonitor not available - power management disabled. This requires a newer version of Quickshell.");
+ } else {
+ console.info("IdleService: Initialized with idle monitoring support");
+ createIdleMonitors();
+ }
+
+ if (externalInhibitActive) {
+ const apps = DMSService.screensaverInhibitors.map(i => i.appName).join(", ");
+ SessionService.idleInhibited = true;
+ SessionService.inhibitReason = "External app: " + (apps || "unknown");
+ }
+ }
+}