+++ /dev/null
-#!/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
#
# How to use:
#
-# Save your current display configuration and setup with
-# autorandr --save mobile
+# Save your current display configuration and setup with:
+# $ autorandr --save mobile
#
-# Connect an additional display, configure your setup and save it
-# autorand --save docked
+# Connect an additional display, configure your setup and save it:
+# $ autorandr --save docked
#
# Now autorandr can detect which hardware setup is active:
-# # autorandr
-# mobile
-# docked (detected)
+# $ autorandr
+# 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.
#
# autorandr tries to avoid reloading an identical configuration. To force the
-# configuration, apply --force.
+# (re)configuration, apply --force.
#
# 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
# --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.
+# ~/.autorandr 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.
+#
+#
+# While the script uses xrandr by defult, calling it by the name "autodisper"
+# or "auto-disper" forces it to use the "disper" utility, which is useful for
+# controlling nvidia chipsets. The formats for fingerprinting the current setup
+# and saving/loading the current configuration are adjusted accordingly.
XRANDR=/usr/bin/xrandr
+DISPER=/usr/bin/disper
PROFILES=~/.autorandr/
CONFIG=~/.autorandr.conf
SAVE_PROFILE=""
FP_METHODS="setup_fp_xrandr_edid setup_fp_sysfs_edid"
+CURRENT_CFG_METHOD="current_cfg_xrandr"
+LOAD_METHOD="load_cfg_xrandr"
+
+SCRIPTNAME="$(basename $0)"
+# when called as autodisper/auto-disper, we assume different defaults
+if [ "$SCRIPTNAME" = "auto-disper" ] || [ "$SCRIPTNAME" = "autodisper" ]; then
+ FP_METHODS="setup_fp_disper"
+ CURRENT_CFG_METHOD="current_cfg_disper"
+ LOAD_METHOD="load_cfg_disper"
+fi
test -f $CONFIG && . $CONFIG
done
}
+setup_fp_disper() {
+ $DISPER -l | grep '^display '
+}
+
setup_fp() {
local FP="";
for M in $FP_METHODS; do
echo "$FP"
}
-
-current_cfg() {
+current_cfg_xrandr() {
$XRANDR -q | awk '
/^[^ ]+ disconnected / {
print "output "$1;
}'
}
+current_cfg_disper() {
+ $DISPER -p
+}
+
+current_cfg() {
+ $CURRENT_METHOD;
+}
+
blocked() {
local PROFILE="$1"
[ ! -x "$PROFILES/$PROFILE/block" ] && return 1
fi
}
+load_cfg_xrandr() {
+ sed 's!^!--!' "$1" | xargs $XRANDR
+}
+
+load_cfg_disper() {
+ $DISPER < -i < "$1"
+}
+
load() {
local PROFILE="$1"
- if [ -e "$PROFILES/$PROFILE/config" ] ; then
+ local CONF="$PROFILES/$PROFILE/config"
+ if [ -e "$CONF" ] ; then
echo " -> loading profile $PROFILE"
- sed 's!^!--!' "$PROFILES/$PROFILE/config" | xargs xrandr
+ $LOAD_METHOD "$CONF"
[ -x "$PROFILES/$PROFILE/postswitch" ] && \
"$PROFILES/$PROFILE/postswitch" "$PROFILE"
help() {
cat <<EOH
-Usage: autorandr [options]
+Usage: $SCRIPTNAME [options]
-h, --help get this small help
-c, --change reload current setup
--default <profile>.
Another script called "postswitch "can be placed in the directory
- ~/.auto-disper as well as in any profile directories: The scripts are executed
+ ~/.autorandr as well as in any profile directories: The scripts are executed
after a mode switch has taken place and can notify window managers.
+ When called by the name "autodisper" or "auto-disper", the script uses "disper"
+ instead of "xrandr" to detect, configure and save the display configuration.
+
EOH
exit
}