blob: 324043241170f92e2810b2e1685dbc3dcb28f4b6 (
plain) (
blame)
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
|
#!/bin/bash
set -e
outputs=($(xrandr --query | awk '/^[^ ]+ connected / { print $1 }'))
echo ${#outputs[@]}
echo ${outputs[1]}
exit 0
INTERNAL=$(xrandr --query | awk '/^\w+-?[0-9] connected /{ print $1; exit }')
EXTERNAL=$(xrandr --query | awk '/^\w+-?[0-9] connected /{print $1; exit }')
if [ -z "$INTERNAL" ] ; then
echo "WARN: No internal screen."
fi
if [ -z "$EXTERNAL" ] ; then
echo "WARN: No external screen."
fi
echo $INTERNAL $EXTERNAL
return 0
show_usage() {
cat <<END
Screen switch helper script.
Usage: $0 <command>
commands:
toggle
external
internal
mirror
END
}
screen_external() {
xrandr --output "$INTERNAL" --off
xrandr --output "$EXTERNAL" --auto
}
screen_internal() {
xrandr --output "$INTERNAL" --auto
xrandr --output "$EXTERNAL" --off
}
screen_mirror() {
xrandr --output "$INTERNAL" --auto
xrandr --output "$EXTERNAL" --auto --same-as "$INTERNAL"
}
screen_toggle() {
case "$STATE" in
internal)
screen_external
;;
external)
screen_internal
;;
mirror)
screen_external
;;
*)
screen_internal
;;
esac
}
screen_get_state() {
SCREEN="$1"
if [ -z "$SCREEN" ] ; then
echo ""
return
fi
xrandr --query | grep "^$SCREEN"
#xrandr --query | grep "^$SCREEN" | grep connected | sed 's/.*connected\s*\([^ ]\+\).*/\1/' | grep -o '[0-9]*x[0-9]*' || echo
}
is_connected() {
echo "$1" | grep ' connected' >/dev/null && echo 1 || echo
}
is_active() {
echo "$1" | grep connected | sed 's/.*connected\s*\([^ ]\+\).*/\1/' | grep -o '[0-9]*x[0-9]*' || echo
}
INTERNAL_STATE=$(screen_get_state "$INTERNAL")
EXTERNAL_STATE=$(screen_get_state "$EXTERNAL")
EXTERNAL_CONNECTED=$(is_connected "$EXTERNAL_STATE")
if [ -z "$EXTERNAL_CONNECTED" ] ; then
screen_internal
exit 0
fi
INTERNAL_STATE=$(is_active "$INTERNAL_STATE")
EXTERNAL_STATE=$(is_active "$EXTERNAL_STATE")
if [ -z "$INTERNAL_STATE" ] ; then
STATE="external"
elif [ -z "$EXTERNAL_STATE" ] ; then
STATE="internal"
else
STATE="mirror"
fi
DO="$1"
if [ -z "$DO" ] ; then
DO="toggle"
fi
case "$DO" in
toggle)
screen_toggle
;;
internal)
screen_internal
;;
external)
screen_external
;;
mirror)
screen_mirror
;;
*)
show_usage >&2
;;
esac
|