From 64673283fa0d3d7c4d6373645d88ede969be8cd8 Mon Sep 17 00:00:00 2001 From: The Infinite Rick <4379338+theinfiniterick@users.noreply.github.com> Date: Sat, 7 Oct 2023 14:03:50 -0400 Subject: [PATCH] Fixed behavior of select_option function 1. Fixed arrow behavior: In single column selections, the highlighted option would go below the last option on down arrow. 2. Fixed arrow behavior: In 4 column selections, the highlighted option would go to the right of the last option on right arrow. 3. Removed the unused return code argument being passed to all oinstances of select_option. 4. Removed various unused variables: return_value, lastcol, startcol, lines, size. 5. Removed unnecessary `shift 4` 6. Removed unnecessary dollar signs from variable names in math operations. 7. Replaced unused opt variable in for loop with the appropriate _ 8. Replaced deprecated instance of `` with $() for command substitutions. --- scripts/startup.sh | 147 ++++++++++++++++++++++++++++++--------------- 1 file changed, 97 insertions(+), 50 deletions(-) diff --git a/scripts/startup.sh b/scripts/startup.sh index edf8e44..a27ff67 100755 --- a/scripts/startup.sh +++ b/scripts/startup.sh @@ -7,7 +7,7 @@ # @stderror Output routed to startup.log # @setting-header General Settings -# @setting CONFIG_FILE string[$CONFIGS_DIR/setup.conf] Location of setup.conf to be used by set_option and all subsequent scripts. +# @setting CONFIG_FILE string[$CONFIGS_DIR/setup.conf] Location of setup.conf to be used by set_option and all subsequent scripts. CONFIG_FILE=$CONFIGS_DIR/setup.conf if [ ! -f $CONFIG_FILE ]; then # check if file exists touch -f $CONFIG_FILE # create file if not exists @@ -109,7 +109,7 @@ select_option() { if [[ $key = [B || $key = j ]]; then echo down; fi; if [[ $key = [C || $key = l ]]; then echo right; fi; if [[ $key = [D || $key = h ]]; then echo left; fi; - fi + fi } print_options_multicol() { # print options by overwriting the last lines @@ -120,15 +120,15 @@ select_option() { local idx=0 local row=0 local col=0 - - curr_idx=$(( $curr_col + $curr_row * $colmax )) - + + curr_idx=$(( curr_col + curr_row * colmax )) + for option in "${options[@]}"; do - row=$(( $idx/$colmax )) - col=$(( $idx - $row * $colmax )) + row=$(( idx / colmax )) + col=$(( idx - row * colmax )) - cursor_to $(( $startrow + $row + 1)) $(( $offset * $col + 1)) + cursor_to $(( startrow + row + 1)) $(( offset * col + 1)) if [ $idx -eq $curr_idx ]; then print_selected "$option" else @@ -139,21 +139,37 @@ select_option() { } # initially print empty new lines (scroll down if at bottom of screen) - for opt; do printf "\n"; done + for _; do printf "\n"; done # determine current screen position for overwriting the options - local return_value=$1 - local lastrow=`get_cursor_row` - local lastcol=`get_cursor_col` - local startrow=$(($lastrow - $#)) - local startcol=1 - local lines=$( tput lines ) - local cols=$( tput cols ) - local colmax=$2 - local offset=$(( $cols / $colmax )) + # local return_value=$1 + local lastrow=$(get_cursor_row) + # local lastcol=$(get_cursor_col) + local startrow=$(( lastrow - $# )) + # local startcol=1 + # local lines=$( tput lines ) + # local lastrow=$(get_cursor_row) + # local startrow=$(( lastrow - $# )) + local cols=$(tput cols) + local colmax=$1 + local offset=$(( cols / colmax )) - local size=$4 - shift 4 + # get index values for column and row grid + option_count=${#options[@]} + + [ $colmax -gt $option_count ] && colmax=$option_count + + colmax_idx=$(( colmax - 1 )) + + if [ $option_count -eq 1 ]; then + rowmax_idx=0 + elif [ $((option_count % 2)) -eq 0 ]; then + rowmax_idx=$(( (option_count / colmax) - 1 )) + else + rowmax_idx=$(( option_count / colmax )) + fi + + col_last_idx=$(( option_count - (rowmax_idx * colmax + 1) )) # ensure cursor and input echoing back on upon a ctrl+c during read -s trap "cursor_blink_on; stty echo; printf '\n'; exit" 2 @@ -162,18 +178,49 @@ select_option() { local active_row=0 local active_col=0 while true; do - print_options_multicol $active_col $active_row + print_options_multicol $active_col $active_row # user key control - case `key_input` in - enter) break;; - up) ((active_row--)); - if [ $active_row -lt 0 ]; then active_row=0; fi;; - down) ((active_row++)); - if [ $active_row -ge $(( ${#options[@]} / $colmax )) ]; then active_row=$(( ${#options[@]} / $colmax )); fi;; - left) ((active_col=$active_col - 1)); - if [ $active_col -lt 0 ]; then active_col=0; fi;; - right) ((active_col=$active_col + 1)); - if [ $active_col -ge $colmax ]; then active_col=$(( $colmax - 1 )) ; fi;; + case "$(key_input)" in + enter) + break + ;; + up) + ((active_row--)) + if [ $active_row -lt 0 ]; then active_row=0; fi + ;; + down) + ((active_row++)) + if [ $active_row -eq $rowmax_idx ] && [ $active_col -gt $col_last_idx ]; then + active_col=$col_last_idx + active_row=$rowmax_idx + elif [ $active_row -gt $rowmax_idx ]; then + active_row=$rowmax_idx + fi + ;; + left) + ((active_col = active_col - 1)) + if [ $colmax -eq 1 ]; then + active_col=$(( active_col + 1 )) + elif [ $active_col -lt 0 ]; then + if [ $active_row -gt 0 ]; then + active_col=$colmax_idx + active_row=$(( active_row - 1 )) + elif [ $active_row -eq 0 ] || [ $colmax -eq 1 ]; then + active_col=0 + fi + fi + ;; + right) + ((active_col = active_col + 1)) + if [ $colmax -eq 1 ]; then + active_col=$(( active_col - 1 )) + elif [ $active_col -gt $colmax_idx ] && [ $active_row -lt $rowmax_idx ]; then + active_col=0 + active_row=$(( active_row + 1 )) + elif [ $active_row -eq $rowmax_idx ] && [ $active_col -gt $col_last_idx ]; then + active_col=$(( active_col - 1 )) + fi + ;; esac done @@ -182,7 +229,7 @@ select_option() { printf "\n" cursor_blink_on - return $(( $active_col + $active_row * $colmax )) + return $(( active_col + active_row * colmax )) } # @description Displays ArchTitus logo # @noargs @@ -197,7 +244,7 @@ echo -ne " ██║ ██║██║ ██║╚██████╗██║ ██║ ██║ ██║ ██║ ╚██████╔╝███████║ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝ ------------------------------------------------------------------------ - Please select presetup settings for your system + Please select presetup settings for your system ------------------------------------------------------------------------ " } @@ -208,12 +255,12 @@ echo -ne " Please Select your file system for both boot and root " options=("btrfs" "ext4" "luks" "exit") -select_option $? 1 "${options[@]}" +select_option 1 "${options[@]}" case $? in 0) set_option FS btrfs;; 1) set_option FS ext4;; -2) +2) set_password "LUKS_PASSWORD" set_option FS luks ;; @@ -221,37 +268,37 @@ case $? in *) echo "Wrong option please select again"; filesystem;; esac } -# @description Detects and sets timezone. +# @description Detects and sets timezone. timezone () { # Added this from arch wiki https://wiki.archlinux.org/title/System_time time_zone="$(curl --fail https://ipapi.co/timezone)" echo -ne " System detected your timezone to be '$time_zone' \n" echo -ne "Is this correct? -" +" options=("Yes" "No") -select_option $? 1 "${options[@]}" +select_option 1 "${options[@]}" case ${options[$?]} in y|Y|yes|Yes|YES) echo "${time_zone} set as timezone" set_option TIMEZONE $time_zone;; n|N|no|NO|No) - echo "Please enter your desired timezone e.g. Europe/London :" + echo "Please enter your desired timezone e.g. Europe/London :" read new_timezone echo "${new_timezone} set as timezone" set_option TIMEZONE $new_timezone;; *) echo "Wrong option. Try again";timezone;; esac } -# @description Set user's keyboard mapping. +# @description Set user's keyboard mapping. keymap () { echo -ne " Please select key board layout from this list" # These are default key maps as presented in official arch repo archinstall options=(us by ca cf cz de dk es et fa fi fr gr hu il it lt lv mk nl no pl ro ru sg ua uk) -select_option $? 4 "${options[@]}" +select_option 4 "${options[@]}" keymap=${options[$?]} echo -ne "Your key boards layout: ${keymap} \n" @@ -265,7 +312,7 @@ Is this an ssd? yes/no: " options=("Yes" "No") -select_option $? 1 "${options[@]}" +select_option 1 "${options[@]}" case ${options[$?]} in y|Y|yes|Yes|YES) @@ -291,7 +338,7 @@ PS3=' Select the disk to install on: ' options=($(lsblk -n --output TYPE,KNAME,SIZE | awk '$1=="disk"{print "/dev/"$2"|"$3}')) -select_option $? 1 "${options[@]}" +select_option 1 "${options[@]}" disk=${options[$?]%|*} echo -e "\n${disk%|*} selected \n" @@ -300,21 +347,21 @@ echo -e "\n${disk%|*} selected \n" drivessd } -# @description Gather username and password to be used for installation. +# @description Gather username and password to be used for installation. userinfo () { read -p "Please enter your username: " username -set_option USERNAME ${username,,} # convert to lower case as in issue #109 +set_option USERNAME ${username,,} # convert to lower case as in issue #109 set_password "PASSWORD" read -rep "Please enter your hostname: " nameofmachine set_option NAME_OF_MACHINE $nameofmachine } -# @description Choose AUR helper. +# @description Choose AUR helper. aurhelper () { # Let the user choose AUR helper from predefined list echo -ne "Please enter your desired AUR helper:\n" options=(paru yay picaur aura trizen pacaur none) - select_option $? 4 "${options[@]}" + select_option 4 "${options[@]}" aur_helper=${options[$?]} set_option AUR_HELPER $aur_helper } @@ -324,18 +371,18 @@ desktopenv () { # Let the user choose Desktop Enviroment from predefined list echo -ne "Please select your desired Desktop Enviroment:\n" options=( `for f in pkg-files/*.txt; do echo "$f" | sed -r "s/.+\/(.+)\..+/\1/;/pkgs/d"; done` ) - select_option $? 4 "${options[@]}" + select_option 4 "${options[@]}" desktop_env=${options[$?]} set_option DESKTOP_ENV $desktop_env } -# @description Choose whether to do full or minimal installation. +# @description Choose whether to do full or minimal installation. installtype () { echo -ne "Please select type of installation:\n\n Full install: Installs full featured desktop enviroment, with added apps and themes needed for everyday use\n Minimal Install: Installs only apps few selected apps to get you started\n" options=(FULL MINIMAL) - select_option $? 4 "${options[@]}" + select_option 4 "${options[@]}" install_type=${options[$?]} set_option INSTALL_TYPE $install_type }