#!/bin/sh # # 40autorandr: Change autorandr profile on thaw/resume exec > /var/log/autorandr.log 2>&1 AUTORANDR="autorandr -c --default default" # Work around #44: Long user names in w export PROCPS_USERLEN=32 find_user() { # Determine user owning the display session from $1 D="$1" # Prefer loginctl over all others, see bug #49 if [ -x "`which loginctl`" ]; then # Based on http://unix.stackexchange.com/questions/203844/how-to-find-out-the-current-active-xserver-display-number/204498 # by SO user intelfx user="$( loginctl list-sessions --no-legend | while read id uid user seat; do loginctl show-session -p Display -p Active "$id" | while IFS='=' read property value; do case "$property" in Active) if [ "$value" != "yes" ]; then continue fi ;; Display) if [ -n "$value" -a "$value" = "$D" ]; then echo $user fi ;; esac done done )" if [ -n "$user" ]; then echo $user return 0 fi fi # Prefer w to who, see bug #39 if [ -x "`which w`" ]; then user="`w -h | awk -vD="$D" '$2 ~ ":"D"(.[0-9])?$" || $3 ~ ":"D"(.[0-9])?$" {print $1}' | head -n1`" if [ -z "$user" ]; then # This fallback checks if there is exactly one user (except # root) logged in an interactive session and assumes the # session belongs to him. See bug #39. user="`w -hu | awk '/^\w+/ && $1 !~ "root" { users[$1]=$1; } ENDFILE { if(asort(users) == 1) for(u in users) print users[u]; }'`" fi else user="`who --all | awk -vD="$D" '$3 ~ ":"D"(.[0-9])?$" {print $1}' | head -1`" if [ -z "$user" ]; then # Same fallback as above; see bug #39. user="`who -u | awk '/^\w+/ && $1 !~ "root" { users[$1]=$1; } ENDFILE { if(asort(users) == 1) for(u in users) print users[u]; }'`" fi fi if [ -n "$user" ]; then echo $user return 0 fi # If none of the above worked, check if there is only one user owning # processes in $DISPLAY except root # # This code should be optimized somehow, but keep in mind that not all # systems symlink sh -> bash! OUTPUT="$( for p in /proc/*; do [ -d $p ] || continue d="$(awk -v RS='\0' -F= '$1=="DISPLAY" {print $2}' $p/environ 2>/dev/null)" if [ "$d" = "$D" ]; then stat -c %U $p fi done | sort | uniq | grep -v root | nl | head -n1 )" count=$(echo $OUTPUT | awk '{print $1}') user=$(echo $OUTPUT | awk '{print $2}') if [ "$count" -eq 1 ]; then echo $user return 0 fi return 1 } detect_display() { for X in /tmp/.X11-unix/X*; do D="${X##/tmp/.X11-unix/X}" user="$(find_user "$D")" if [ x"$user" != x"" ]; then logger "autorandr: Changing display configuration for display :$D, user '$user'" export DISPLAY=":$D" /bin/su -c "${AUTORANDR}" "$user" fi done } if grep -q systemd /proc/1/comm && [ "$2" = "udev" ]; then exec /bin/systemctl start autorandr-resume.service fi case "$1" in thaw|resume) detect_display ;; esac