-
Notifications
You must be signed in to change notification settings - Fork 63
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge remote branch 'auto-disper/master' into randrdisper
- Loading branch information
Showing
1 changed file
with
127 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,127 @@ | ||
#!/bin/sh | ||
# | ||
# Automatically select a display configuration based on connected devives | ||
# | ||
# Stefan Tomanek <[email protected]> | ||
# | ||
# 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 |