#!/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 "internal" 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-open" will be used during login, when the lid # is open and docked. set -e -u lid_state="" docking_state="" fingerprint="" action="" x_user="" current_user="" path="" # 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="$(cat /proc/acpi/button/lid/LID/state|awk '{print $2}')" fi } # Get current docking state ("true" or "false") function get_docking_state() { if [ -x "/usr/bin/busctl" ]; then docking_state="$(busctl introspect org.freedesktop.login1 /org/freedesktop/login1|grep "\.Docked"|awk '{print $4}')" 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 [ "$docking_state" = "true" ]; then # if there's a lid-switch action if [ -n "$action" ]; then case "$action" in "open") if [ $(get_configuration_fingerprint "docked-open") = "$fingerprint" ]; then echo "Loading docked-open." state=1 autorandr -l docked-open 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-open") = "$fingerprint" ]; then echo "Loading docked-open." state=1 autorandr -l docked-open 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 internal if [ $state -ne 1 ]; then if [ $(get_configuration_fingerprint "internal") = "$fingerprint" ]; then echo "Loading internal." autorandr -l internal 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_current_user get_path # Export Xorg DISPLAY and XAUTHORITY export DISPLAY=$(ls /tmp/.X*|grep "lock"|cut -d '.' -f2| cut -d '-' -f1|sed -e 's/X/:/') export XAUTHORITY="$(eval echo ~$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" ] || [ $current_user = "root" -a $x_user = "lightdm" ]; then get_lid_state get_docking_state get_setup_fingerprint set_configuration else if [ $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 fi exit 0