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.
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
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.