diff options
Diffstat (limited to 'raveos-gnome-theme/raveos-gnome-idle-blank')
| -rw-r--r-- | raveos-gnome-theme/raveos-gnome-idle-blank | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/raveos-gnome-theme/raveos-gnome-idle-blank b/raveos-gnome-theme/raveos-gnome-idle-blank new file mode 100644 index 0000000..06ee224 --- /dev/null +++ b/raveos-gnome-theme/raveos-gnome-idle-blank @@ -0,0 +1,101 @@ +#!/usr/bin/env python3 +import os +import sys + +import gi + +gi.require_version("Gio", "2.0") +from gi.repository import Gio, GLib + +DISPLAY_BUS = "org.gnome.Mutter.DisplayConfig" +DISPLAY_PATH = "/org/gnome/Mutter/DisplayConfig" +IDLE_BUS = "org.gnome.Mutter.IdleMonitor" +IDLE_PATH = "/org/gnome/Mutter/IdleMonitor/Core" +POLL_MS = 2000 +WAKE_MS = 1500 + + +def name_has_owner(bus, name): + try: + res = bus.call_sync( + "org.freedesktop.DBus", + "/org/freedesktop/DBus", + "org.freedesktop.DBus", + "NameHasOwner", + GLib.Variant("(s)", (name,)), + None, + Gio.DBusCallFlags.NONE, + 2000, + None, + ) + return bool(res.unpack()[0]) + except GLib.Error: + return False + + +def main(): + if "GNOME" not in os.environ.get("XDG_CURRENT_DESKTOP", ""): + return 0 + + try: + bus = Gio.bus_get_sync(Gio.BusType.SESSION, None) + except GLib.Error: + return 0 + + if name_has_owner(bus, "org.gnome.Shell.ScreenShield"): + return 0 + + settings = Gio.Settings.new("org.gnome.desktop.session") + state = {"off": False} + + def set_power(mode): + bus.call_sync( + DISPLAY_BUS, + DISPLAY_PATH, + "org.freedesktop.DBus.Properties", + "Set", + GLib.Variant( + "(ssv)", + (DISPLAY_BUS, "PowerSaveMode", GLib.Variant("i", mode)), + ), + None, + Gio.DBusCallFlags.NONE, + 2000, + None, + ) + + def get_idle_ms(): + res = bus.call_sync( + IDLE_BUS, + IDLE_PATH, + IDLE_BUS, + "GetIdletime", + None, + None, + Gio.DBusCallFlags.NONE, + 2000, + None, + ) + return int(res.unpack()[0]) + + def tick(): + try: + delay = settings.get_uint("idle-delay") + idle = get_idle_ms() + if delay > 0 and idle >= delay * 1000 and not state["off"]: + set_power(3) + state["off"] = True + elif state["off"] and idle < WAKE_MS: + set_power(0) + state["off"] = False + except GLib.Error: + pass + return True + + GLib.timeout_add(POLL_MS, tick) + GLib.MainLoop().run() + return 0 + + +if __name__ == "__main__": + sys.exit(main()) |