67 lines
2.1 KiB
Bash
Executable File
67 lines
2.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
################################################################################
|
|
#
|
|
# Small script using `xrandr` and `fzf` to quickly select connected monitors.
|
|
#
|
|
# TODO:
|
|
# - Add possibility to not only mirror onto all outputs but use the total
|
|
# screen space.
|
|
################################################################################
|
|
|
|
command -v xrandr &>/dev/null || exit 1
|
|
command -v fzf &>/dev/null || exit 1
|
|
|
|
# Grep for all connected outs including their highest resolution,
|
|
# throw away additional information and finally merge the out name and
|
|
# resolution lines separating them with a tab.
|
|
connected_outs="$(
|
|
xrandr -q \
|
|
| grep -A1 ' connected' \
|
|
| sed 's/^[[:space:]]*//' \
|
|
| grep -Eo "^([^ ]* connected|[0-9]+x[0-9]+)" \
|
|
| paste -d " " - - \
|
|
| sed 's/ connected \(.*\)/\t(\1)/'
|
|
)"
|
|
[[ -n "$connected_outs" ]] || exit 1
|
|
|
|
# Multi select on connected outs
|
|
selected_outs="$(fzf -m --cycle --header "Select outputs" <<<"$connected_outs")"
|
|
[[ -n "$selected_outs" ]] || exit 1
|
|
|
|
# Selection of primary out out of the selected ones if there is more than one.
|
|
if [[ $(wc -l <<<"$selected_outs") -gt 1 ]]; then
|
|
primary_out="$(fzf --cycle --header "Select primary" <<<"$selected_outs")"
|
|
else
|
|
primary_out="$selected_outs"
|
|
fi
|
|
# Strip trailing resolution
|
|
primary_out="$(cut -d$'\t' -f1 <<<"$primary_out")"
|
|
[[ -n "$primary_out" ]] || exit 1
|
|
|
|
# "Convert" to array and strip trailing resolutions
|
|
# Only done here to display the resolutions in the fzf dialogs.
|
|
typeset -a selected_outs=($(cut -d$'\t' -f1 <<<"$selected_outs"))
|
|
typeset -a connected_outs=($(cut -d$'\t' -f1 <<<"$connected_outs"))
|
|
|
|
# Build `xrandr` command
|
|
typeset -a xrandr_command
|
|
xrandr_command+="xrandr"
|
|
for out in "${connected_outs[@]}"; do
|
|
xrandr_command+=(--output "$out")
|
|
|
|
# TODO: Solution with better performance?
|
|
if printf "%s\n" "${selected_outs[@]}" | grep -qE "^$out$"; then
|
|
# Current out was selected by user
|
|
xrandr_command+=(--auto)
|
|
else
|
|
xrandr_command+=(--off)
|
|
fi
|
|
|
|
[[ "$out" != "$primary_out" ]] || xrandr_command+=(--primary)
|
|
done
|
|
|
|
# Print for debugging purposes and finally execute it
|
|
printf "%s\n" "${xrandr_command[*]}"
|
|
"${xrandr_command[@]}"
|