3 # 40autorandr: Change autorandr profile on thaw/resume
4 exec > /var/log/autorandr.log 2>&1
6 AUTORANDR="autorandr -c --default default"
8 # Work around #44: Long user names in w
9 export PROCPS_USERLEN=32
12 # Determine user owning the display session from $1
15 # Prefer loginctl over all others, see bug #39
16 if [ -x "`which loginctl`" ]; then
17 # Based on http://unix.stackexchange.com/questions/203844/how-to-find-out-the-current-active-xserver-display-number/204498
20 loginctl list-sessions --no-legend | while read id uid user seat; do
21 session=$(loginctl show-session -p Display -p Active "$id")
22 first=$(echo $session | cut -d" " -f1)
23 second=$(echo $session | cut -d" " -f2)
25 if [ -n $(echo "$first" | grep "Display") ]; then
33 active_value=$(echo "$active" | cut -d"=" -f2)
34 display_value=$(echo "$display" | cut -d"=" -f2)
36 if [ "$active_value" != "yes" ]; then
40 if [ -n $display_value -a "$display_value" = "$D" ]; then
45 if [ -n "$user" ]; then
51 # Prefer w to who, see bug #39
52 if [ -x "`which w`" ]; then
53 user="`w -h | awk -vD="$D" '$2 ~ ":"D"(.[0-9])?$" || $3 ~ ":"D"(.[0-9])?$" {print $1}' | head -n1`"
55 if [ -z "$user" ]; then
56 # This fallback checks if there is exactly one user (except
57 # root) logged in an interactive session and assumes the
58 # session belongs to him. See bug #39.
59 user="`w -hu | awk '/^\w+/ && $1 !~ "root" { users[$1]=$1; } ENDFILE { if(asort(users) == 1) for(u in users) print users[u]; }'`"
62 user="`who --all | awk -vD="$D" '$3 ~ ":"D"(.[0-9])?$" {print $1}' | head -1`"
64 if [ -z "$user" ]; then
65 # Same fallback as above; see bug #39.
66 user="`who -u | awk '/^\w+/ && $1 !~ "root" { users[$1]=$1; } ENDFILE { if(asort(users) == 1) for(u in users) print users[u]; }'`"
70 if [ -n "$user" ]; then
75 # If none of the above worked, check if there is only one user owning
76 # processes in $DISPLAY except root
78 # This code should be optimized somehow, but keep in mind that not all
79 # systems symlink sh -> bash!
83 d="$(awk -v RS='\0' -F= '$1=="DISPLAY" {print $2}' $p/environ 2>/dev/null)"
84 if [ "$d" = "$D" ]; then
87 done | sort | uniq | grep -v root | nl | head -n1
89 count=$(echo $OUTPUT | awk '{print $1}')
90 user=$(echo $OUTPUT | awk '{print $2}')
92 if [ "$count" -eq 1 ]; then
102 for X in /tmp/.X11-unix/X*; do
103 D="${X##/tmp/.X11-unix/X}"
105 user="$(find_user ":$D")"
107 if [ x"$user" != x"" ]; then
108 logger "autorandr: Changing display configuration for display :$D, user '$user'"
110 /bin/su -c "${AUTORANDR}" "$user"
115 if grep -q systemd /proc/1/comm && [ "$2" = "udev" ]; then
116 exec /bin/systemctl start autorandr-resume.service