#!/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 "$scriptdir/background.sh" exit } single_screen() { one="$1" off1="$2" off2="$3" xrandr \ --output "$one" --auto --primary \ --output "$off1" --off \ --output "$off2" --off notify-send -a 'Monitor layout toggler' -i display "Only $one connected" "Disabled all outputs except for $one." 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