#!/bin/bash # Usage: ChangeDisplayResolution [resolution] source /usr/share/endeavouros/scripts/eos-script-lib-yad || { echo "Error: ${BASH_SOURCE[1]}, line $LINENO: cannot find /usr/share/endeavouros/scripts/eos-script-lib-yad" >&2 exit 1 } export -f eos_yad DIE() { echo "$progname: error: $1" >&2 exit 1 } Restart_me() { local tmpfile=$(mktemp) cat < $tmpfile #!/bin/bash pkill "$progname" sleep 0.1 "$progname" & EOF bash $tmpfile sleep 2 rm -f $tmpfile } export -f Restart_me yad_ChangeDisplayResolution() { local reso="$1" local progname=${0##*/} eos_assert_deps $progname xorg-xrandr yad || return 1 local query="$(xrandr --query)" local output="$(echo "$query" | grep -m1 " connected " | awk '{print $1}')" local xrandr="xrandr --output $output --mode" local resos="$(echo "$query" | grep "^ [ ]*[0-9][0-9]*x[0-9][0-9]* " | awk '{print $1}')" local resosarr local current_reso="$(echo "$query" | grep "^ [ ]*[0-9][0-9]*x[0-9][0-9]* " | grep "*" | awk '{print $1}')" local retval local result local txt mark="*" local impl=list # list or form local butt_set_quit="Set and quit" local butt_set_stay="Set and stay" # yad window return values must be different: local b_ok=0 # button "Set and quit" clicked local b_quit=1 # button "Quit" clicked (button currently not visible!) local b_refresh=10 # button "Set and stay" clicked local b_exit=252 # (X) clicked in the upper right corner readarray -t resosarr < <(echo "$resos") if [ -n "$reso" ] ; then if [ -n "$(echo "$resos" | grep "$reso")" ] ; then $xrandr "$reso" else echo "Error: $progname: given resolution '$reso' is not supported." >&2 echo "Supported values:" >&2 for reso in "${resosarr[@]}" ; do if [ "$reso" = "$current_reso" ] ; then echo " * $reso" else echo " $reso" fi done fi else txt="Select new display resolution from the list below.\n" txt+="- Current value is marked with: $mark\n" txt+="- Double clicking a value does $butt_set_quit\n" local cmd=( eos_yad --image=preferences-desktop-display --width=400 --title="Change display resolution" --text="$txt" ) case "$impl" in form) cmd+=(--form --columns=2 --button=yad-quit:0) ;; list) cmd+=(--list --height=500 --no-click --grid-lines=both --column="Available resolution values:" # --button="yad-quit!!Change nothing, just quit":$b_quit --button="$butt_set_stay!view-refresh!Use selected resolution but don't quit":$b_refresh --button="$butt_set_quit!gtk-ok!Use selected resolution and quit":$b_ok ) ;; esac for reso in "${resosarr[@]}" ; do if [ "$reso" = "$current_reso" ] ; then case "$impl" in form) cmd+=(--field="* $reso":fbtn "$xrandr $reso") ;; list) cmd+=("$reso $mark") ;; esac else case "$impl" in form) cmd+=(--field=" $reso":fbtn "$xrandr $reso") ;; list) cmd+=("$reso") ;; esac fi done result="$("${cmd[@]}")" retval=$? if [ -z "$result" ] ; then return fi case "$retval" in $b_quit | $b_exit) return ;; esac case "$impl" in form) ;; # does not support refresh... list) reso="$(echo "$result" | cut -d '|' -f 1 | awk '{print $1}')" if [ -n "$(echo "$reso" | tr -d '0-9x')" ] ; then echo "Invalid resolution value '$reso'" >&2 return 1 fi $xrandr $reso case "$retval" in $b_refresh) Restart_me ;; esac ;; esac fi } yad_ChangeDisplayResolution "$@"