summaryrefslogtreecommitdiff
path: root/f7-script.sh
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