Files
eos-bash-shared/ChangeDisplayResolution

132 lines
4.2 KiB
Bash
Executable File

#!/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 <<EOF > $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: <b>$mark</b>\n"
txt+="- Double clicking a value does <b>$butt_set_quit</b>\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 "$@"