]> git.donarmstrong.com Git - deb_pkgs/autorandr.git/commitdiff
initial commit
authorStefan Tomanek <stefan.tomanek@wertarbyte.de>
Sun, 24 Jan 2010 20:34:12 +0000 (21:34 +0100)
committerStefan Tomanek <stefan.tomanek@wertarbyte.de>
Tue, 26 Jan 2010 21:49:52 +0000 (22:49 +0100)
auto-disper [new file with mode: 0755]

diff --git a/auto-disper b/auto-disper
new file mode 100755 (executable)
index 0000000..0f8110f
--- /dev/null
@@ -0,0 +1,127 @@
+#!/bin/sh
+#
+# Automatically select a display configuration based on connected devives
+#
+# Stefan Tomanek <stefan.tomanek@wertarbyte.de>
+#
+# requires disper, the command line display switcher:
+# http://willem.engen.nl/projects/disper/
+#
+#
+# How to use:
+#
+# Save your current display configuration and setup with
+# auto-disper --save mobil
+#
+# Connect an additional display, configure your setup and save it
+# auto-disper --save docked
+#
+# Now auto-disper can detect which hardware setup is active: # auto-disper
+# mobile
+# docked (detected)
+#
+# To automatically reload your setup, just append --change to the command line
+#
+# To manually load a profile, you can use the --load <profile> option.
+#
+# To prevent a profile from being loaded, place a script call "block" in its
+# directory. The script is evaluated before the screen setup is inspected, and
+# in case of it returning a value of 0 the profile is skipped. This can be used
+# to query the status of a docking station you are about to leave.
+#
+# If no suitable profile can be identified, the current configuration is kept.
+# To change this behaviour and switch to a fallback configuration, specify
+# --default <profile>
+#
+# Another script called "postswitch "can be placed in the directory
+# ~/.auto-disper as well as in all profile directories: The scripts are
+# executed after a mode switch has taken place and can notify window managers
+# or other applications about it.
+
+DISPER=/usr/bin/disper
+PROFILES=~/.auto-disper/
+
+CHANGE_PROFILE=0
+DEFAULT_PROFILE=""
+SAVE_PROFILE=""
+
+blocked() {
+    local PROFILE="$1"
+    [ ! -x "$PROFILES/$PROFILE/block" ] && return 1
+
+    "$PROFILES/$PROFILE/block"  "$PROFILE"
+}
+
+load() {
+    local PROFILE="$1"
+    if [ "$CHANGE_PROFILE" -eq 1 ]; then
+        echo " -> loading profile $PROFILE"
+        $DISPER -i < "$PROFILES/$PROFILE/config"
+
+        [ -x "$PROFILES/$PROFILE/postswitch" ] && \
+            "$PROFILES/$PROFILE/postswitch" "$PROFILE"
+        [ -x "$PROFILES/postswitch" ] && \
+            "$PROFILES/postswitch" "$PROFILE"
+    fi
+}
+
+# process parameters
+OPTS=$(getopt -n auto-disper -o s:l:d:c --long change,default:,save:,load: -- "$@")
+if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
+eval set -- "$OPTS"
+
+while true; do
+    case "$1" in
+        -c|--change) CHANGE_PROFILE=1; shift ;;
+        -d|--default) DEFAULT_PROFILE="$2"; shift 2 ;;
+        -s|--save) SAVE_PROFILE="$2"; shift 2 ;;
+        -l|--load) LOAD_PROFILE="$2"; shift 2 ;;
+        --) shift; break ;;
+        *) echo "Error: $1"; exit 1;;
+    esac
+done
+
+CURRENT_SETUP="$($DISPER -l | grep '^display ')"
+
+if [ -n "$SAVE_PROFILE" ]; then
+    echo "Saving current configuration as profile '${SAVE_PROFILE}'"
+    mkdir -p "$PROFILES/$SAVE_PROFILE"
+    echo "$CURRENT_SETUP" > "$PROFILES/$SAVE_PROFILE/setup"
+    $DISPER -p > "$PROFILES/$SAVE_PROFILE/config"
+    exit 0
+fi
+
+if [ -n "$LOAD_PROFILE" ]; then
+    CHANGE_PROFILE=1 load "$LOAD_PROFILE"
+    exit $?
+fi
+
+for SETUP_FILE in $PROFILES/*/setup; do
+    if ! [ -e $SETUP_FILE ]; then
+        break
+    fi
+    PROFILE="$(basename $(dirname "$SETUP_FILE"))"
+    echo -n "$PROFILE"
+
+    if blocked "$PROFILE"; then
+        echo " (blocked)"
+        continue
+    fi
+
+    FILE_SETUP="$(cat "$PROFILES/$PROFILE/setup")"
+    if [ "$CURRENT_SETUP" = "$FILE_SETUP" ]; then
+        echo " (detected)"
+        load "$PROFILE"
+        # found the profile, exit with success
+        exit 0
+    else
+        echo ""
+    fi
+done
+
+# we did not find the profile, load default
+if [ -n "$DEFAULT_PROFILE" ]; then
+    echo "No suitable profile detected, falling back to $DEFAULT_PROFILE"
+    load "$DEFAULT_PROFILE"
+fi
+exit 1