#!/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 "$@"
