mirror of
https://github.com/endeavouros-team/eos-bash-shared.git
synced 2026-06-13 01:34:36 +00:00
132 lines
4.2 KiB
Bash
Executable File
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 "$@"
|