diff --git a/startup.sh b/startup.sh old mode 100644 new mode 100755 index e74f9fd..5ea082d --- a/startup.sh +++ b/startup.sh @@ -30,46 +30,92 @@ select_option() { cursor_blink_on() { printf "$ESC[?25h"; } cursor_blink_off() { printf "$ESC[?25l"; } cursor_to() { printf "$ESC[$1;${2:-1}H"; } - print_option() { printf " $1 "; } - print_selected() { printf " $ESC[7m $1 $ESC[27m"; } + print_option() { printf "$2 $1 "; } + print_selected() { printf "$2 $ESC[7m $1 $ESC[27m"; } get_cursor_row() { IFS=';' read -sdR -p $'\E[6n' ROW COL; echo ${ROW#*[}; } - key_input() { read -s -n3 key 2>/dev/null >&2 - if [[ $key = $ESC[A ]]; then echo up; fi - if [[ $key = $ESC[B ]]; then echo down; fi - if [[ $key = "" ]]; then echo enter; fi; } + get_cursor_col() { IFS=';' read -sdR -p $'\E[6n' ROW COL; echo ${COL#*[}; } + key_input() { + local key + IFS= read -rsn1 key 2>/dev/null >&2 + if [[ $key = "" ]]; then echo enter; fi; + if [[ $key = $'\x20' ]]; then echo space; fi; + if [[ $key = "k" ]]; then echo up; fi; + if [[ $key = "j" ]]; then echo down; fi; + if [[ $key = "h" ]]; then echo left; fi; + if [[ $key = "l" ]]; then echo right; fi; + if [[ $key = "a" ]]; then echo all; fi; + if [[ $key = "n" ]]; then echo none; fi; + if [[ $key = $'\x1b' ]]; then + read -rsn2 key + if [[ $key = [A || $key = k ]]; then echo up; fi; + 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 + } + print_options_multicol() { + # print options by overwriting the last lines + local curr_col=$1 + local curr_row=$2 + local curr_idx=0 + + local idx=0 + local row=0 + local col=0 + + curr_idx=$(( $curr_col + $curr_row * $colmax )) + + for option in "${options[@]}"; do + + row=$(( $idx/$colmax )) + col=$(( $idx - $row * $colmax )) + + cursor_to $(( $startrow + $row + 1)) $(( $offset * $col + 1)) + if [ $idx -eq $curr_idx ]; then + print_selected "$option" + else + print_option "$option" + fi + ((idx++)) + done + } # initially print empty new lines (scroll down if at bottom of screen) for opt; 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 size=$4 + shift 4 # ensure cursor and input echoing back on upon a ctrl+c during read -s trap "cursor_blink_on; stty echo; printf '\n'; exit" 2 cursor_blink_off - local selected=0 + local active_row=0 + local active_col=0 while true; do - # print options by overwriting the last lines - local idx=0 - for opt; do - cursor_to $(($startrow + $idx)) - if [ $idx -eq $selected ]; then - print_selected "$opt" - else - print_option "$opt" - fi - ((idx++)) - done - + print_options_multicol $active_col $active_row # user key control case `key_input` in - enter) break;; - up) ((selected--)); - if [ $selected -lt 0 ]; then selected=$(($# - 1)); fi;; - down) ((selected++)); - if [ $selected -ge $# ]; then selected=0; fi;; + 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;; esac done @@ -78,7 +124,7 @@ select_option() { printf "\n" cursor_blink_on - return $selected + return $(( $active_col + $active_row * $colmax )) } logo () { # This will be shown on every set as user is progressing @@ -102,10 +148,9 @@ echo -ne " Please Select your file system for both boot and root " options=("btrfs" "ext4" "luks" "exit") -select_option "${options[@]}" -fs=$? +select_option $? 1 "${options[@]}" -case $fs in +case $? in 0) set_option FS btrfs;; 1) set_option FS ext4;; 2) @@ -137,10 +182,9 @@ System detected your timezone to be '$time_zone' \n" echo -ne "Is this correct? " options=("Yes" "No") -select_option "${options[@]}" -choice=$? +select_option $? 1 "${options[@]}" -case ${options[$choice]} in +case ${options[$?]} in y|Y|yes|Yes|YES) echo "${time_zone} set as timezone" set_option TIMEZONE $time_zone;; @@ -153,19 +197,15 @@ case ${options[$choice]} in esac } keymap () { -PS3=" - -Please select key board layout from this list - -" +echo -ne " +Please select key board layout from this list" # These are default key maps as presented in official arch repo archinstall options=(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 us) -select_option "${options[@]}" -choice=$? -keymap=${options[$choice]} +select_option $? 4 "${options[@]}" +keymap=${options[$?]} -echo -ne "\nYour key boards layout: ${keymap} \n" +echo -ne "Your key boards layout: ${keymap} \n" set_option KEYMAP $keymap } @@ -175,10 +215,9 @@ Is this an ssd? yes/no: " options=("Yes" "No") -select_option "${options[@]}" -choice=$? +select_option $? 1 "${options[@]}" -case ${options[$choice]} in +case ${options[$?]} in y|Y|yes|Yes|YES) set_option MOUNT_OPTIONS "noatime,compress=zstd,ssd,commit=120";; n|N|no|NO|No) @@ -202,9 +241,8 @@ PS3=' Select the disk to install on: ' options=($(lsblk -n --output TYPE,KNAME,SIZE | awk '$1=="disk"{print "/dev/"$2"|"$3}')) -select_option "${options[@]}" -choice=$? -disk=${options[$choice]%|*} +select_option $? 1 "${options[@]}" +disk=${options[$?]%|*} echo -e "\n${disk%|*} selected \n" set_option DISK ${disk%|*}