From 17ae5439bd96d9de783c213a8d48322ed4ab23fd Mon Sep 17 00:00:00 2001 From: Kiwy Player Date: Sat, 17 Jan 2026 19:02:00 +0200 Subject: [PATCH] Add screen keep-alive functionality to prevent display sleep - Created .keep-screen-alive.sh wrapper script with multiple methods: * systemd-inhibit (primary - prevents OS-level sleep/suspend) * xset commands (prevents X11 screensaver) * Mouse movement (prevents idle timeout) - Added screen-keepalive.service systemd unit: * Runs xset s reset every 30 seconds * Auto-restarts on failure * Integrated with graphical session - Multiple layers of screen protection: * HDMI blanking disabled * CPU power saving disabled * System sleep/suspend disabled * X11 screensaver disabled * DPMS (Display Power Management) disabled * Display forced on periodically Screen will now remain active while player is running, preventing lockups or blank screens during playback. --- .keep-screen-alive.sh | 54 ++++++++++++++++++++++++++++ .player_heartbeat | 2 +- install.sh | 84 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 139 insertions(+), 1 deletion(-) create mode 100755 .keep-screen-alive.sh diff --git a/.keep-screen-alive.sh b/.keep-screen-alive.sh new file mode 100755 index 0000000..3616090 --- /dev/null +++ b/.keep-screen-alive.sh @@ -0,0 +1,54 @@ +#!/bin/bash +# Keep-screen-alive wrapper for player +# Prevents screen from locking/turning off while player is running + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +# Function to keep screen awake +keep_screen_awake() { + while true; do + # Move mouse slightly to prevent idle + if command -v xdotool &> /dev/null; then + xdotool mousemove_relative 1 1 + xdotool mousemove_relative -1 -1 + fi + + # Disable DPMS and screensaver periodically + if command -v xset &> /dev/null; then + xset s reset + xset dpms force on + fi + + sleep 30 + done +} + +# Function to inhibit systemd sleep (if available) +inhibit_sleep() { + if command -v systemd-inhibit &> /dev/null; then + # Run player under systemd inhibit to prevent sleep + systemd-inhibit --what=sleep --why="Signage player running" \ + bash "$SCRIPT_DIR/start.sh" + return $? + fi + return 1 +} + +# Try systemd inhibit first (most reliable) +if inhibit_sleep; then + exit 0 +fi + +# Fallback: Start keep-alive in background +keep_screen_awake & +KEEPALIVE_PID=$! + +# Start the player +cd "$SCRIPT_DIR" +bash start.sh +PLAYER_EXIT=$? + +# Kill keep-alive when player exits +kill $KEEPALIVE_PID 2>/dev/null || true + +exit $PLAYER_EXIT diff --git a/.player_heartbeat b/.player_heartbeat index c7df7fb..24fba67 100644 --- a/.player_heartbeat +++ b/.player_heartbeat @@ -1 +1 @@ -1768668626.7380302 \ No newline at end of file +1768669315.640205 \ No newline at end of file diff --git a/install.sh b/install.sh index bf334f9..4fb1cc9 100644 --- a/install.sh +++ b/install.sh @@ -232,6 +232,90 @@ EOF echo "✓ X11 screensaver disabled in .xinitrc" fi + # Create screen keep-alive wrapper script + echo "Creating screen keep-alive service..." + KEEPALIVE_SCRIPT="$SCRIPT_DIR/.keep-screen-alive.sh" + cat > "$KEEPALIVE_SCRIPT" << 'EOF' +#!/bin/bash +# Keep-screen-alive wrapper for player +# Prevents screen from locking/turning off while player is running + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +# Function to keep screen awake +keep_screen_awake() { + while true; do + # Move mouse slightly to prevent idle + if command -v xdotool &> /dev/null; then + xdotool mousemove_relative 1 1 + xdotool mousemove_relative -1 -1 + fi + + # Disable DPMS and screensaver periodically + if command -v xset &> /dev/null; then + xset s reset + xset dpms force on + fi + + sleep 30 + done +} + +# Function to inhibit systemd sleep (if available) +inhibit_sleep() { + if command -v systemd-inhibit &> /dev/null; then + # Run player under systemd inhibit to prevent sleep + systemd-inhibit --what=sleep --why="Signage player running" \ + bash "$SCRIPT_DIR/start.sh" + return $? + fi + return 1 +} + +# Try systemd inhibit first (most reliable) +if inhibit_sleep; then + exit 0 +fi + +# Fallback: Start keep-alive in background +keep_screen_awake & +KEEPALIVE_PID=$! + +# Start the player +cd "$SCRIPT_DIR" +bash start.sh +PLAYER_EXIT=$? + +# Kill keep-alive when player exits +kill $KEEPALIVE_PID 2>/dev/null || true + +exit $PLAYER_EXIT +EOF + + chmod +x "$KEEPALIVE_SCRIPT" + echo "✓ Screen keep-alive service created" + + # Create systemd service to run keep-alive service + sudo tee /etc/systemd/system/screen-keepalive.service > /dev/null << EOF +[Unit] +Description=Keep Screen Awake During Signage Player +After=display-manager.service +PartOf=graphical-session.target + +[Service] +Type=simple +ExecStart=/bin/bash -c 'while true; do xset s reset 2>/dev/null; sleep 30; done' +Restart=always +RestartSec=5 + +[Install] +WantedBy=graphical-session.target +EOF + + sudo systemctl daemon-reload + sudo systemctl enable screen-keepalive.service + echo "✓ Systemd screen keep-alive service enabled" + echo "" echo "⚠️ Note: Some changes require a system reboot to take effect." echo "Please rerun this script after rebooting if power management issues persist."