aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xbin/setup_screens166
1 files changed, 166 insertions, 0 deletions
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