Files

61 lines
2.3 KiB
Bash
Raw Permalink Normal View History

2026-09-14 15:31:20 -05:00
#!/usr/bin/env bash
# ---------------------------------------------------------------------------
# Minimal xrandr multi-monitor switcher.
# display auto | duplicate | extend | internal | external | list
# "internal" is whichever output name looks like a laptop panel.
# ---------------------------------------------------------------------------
set -uo pipefail
command -v xrandr >/dev/null || { echo "xrandr not installed" >&2; exit 1; }
mapfile -t CONNECTED < <(xrandr --query | awk '/ connected/{print $1}')
INTERNAL="$(printf '%s\n' "${CONNECTED[@]}" | grep -m1 -E '^(eDP|LVDS|DSI)' || true)"
[[ -z "$INTERNAL" ]] && INTERNAL="${CONNECTED[0]:-}"
mapfile -t EXTERNALS < <(printf '%s\n' "${CONNECTED[@]}" | grep -v "^${INTERNAL}$" || true)
reload_bar() { "$HOME/.config/polybar/launch.sh" >/dev/null 2>&1 & }
restore_bg() { "$HOME/.local/bin/set-wallpaper" >/dev/null 2>&1 & }
case "${1:-auto}" in
list)
xrandr --query | grep -E ' connected|disconnected' ; exit 0 ;;
internal)
args=(--output "$INTERNAL" --auto --primary)
for e in "${EXTERNALS[@]}"; do args+=(--output "$e" --off); done
xrandr "${args[@]}" ;;
external)
if [[ ${#EXTERNALS[@]} -eq 0 ]]; then echo "no external display connected" >&2; exit 1; fi
args=(--output "${EXTERNALS[0]}" --auto --primary --output "$INTERNAL" --off)
for e in "${EXTERNALS[@]:1}"; do args+=(--output "$e" --off); done
xrandr "${args[@]}" ;;
duplicate)
if [[ ${#EXTERNALS[@]} -eq 0 ]]; then echo "no external display connected" >&2; exit 1; fi
args=(--output "$INTERNAL" --auto --primary)
for e in "${EXTERNALS[@]}"; do args+=(--output "$e" --auto --same-as "$INTERNAL"); done
xrandr "${args[@]}" ;;
extend)
if [[ ${#EXTERNALS[@]} -eq 0 ]]; then echo "no external display connected" >&2; exit 1; fi
args=(--output "$INTERNAL" --auto --primary)
prev="$INTERNAL"
for e in "${EXTERNALS[@]}"; do
args+=(--output "$e" --auto --right-of "$prev")
prev="$e"
done
xrandr "${args[@]}" ;;
auto)
# Extend if something external is plugged in, otherwise laptop panel only.
if [[ ${#EXTERNALS[@]} -gt 0 ]]; then exec "$0" extend; else exec "$0" internal; fi ;;
*)
echo "usage: display auto|duplicate|extend|internal|external|list" >&2; exit 2 ;;
esac
sleep 0.5
restore_bg
reload_bar