Metainformationen zur Seite
Screenlayout on Resume
Mittels Dock-Undock-Events kann man sich entsprechend des Docked/Undocked-Status die Bildschirmkonfiguration einrichten lassen. Das ganze funktioniert aber nur bei einem laufenden System, während eines Suspend-to-{Dis, RAM} kann das System die ACPI Events nicht auswerten. Folgendes Skript mit dazu gehörendem systemd-Service schafft auch dafür Abhilfe.
Anpassungsskript
Das folgende Skript speichert bei einem Aufruf mit sleep das aktuelle Screenlayout mittels xrandr. Bei einem Aufruf mit resume wird das nun aktuelle Screenlayout mit dem gespeicherten verglichen. Hat sich während des Suspend-to-{Disk, RAM} etwas geändert, wird entsprechend der angeschlossenen Bildschirme ein weiteres Skript ausgeführt. Dieses Skript muss angepasst werden, bevor es lauffähig ist!
/home/user/.screenlayout/checklayout.sh
#!/bin/bash
# Check if layout changed after sleep
lastlayout=/tmp/screenlayout.$(whoami)
case "$1" in
sleep)
echo "$(xrandr -d :0.0)" > $lastlayout
;;
resume)
times=5
# Iterate 5 times to get changes
while [[ $times -gt 0 ]]; do
# Check layout
currentlayout=$(xrandr -d :0.0 -q)
if ! diff $lastlayout <(echo "$currentlayout"); then
if [[ $(echo "$currentlayout" | grep -E 'DP2-(1|2) connected' | wc -l) == 2 ]]; then
/home/user/.screenlayout/three-displays.sh
else
if [[ $(echo "$currentlayout" | grep ' connected' | wc -l) == 1 ]]; then
/home/user/.screenlayout/one-display.sh
fi
fi
# Exit while loop
break
fi
times=$(($times - 1))
# Wait for one second to continue
sleep 1
done
;;
esac
systemd-Service
Um das Skript nach und vor jedem Suspend-to-{Disk, RAM} aufzurufen, wird folgender systemd-Service verwendet:
/etc/systemd/system/screenlayout-on-resume.service
[Unit] Description=Screenlayout setter on Resume after Suspend Before=sleep.target StopWhenUnneeded=yes [Service] Type=oneshot User=user RemainAfterExit=yes Environment=DISPLAY=:0 ExecStart=/bin/bash /home/user/.screenlayout/checklayout.sh sleep ExecStop=/bin/bash /home/user/.screenlayout/checklayout.sh resume [Install] WantedBy=sleep.target
Mittels sudo systemctl enable screenlayout-on-resume.service wird dieser Service dann installiert.