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.