#!/bin/bash
# lid-display-watch
# Körs i bakgrunden (startas av sxwm via "exec"). Bevakar lockets
# state via systemd-logind (org.freedesktop.login1) och styr den
# interna skärmen automatiskt:
# - locket stängs -> försök stänga av eDP
# - locket öppnas -> slå på eDP igen
# internal-display vägrar redan stänga av eDP om den är den enda
# aktiva skärmen, så den spärren ärvs härifrån automatiskt.
LOCKFILE="$HOME/.cache/lid-display-watch.pid"
INTERNAL_DISPLAY="$HOME/.local/bin/internal-display"
INTERVAL=2
if [ -f "$LOCKFILE" ] && kill -0 "$(cat "$LOCKFILE" 2>/dev/null)" 2>/dev/null; then
exit 0
fi
mkdir -p "$(dirname "$LOCKFILE")"
echo $$ > "$LOCKFILE"
trap 'rm -f "$LOCKFILE"' EXIT
prev=""
while true; do
state=$(busctl get-property org.freedesktop.login1 /org/freedesktop/login1 \
org.freedesktop.login1.Manager LidClosed 2>/dev/null | awk '{print $2}')
if [ -n "$state" ] && [ "$state" != "$prev" ]; then
if [ "$state" = "true" ]; then
"$INTERNAL_DISPLAY" off
else
# eDP-panelen kan behöva en stund på sig att vakna/träna om
# sitt EDID efter att ha varit avstängd - ett modeset som
# skjuts iväg för tidigt kan landa som spegling/fel
# upplösning. Vänta lite och lägg på layouten två gånger.
sleep 1
"$INTERNAL_DISPLAY" on
sleep 1
"$INTERNAL_DISPLAY" on
fi
prev="$state"
fi
sleep "$INTERVAL"
done