135 lines
3.4 KiB
Bash
Executable file
135 lines
3.4 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
scriptdir="$(dirname "$0")"
|
|
|
|
source "$scriptdir/monitors_config"
|
|
[[ -n $builtin ]] || { echo "builtin empty"; exit 1; }
|
|
[[ -n $ext1 ]] || { echo "ext1 empty"; exit 1; }
|
|
[[ -n $ext2 ]] || { echo "ext2 empty"; exit 1; }
|
|
|
|
xq="$(xrandr --query)"
|
|
xlm="$(xrandr --listmonitors)"
|
|
|
|
card() { echo "$xq" | grep -qF "$1"; }
|
|
conn() { echo "$xq" | grep -qF "$1 connected"; }
|
|
actv() { echo "$xlm" | grep -qF "$1"; }
|
|
|
|
should_exist() {
|
|
for i in "$@"; do
|
|
card "$i" || { echo "$i not on video card, refusing to do anything"; exit 1; }
|
|
done
|
|
}
|
|
should_exist "$builtin" "$ext1" "$ext2"
|
|
|
|
trigger_change_and_exit() {
|
|
"$scriptdir/../polybar/launch.sh" & disown
|
|
exit
|
|
}
|
|
|
|
single_screen() {
|
|
one="$1"
|
|
off1="$2"
|
|
off2="$3"
|
|
|
|
xrandr \
|
|
--output "$one" --auto --primary \
|
|
--output "$off1" --off \
|
|
--output "$off2" --off
|
|
notify-send "Only $screen connected" "Disabled all outputs except for $screen."
|
|
trigger_change_and_exit
|
|
}
|
|
|
|
toggle_two_screens() {
|
|
one="$1"
|
|
two="$2"
|
|
off="$3"
|
|
|
|
if actv "$one" && actv "$two"; then
|
|
xrandr \
|
|
--output "$one" --off \
|
|
--output "$two" --auto --primary \
|
|
--output "$off" --off
|
|
elif ! actv "$one" && actv "$two"; then
|
|
xrandr \
|
|
--output "$one" --auto --primary \
|
|
--output "$two" --off \
|
|
--output "$off" --off
|
|
else
|
|
xrandr \
|
|
--output "$one" --auto --primary \
|
|
--output "$two" --auto --left-of "$builtin" \
|
|
--output "$off" --off
|
|
fi
|
|
trigger_change_and_exit
|
|
}
|
|
|
|
toggle_three_screens() {
|
|
one="$1"
|
|
two="$2"
|
|
three="$3"
|
|
|
|
if actv "$one" && actv "$two" && actv "$three"; then
|
|
xrandr \
|
|
--output "$one" --off \
|
|
--output "$two" --auto --primary \
|
|
--output "$three" --auto --left-of "$two"
|
|
elif ! actv "$one" && actv "$two" && actv "$three"; then
|
|
xrandr \
|
|
--output "$one" --auto --primary \
|
|
--output "$two" --off \
|
|
--output "$three" --auto --left-of "$one"
|
|
elif actv "$one" && ! actv "$two" && actv "$three"; then
|
|
xrandr \
|
|
--output "$one" --auto --primary \
|
|
--output "$two" --auto --left-of "$one" \
|
|
--output "$three" --off
|
|
elif actv "$one" && actv "$two" && ! actv "$three"; then
|
|
xrandr \
|
|
--output "$one" --auto --primary \
|
|
--output "$two" --off \
|
|
--output "$three" --off
|
|
elif actv "$one" && ! actv "$two" && ! actv "$three"; then
|
|
xrandr \
|
|
--output "$one" --off \
|
|
--output "$two" --auto --primary \
|
|
--output "$three" --off
|
|
elif ! actv "$one" && actv "$two" && ! actv "$three"; then
|
|
xrandr \
|
|
--output "$one" --off \
|
|
--output "$two" --off \
|
|
--output "$three" --auto --primary
|
|
else
|
|
xrandr \
|
|
--output "$one" --auto --primary \
|
|
--output "$two" --auto --left-of "$one" \
|
|
--output "$three" --auto --left-of "$two"
|
|
fi
|
|
trigger_change_and_exit
|
|
}
|
|
|
|
# Only builtin connected
|
|
if conn "$builtin" && ! conn "$ext1" && ! conn "$ext2"; then
|
|
single_screen "$builtin" "$ext1" "$ext2"
|
|
fi
|
|
|
|
# Only builtin and ext1 connected
|
|
if conn "$builtin" && conn "$ext1" && ! conn "$ext2"; then
|
|
toggle_two_screens "$builtin" "$ext1" "$ext2"
|
|
fi
|
|
|
|
# Only builtin and ext2 connected
|
|
if conn "$builtin" && ! conn "$ext1" && conn "$ext2"; then
|
|
toggle_two_screens "$builtin" "$ext2" "$ext1"
|
|
fi
|
|
|
|
# Builtin, ext1 and ext2 connected
|
|
if conn "$builtin" && conn "$ext1" && conn "$ext2"; then
|
|
toggle_three_screens "$builtin" "$ext1" "$ext2"
|
|
fi
|
|
|
|
# Other cases: something's wrong, try enabling all displays
|
|
xrandr \
|
|
--output "$builtin" --auto --primary \
|
|
--output "$ext1" --auto \
|
|
--output "$ext2" --auto
|
|
|