forked from wertarbyte/auto-disper
-
Notifications
You must be signed in to change notification settings - Fork 0
/
auto-disper
executable file
·169 lines (153 loc) · 5.46 KB
/
auto-disper
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#!/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 alternate between the detected setup and a default one (such as your laptop
# screen, set DEFAULT_PROFILE below appropriately and use the --toggle command
# line option. This is useful to bind to a keyboard shortcut (via your desktop's
# global shortcuts bindings or similar).
#
# 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
XRANDR=/usr/bin/xrandr
PROFILES=~/.auto-disper/
# 0: no change, 1: switch to detected, 2: toggle between detected and default
CHANGE_PROFILE=0
DEFAULT_PROFILE="laptop"
SAVE_PROFILE=""
blocked() {
local PROFILE="$1"
[ ! -x "$PROFILES/$PROFILE/block" ] && return 1
"$PROFILES/$PROFILE/block" "$PROFILE"
}
load() {
local PROFILE="$1"
if [ "$CHANGE_PROFILE" -ge 1 ]; then
echo " -> loading profile $PROFILE"
$DISPER -i < "$PROFILES/$PROFILE/config"
#hack to add auto-rotate support (manual config):
if [ -f "$PROFILES/$PROFILE/xrandr-orientation" ]; then
$XRANDR --orientation $(cat "$PROFILES/$PROFILE/xrandr-orientation")
else
$XRANDR --orientation normal
fi
[ -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:cth --long toggle,change,default:,save:,load:,help -- "$@")
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 ;;
-t|--toggle) CHANGE_PROFILE=2; shift ;;
-h|--help) PRINT_HELP=1; shift ;;
--) shift; break ;;
*) echo "Error: $1"; exit 1;;
esac
done
if [ -n "$PRINT_HELP" ]; then
echo "auto-disper. Options:"
echo " -c --change Switch to auto-detected profile"
echo " -d --default Switch to default profile"
echo " -s --save NAME Save current configuration as profile NAME."
echo " -l --load NAME Load profile NAME."
echo " -t --toggle If the default profile is not current, switch to it."
echo "\t\t\tOtherwise, switch to auto-detected profile."
echo " -h --help Print this message."
exit 0
fi
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"
#Note: not really sure if we should search for "default", and this has no multi-display support:
XRANDR_ORIENTATION=$($XRANDR -q | grep default | cut -d ' ' -f4)
if [ "$XRANDR_ORIENTATION" != "(normal" ]; then
echo $XRANDR_ORIENTATION > "$PROFILES/$SAVE_PROFILE/xrandr-orientation"
fi
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)"
if [ "$CHANGE_PROFILE" -eq 1 ]; then
load "$PROFILE"
# found the profile, exit with success
exit 0
elif [ "$CHANGE_PROFILE" -eq 2 ]; then
ACTIVE_CONFIG="$($DISPER -p)"
FILE_CONFIG="$(cat "$PROFILES/$PROFILE/config")"
if [ "$ACTIVE_CONFIG" != "$FILE_CONFIG" ]; then
load "$PROFILE"
# found the profile, exit with success
exit 0
fi
fi
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