#!/usr/bin/env bash # Script to setup screens on login and lid-switch-action # Uses autorandr to determine which screens are connected and which to setup. # # Per default a configuration named "default" will be used, if the computer is # a laptop and not docked. # A configuration named "docked-closed" will be used during login, when the lid # is closed and docked. # A configuration named "docked-all" will be used during login, when the lid # is open and docked. set -e -u lid_state="" fingerprint="" action="" x_user="" display="" current_user="" path="" # get DISPLAY number get_display() { display=$(pgrep -a Xorg|cut -d':' -f2| cut -d' ' -f1) } # get current user running X get_x_user() { x_user="$(loginctl list-sessions --no-legend| grep "seat"| awk '{print $3}')" } # get current user running this script get_current_user() { current_user="$(whoami)" } # get full path to this script get_path() { path="$0" } # Get current lid state ("open" or "closed") function get_lid_state() { if [ -r "/proc/acpi/button/lid/LID/state" ]; then lid_state="$(awk '{print $2}' /proc/acpi/button/lid/LID/state)" fi } # Get current docking state ("true" or "false") function is_docked() { if command -v busctl > /dev/null; then busctl introspect org.freedesktop.login1 /org/freedesktop/login1| grep -E '^.Docked'| awk '{print $4}' else echo false fi } # Get the md5sum of the current autorandr fingerprint function get_setup_fingerprint() { fingerprint="$(autorandr --fingerprint| md5sum| cut -d ' ' -f 1)" } # Get the md5sum of a autorandr configuration function get_configuration_fingerprint() { local fingerprint="" if [ -r "$HOME/.config/autorandr/$1/setup" ]; then fingerprint="$(md5sum "$HOME/.config/autorandr/$1/setup"| cut -d ' ' -f 1)" fi echo "$fingerprint" } function set_configuration() { local state=0 # if the computer is docked if is_docked ; then # if there's a lid-switch action if [ -n "$action" ]; then case "$action" in "open") if [ "$(get_configuration_fingerprint 'docked-all')" == "$fingerprint" ]; then echo "Loading docked-all." state=1 autorandr -l docked-all fi ;; "close") if [ "$(get_configuration_fingerprint 'docked-closed')" == "$fingerprint" ]; then echo "Loading docked-closed." state=1 autorandr -l docked-closed fi ;; esac else # check the lid state case "$lid_state" in "open") if [[ $(get_configuration_fingerprint "docked-all") == "$fingerprint" ]]; then echo "Loading docked-all." state=1 autorandr -l docked-all fi ;; "closed") if [[ $(get_configuration_fingerprint "docked-closed") == "$fingerprint" ]]; then echo "Loading docked-closed." state=1 autorandr -l docked-closed fi ;; *) echo "Your computer is docked but has no lid?!" exit 1 ;; esac fi # else if not docked else if [ "$action" = "open" ]; then if [[ $(get_configuration_fingerprint "external") == "$fingerprint" ]]; then echo "Loading external." state=1 autorandr -l external fi fi fi # if the screen still has not been setup, try using default if [ $state -ne 1 ]; then if [[ $(get_configuration_fingerprint "default") == "$fingerprint" ]]; then echo "Loading default." autorandr -l default fi fi } # check if autorandr is installed if [ ! -x "/usr/bin/autorandr" ]; then echo "Autorandr is not installed." exit 1 fi # get (lid-switch) action from parameter ("open" or "close") if [ "$#" -eq 1 ]; then action="$1" fi logger "Calling 'setup_screens'" get_x_user get_display get_current_user get_path # Export Xorg DISPLAY and XAUTHORITY export DISPLAY=":$display" export XAUTHORITY="/home/$x_user/.Xauthority" # if the script caller is the current X user or root (and lightdm is the current X user) if [ "$current_user" == "$x_user" ]; then get_lid_state get_setup_fingerprint set_configuration elif [ "$current_user" == "root" ]; then logger "Running $path as user $x_user now." runuser -l "$x_user" -c "$path" else echo "$current_user is not currently running X and is not allowed to let the current X user run this script." exit 1 fi exit 0