From 64e478eafa2442352e7a0120d2679077a13775ba Mon Sep 17 00:00:00 2001 From: Valentin Korenjak Date: Fri, 20 Mar 2026 23:37:40 +0100 Subject: [PATCH] Poskus predelave na dbus msg (namesto sleep procesa). TODO: stestiraj do kraja. #10 --- projector.py | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/projector.py b/projector.py index be085eb..ab4690d 100755 --- a/projector.py +++ b/projector.py @@ -169,6 +169,7 @@ class SongProjector: """ Prepreči vklop ohranjevalnika zaslona ali spanja. """ + self.inhibitor_cookie = None try: if sys.platform.startswith("win"): # Windows: ES_CONTINUOUS | ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED @@ -176,14 +177,21 @@ class SongProjector: # Uporabimo c_uint za zagotovitev pravilnega tipa ctypes.windll.kernel32.SetThreadExecutionState(ctypes.c_uint(0x80000003)) elif sys.platform == "linux": - # Zaženi inhibitor, dokler tvoj program dela (hrani handle!) - inhibitor = subprocess.Popen([ - "gnome-session-inhibit", - "--inhibit", "idle", - "--inhibit", "suspend", - "--reason", "Projecting lyrics", - "sleep", "infinity" - ]) + # GNOME DBus inhibitor (org.gnome.SessionManager) + # Flags: 1=logout, 2=switch user, 4=suspend, 8=idle + # Uporabimo 12 (4+8) za suspend in idle. + # toplevel_xid=0 (uint32:0) + cmd = [ + "dbus-send", "--print-reply", "--dest=org.gnome.SessionManager", + "/org/gnome/SessionManager", "org.gnome.SessionManager.Inhibit", + "string:projector", "uint32:0", "string:Projecting lyrics", "uint32:12" + ] + output = subprocess.check_output(cmd, stderr=subprocess.STDOUT).decode() + # Output format: uint32 12345678 + for line in output.splitlines(): + if "uint32" in line: + self.inhibitor_cookie = line.split()[-1] + break except Exception as e: print(f"Napaka pri preprečevanju spanja: {e}") @@ -510,13 +518,13 @@ class SongProjector: pass elif sys.platform == "linux": try: - # Ponovno vklopi ohranjevalnik in DPMS (privzete vrednosti) - subprocess.Popen(["xset", "s", "on", "+dpms"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) - - # Za Wayland/DBus inhibit običajno ni treba eksplicitno sprostiti, - # če se proces konča, vendar bi za popolnost lahko uporabili UnInhibit, - # če bi shranili cookie. Ker ga nismo, se zanašamo na to, da DBus - # samodejno sprosti inhibit ob zaprtju povezave/procesa. + # Sprostimo DBus inhibitor, če ga imamo + if hasattr(self, "inhibitor_cookie") and self.inhibitor_cookie: + subprocess.Popen([ + "dbus-send", "--dest=org.gnome.SessionManager", + "/org/gnome/SessionManager", "org.gnome.SessionManager.UnInhibit", + f"uint32:{self.inhibitor_cookie}" + ], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) except: pass