61 lines
2.3 KiB
Bash
61 lines
2.3 KiB
Bash
#!/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
|