From: Stefan Tomanek Date: Sun, 24 Jan 2010 20:34:12 +0000 (+0100) Subject: initial commit X-Git-Tag: 1.0~177^2 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=c42f28bd014e70f905805ec0cd1c5ffb4f525d0c;p=deb_pkgs%2Fautorandr.git initial commit --- c42f28bd014e70f905805ec0cd1c5ffb4f525d0c diff --git a/auto-disper b/auto-disper new file mode 100755 index 0000000..0f8110f --- /dev/null +++ b/auto-disper @@ -0,0 +1,127 @@ +#!/bin/sh +# +# Automatically select a display configuration based on connected devives +# +# Stefan Tomanek +# +# 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 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 +# +# 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