From 8ca8512c44387e1c6492f162e0a16ca60ec59367 Mon Sep 17 00:00:00 2001 From: David Runge Date: Sun, 8 May 2016 16:22:41 +0200 Subject: bin/setup_screens: Adding (yet another) screen setup script. This time using autorandr and predefined configurations. --- bin/setup_screens | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100755 bin/setup_screens (limited to 'bin') diff --git a/bin/setup_screens b/bin/setup_screens new file mode 100755 index 0000000..1cdd143 --- /dev/null +++ b/bin/setup_screens @@ -0,0 +1,166 @@ +#!/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 + +get_x_user +get_current_user +get_path +# 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 + 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 -- cgit v1.2.3-70-g09d2