From: Phillip Berndt Date: Thu, 28 Jul 2016 17:35:17 +0000 (+0200) Subject: Improve detection of $DISPLAY session owner X-Git-Tag: 1.0~18 X-Git-Url: https://git.donarmstrong.com/?p=deb_pkgs%2Fautorandr.git;a=commitdiff_plain;h=d0fb527ffd0c2a491fe5318af46104e9c607b5b1 Improve detection of $DISPLAY session owner This closes bug #39. --- diff --git a/contrib/pm-utils/40autorandr b/contrib/pm-utils/40autorandr index 4d59012..ab02263 100755 --- a/contrib/pm-utils/40autorandr +++ b/contrib/pm-utils/40autorandr @@ -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'"