#!/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
