From b266682781fecc4490de17905d9a52e5491672a0 Mon Sep 17 00:00:00 2001 From: Guilherme Rugai Freire Date: Wed, 11 Feb 2026 01:09:32 -0300 Subject: [PATCH] add rofi + xrandr display scripts --- bin/display-config | 1 + bin/display-restore | 1 + display-config/README.md | 7 ++ display-config/display-config.sh | 128 +++++++++++++++++++++++++++++ display-restore/README.md | 7 ++ display-restore/display-restore.sh | 23 ++++++ 6 files changed, 167 insertions(+) create mode 120000 bin/display-config create mode 120000 bin/display-restore create mode 100644 display-config/README.md create mode 100755 display-config/display-config.sh create mode 100644 display-restore/README.md create mode 100755 display-restore/display-restore.sh diff --git a/bin/display-config b/bin/display-config new file mode 120000 index 0000000..e231457 --- /dev/null +++ b/bin/display-config @@ -0,0 +1 @@ +../display-config/display-config.sh \ No newline at end of file diff --git a/bin/display-restore b/bin/display-restore new file mode 120000 index 0000000..1241e43 --- /dev/null +++ b/bin/display-restore @@ -0,0 +1 @@ +../display-restore/display-restore.sh \ No newline at end of file diff --git a/display-config/README.md b/display-config/README.md new file mode 100644 index 0000000..c24fd5a --- /dev/null +++ b/display-config/README.md @@ -0,0 +1,7 @@ +# display-config + +## About +-- about section here -- + +## Requirements +-- any requirements -- diff --git a/display-config/display-config.sh b/display-config/display-config.sh new file mode 100755 index 0000000..43e2a22 --- /dev/null +++ b/display-config/display-config.sh @@ -0,0 +1,128 @@ +#!/bin/sh + +if [ "$(command -v rofi)" ]; then + CMD='rofi -dmenu -i'; +elif [ "$(command -v dmenu)" ]; then + CMD='dmenu'; +else + echo 'Could not find either dmenu or rofi, exiting' + exit 1; +fi + +# $1 - monitor name +# +# return "WIDTH1xHEIGTH1\nWIDTH2xHEIGTH2\n..." +get_monitor_sizes() { + xrandr | awk -v monitor="$1" \ + '$1 == monitor { display=1; next } /^[A-Z]/ { display=0 } display { print $1 }' +} + +# $1 - monitor name +# +# return xrandr "--mode WIDTHxHEIGTH" or "--preferred" +monitor_config() { + sizes="$(get_monitor_sizes "$1")" + if [ "$1" = "eDP-1" ]; then + DISPLAY_CONFIGS="Preferred\n$sizes" + else + DISPLAY_CONFIGS="$sizes" + fi + + CONFIG="$(echo "$DISPLAY_CONFIGS" | $CMD -p "Monitor $1 config" | xargs)" + + case "$CONFIG" in + Preferred) + echo "--preferred" + return + ;; + "") + exit 1 + ;; + *) + echo "--mode $CONFIG" + return + ;; + esac +} + +# return "eDP-1\nHDMI-1\n..." +get_monitors() { + xrandr | awk '$2 == "connected" {print $1}' +} + +monitors="$(get_monitors)" +n_monitors="$(echo "$monitors" | wc -l)" + +if [ "$n_monitors" -eq "1" ]; then + config="$(monitor_config "$monitors")" || exit 1 + # shellcheck disable=SC2086 + xrandr --output "$monitors" $config +elif [ "$n_monitors" -eq "2" ]; then + DISPLAY_ARRANGEMENTS="Join\nMirror\nOnly" + N_ARRANGEMENTS="$(echo $DISPLAY_ARRANGEMENTS | wc -l)" + ARRANGEMENT="$(echo "$DISPLAY_ARRANGEMENTS" | $CMD -l "$N_ARRANGEMENTS" -p "Display arrangement" | xargs)" + + case "$ARRANGEMENT" in + Join) + args="" + + prev_monitor="" + for monitor in $(get_monitors); do + position="" + if [ "$prev_monitor" != "" ]; then + POSITIONS="right-of\nleft-of\nabove\nbelow" + N_POSITIONS=4 + position_flag="$(echo "$POSITIONS" | $CMD -l "$N_POSITIONS" -p "Select position" | xargs)" + if [ "$position_flag" = "" ]; then exit 1; fi + + position="--$position_flag $prev_monitor" + fi + config="$(monitor_config "$monitor")" || exit 1 + args="$args --output $monitor $config $position" + prev_monitor="$monitor" + done + # shellcheck disable=SC2086 + xrandr $args + ;; + Mirror) + args="" + + prev_monitor="" + for monitor in $(get_monitors); do + config="$(monitor_config "$monitor")" || exit 1 + args="$args --output $monitor $config" + if [ "$prev_monitor" != "" ]; then + args="$args --same-as $prev_monitor" + fi + prev_monitor="$monitor" + done + # shellcheck disable=SC2086 + xrandr $args + ;; + Only) + monitors="$(get_monitors)" + n_monitors="$(echo "$monitors" | wc -l)" + monitor="$(echo "$monitors" | $CMD -l "$n_monitors" -p "Select monitor" | xargs)" + if [ "$monitor" = "" ]; then exit 1; fi + config="$(monitor_config "$monitor")" || exit 1 + + args="" + for monitor_i in $monitors; do + if [ "$monitor_i" = "$monitor" ]; then + args="$args --output $monitor_i $config" + else + args="$args --output $monitor_i --off" + fi + done + # I do want word splitting for argument config + # shellcheck disable=SC2086 + xrandr $args + ;; + *) + exit 0 + ;; + esac +else + arandr +fi + diff --git a/display-restore/README.md b/display-restore/README.md new file mode 100644 index 0000000..c8aa9c1 --- /dev/null +++ b/display-restore/README.md @@ -0,0 +1,7 @@ +# display-restore + +## About +-- about section here -- + +## Requirements +-- any requirements -- diff --git a/display-restore/display-restore.sh b/display-restore/display-restore.sh new file mode 100755 index 0000000..c29d1ac --- /dev/null +++ b/display-restore/display-restore.sh @@ -0,0 +1,23 @@ +#!/bin/sh + +restore() { + n_active_displays="$(xrandr | awk '/ connected/ && /[0-9]+x[0-9]+\+[0-9]+\+[0-9]+/ { print $1 }' | wc -l)" + + if [ "$n_active_displays" -ge "1" ]; then + return 0 + fi + + monitor="$(xrandr | awk '$2 == "connected" {print $1; exit}')" + + xrandr --output "$monitor" --preferred +} + +if [ "$1" = "loop" ]; then + while true + do + restore + sleep 5 + done +else + restore +fi