Add screen activity signaler to prevent display sleep

- Added signal_screen_activity() method to SignagePlayer class
- Runs every 20 seconds automatically
- Also triggered on any touch/user input events

Multiple methods used to keep display awake:
- xset s reset - Resets screensaver timer
- xset dpms force on - Forces display on
- xdotool - Subtle mouse movement to trigger activity

This complements the system-level power management:
- Works alongside display power management settings
- Non-blocking and non-critical (fails gracefully)
- Signals every 20 seconds + on user input
- Prevents display from sleeping during playback

Screen should now remain active throughout media playback.
This commit is contained in:
Kiwy Player
2026-01-17 19:23:15 +02:00
parent 17ae5439bd
commit 8703350b23
3 changed files with 41 additions and 6 deletions

View File

@@ -910,6 +910,8 @@ class SignagePlayer(Widget):
self.schedule_hide_controls()
# Start heartbeat monitoring
Clock.schedule_interval(self.update_heartbeat, 10) # Update every 10 seconds
# Start screen activity signaler (keep display awake)
Clock.schedule_interval(self.signal_screen_activity, 20) # Signal every 20 seconds
def _update_size(self, instance, value):
self.size = value
@@ -925,6 +927,31 @@ class SignagePlayer(Widget):
except Exception as e:
Logger.warning(f"SignagePlayer: Failed to update heartbeat: {e}")
def signal_screen_activity(self, dt):
"""Signal screen activity to prevent power saving/sleep
Uses multiple methods to keep display awake:
1. xset s reset - Reset screensaver timeout
2. xset dpms force on - Force display on
3. xdotool - Move mouse to trigger activity
"""
try:
# Method 1: Reset screensaver timer using xset
os.system('xset s reset 2>/dev/null')
# Method 2: Force display on
os.system('xset dpms force on 2>/dev/null')
# Method 3: Move mouse slightly (subtle, user won't notice)
if os.system('xdotool mousemove_relative 1 1 2>/dev/null') == 0:
os.system('xdotool mousemove_relative -1 -1 2>/dev/null')
Logger.debug("SignagePlayer: Screen activity signal sent (display kept awake)")
except Exception as e:
Logger.debug(f"SignagePlayer: Screen activity signal failed (non-critical): {e}")
# Non-critical - continue if this fails
def initialize_player(self, dt):
"""Initialize the player - load config and start playlist checking"""
Logger.info("SignagePlayer: Initializing player...")
@@ -1502,12 +1529,14 @@ class SignagePlayer(Widget):
self.ids.status_label.opacity = 1
def on_touch_down(self, touch):
"""Handle touch - show controls"""
"""Handle touch - show controls and signal screen activity"""
self.signal_screen_activity(0) # Keep display awake on user input
self.show_controls()
return super(SignagePlayer, self).on_touch_down(touch)
def on_touch_move(self, touch):
"""Handle touch move - show controls"""
"""Handle touch move - show controls and signal screen activity"""
self.signal_screen_activity(0) # Keep display awake on user input
self.show_controls()
return super(SignagePlayer, self).on_touch_move(touch)