+find_user() {
+ # Determine user owning the display session from $1
+ D="$1"
+
+ # Prefer loginctl over all others, see bug #39
+ 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
+}
+