# Screenlayout on Resume Mittels [[cn:it:thinkpad:dock|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.