#!/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