]> git.donarmstrong.com Git - deb_pkgs/autorandr.git/commitdiff
Improve detection of $DISPLAY session owner
authorPhillip Berndt <phillip.berndt@googlemail.com>
Thu, 28 Jul 2016 17:35:17 +0000 (19:35 +0200)
committerPhillip Berndt <phillip.berndt@googlemail.com>
Thu, 28 Jul 2016 17:35:52 +0000 (19:35 +0200)
This closes bug #39.

contrib/pm-utils/40autorandr

index 4d59012515821c54d630eeda5987f4b5a9653361..ab022631eed93ff08638094a69cec93fbb1d86fc 100755 (executable)
@@ -8,28 +8,95 @@ 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
+               )"
+               user=
+               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
+
+       user=
+       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}"
-               # 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
+               user="$(find_user "$D")"
 
                if [ x"$user" != x"" ]; then
                        logger "autorandr: Changing display configuration for display :$D, user '$user'"