dotfiles/i3/screens.sh
M1dgard 21b0ddab32
Add an ad-hoc screen switching system
Write a script to switch monitors, and make Polybar play nice with it
2018-05-29 12:26:09 +02:00

136 lines
3.4 KiB
Bash
Executable file

#!/bin/bash
scriptdir="$(dirname "$0")"
source "$scriptdir/screen_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