diff --git a/CHANGELOG.md b/CHANGELOG.md index c17d340..7104d79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## v0.8.24 + +* Fixed: Input error freezes, by changing from using "read" command to using "dd" for reading keyboard input. + ## v0.8.23 * Added: Support for Raspberry Pi cpu temperature reporting diff --git a/bashtop b/bashtop index 081235e..e18db45 100755 --- a/bashtop +++ b/bashtop @@ -64,7 +64,7 @@ banner=( "██╔══██╗██╔══██║╚════██║██╔══██║ ██║ ██║ ██║██╔═══╝ " "██████╔╝██║ ██║███████║██║ ██║ ██║ ╚██████╔╝██║ " "╚═════╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ") -declare version="0.8.23" +declare version="0.8.24" declare banner_width=${#banner[0]} banner_colors=("#E62525" "#CD2121" "#B31D1D" "#9A1919" "#801414") @@ -152,12 +152,13 @@ declare -a sorting=( "pid" "program" "arguments" "threads" "user" "memory" "cpu declare -a pid_history detail_graph detail_history detail_mem_history declare time_left timestamp_start timestamp_end timestamp_input_start timestamp_input_end time_string mem_out proc_misc prev_screen pause_screen filter input_to_filter declare no_epoch proc_det proc_misc2 sleeping=0 detail_mem_graph proc_det2 proc_out curled git_version has_iostat -declare esc_character tab backspace sleepy late_update skip_process_draw winches quitting theme_int notifier +declare esc_character tab backspace sleepy late_update skip_process_draw winches quitting theme_int notifier saved_stty declare -a disks_free disks_total disks_name disks_free_percent disks_io saved_key themes printf -v esc_character "\u1b" printf -v tab "\u09" printf -v backspace "\u7F" -printf -v enter_key "\uA" +#printf -v enter_key "\uA" +printf -v enter_key "\uD" read tty_height tty_width < <(stty size) @@ -213,6 +214,7 @@ fi init_() { #? Collect needed information and set options before startig main loop local i #* Set terminal options, save and clear screen + saved_stty="$(stty -g)" tput smcup stty -echo tput civis @@ -444,6 +446,7 @@ quit_() { #? Clean exit tput rmcup stty echo tput cnorm + stty "${saved_stty}" #* Save any changed values to config file if [[ $config_file != "/dev/null" ]]; then @@ -457,6 +460,7 @@ sleep_() { #? Restore terminal options, stop and send to background if caught SI tput rmcup stty echo tput cnorm + stty "${saved_stty}" kill -s SIGSTOP $$ } @@ -2760,9 +2764,12 @@ menu_() { #? Shows the main menu overlay get_ms timestamp_end time_left=$((timestamp_start+update_ms-timestamp_end)) - if ((time_left>1000)); then wait_string=1; time_left=$((time_left-1000)) - elif ((time_left>1)); then printf -v wait_string ".%03d" "${time_left}"; time_left=0 - else wait_string="0.001"; time_left=0; fi + # if ((time_left>1000)); then wait_string=1; time_left=$((time_left-1000)) + # elif ((time_left>1)); then printf -v wait_string ".%03d" "${time_left}"; time_left=0 + # else wait_string="0.001"; time_left=0; fi + if ((time_left>1000)); then wait_string=10; time_left=$((time_left-1000)) + elif ((time_left>100)); then wait_string=$((time_left/100)); time_left=0 + else wait_string="0"; time_left=0; fi get_key -v keypress -w ${wait_string} if [[ $(stty size) != "$tty_height $tty_width" ]]; then resized; fi @@ -2785,7 +2792,7 @@ menu_() { #? Shows the main menu overlay q|Q) quit_ ;; esac - if ((time_left==0)); then get_ms timestamp_start; collect_and_draw; fi + if ((time_left==0)) && [[ -z $keypress ]]; then get_ms timestamp_start; collect_and_draw; fi if ((resized>=5)); then resized=0; fi done @@ -2877,9 +2884,13 @@ help_() { #? Shows the help overlay get_ms timestamp_end time_left=$((timestamp_start+update_ms-timestamp_end)) - if ((time_left>1000)); then wait_string=1; time_left=$((time_left-1000)) - elif ((time_left>0)); then printf -v wait_string ".%03d" "${time_left}"; time_left=0 - else wait_string="0.001"; time_left=0; fi + # if ((time_left>1000)); then wait_string=1; time_left=$((time_left-1000)) + # elif ((time_left>0)); then printf -v wait_string ".%03d" "${time_left}"; time_left=0 + # else wait_string="0.001"; time_left=0; fi + + if ((time_left>1000)); then wait_string=10; time_left=$((time_left-1000)) + elif ((time_left>100)); then wait_string=$((time_left/100)); time_left=0 + else wait_string="0"; time_left=0; fi get_key -v help_key -w "${wait_string}" @@ -3101,9 +3112,13 @@ options_() { #? Shows the options overlay get_ms timestamp_end if [[ -z $theme_check ]]; then time_left=$((timestamp_start+update_ms-timestamp_end)) else unset theme_check; time_left=0; fi - if ((time_left>500)); then wait_string=0.5 - elif ((time_left>0)); then printf -v wait_string ".%03d" "${time_left}" - else wait_string="0.001"; time_left=0; fi + # if ((time_left>500)); then wait_string=0.5 + # elif ((time_left>0)); then printf -v wait_string ".%03d" "${time_left}" + # else wait_string="0.001"; time_left=0; fi + + if ((time_left>500)); then wait_string=5; time_left=$((time_left-500)) + elif ((time_left>100)); then wait_string=$((time_left/100)); time_left=0 + else wait_string="0"; time_left=0; fi get_key -v keypress -w ${wait_string} @@ -3306,9 +3321,13 @@ killer_() { #? Kill process with selected signal get_ms timestamp_end time_left=$((timestamp_start+update_ms-timestamp_end)) - if ((time_left>1000)); then wait_string=1; time_left=$((time_left-1000)) - elif ((time_left>1)); then printf -v wait_string ".%03d" "${time_left}"; time_left=0 - else wait_string="0.001"; time_left=0; fi + # if ((time_left>1000)); then wait_string=1; time_left=$((time_left-1000)) + # elif ((time_left>1)); then printf -v wait_string ".%03d" "${time_left}"; time_left=0 + # else wait_string="0.001"; time_left=0; fi + + if ((time_left>1000)); then wait_string=10; time_left=$((time_left-1000)) + elif ((time_left>100)); then wait_string=$((time_left/100)); time_left=0 + else wait_string="0"; time_left=0; fi get_key -v keypress -w ${wait_string} if [[ $(stty size) != "$tty_height $tty_width" ]]; then resized; fi @@ -3373,7 +3392,8 @@ get_key() { #? Get one key from standard input and translate key code to readabl if [[ -z $save && -n ${saved_key[0]} ]]; then key="${saved_key[0]}"; unset 'saved_key[0]'; saved_key=("${saved_key[@]}") else unset key - IFS= read -rsd '' -t ${wait_time:-0.001} -n 1 key 2>/dev/null ||true + #IFS= read -rsd '' -t ${wait_time:-0.001} -n 1 key 2>/dev/null ||true + key=$(stty -cooked min 0 time ${wait_time:-0}; dd bs=1 count=1 2>/dev/null) if [[ -z ${key:+s} ]]; then key_out="" @@ -3385,25 +3405,26 @@ get_key() { #? Get one key from standard input and translate key code to readabl if [[ $key == "${enter_key}" ]]; then key="enter" elif [[ $key == "${backspace}" ]]; then key="backspace" elif [[ $key == "${tab}" ]]; then key="tab" - elif [[ $key == "$esc_character" ]]; then esc=1; read -rsn3 -t 0.001 key 2>/dev/null || true; fi + elif [[ $key == "$esc_character" ]]; then + esc=1; key=$(stty -cooked min 0 time 0; dd bs=1 count=3 2>/dev/null); fi # read -rsn3 -t 0.001 key 2>/dev/null || true if [[ -z $key && $esc -eq 1 ]]; then key="escape" elif [[ $esc -eq 1 ]]; then case "${key}" in - '[A') key="up" ;; - '[B') key="down" ;; - '[D') key="left" ;; - '[C') key="right" ;; + '[A'*) key="up" ;; + '[B'*) key="down" ;; + '[D'*) key="left" ;; + '[C'*) key="right" ;; '[2~') key="insert" ;; '[3~') key="delete" ;; - '[H') key="home" ;; - '[F') key="end" ;; + '[H'*) key="home" ;; + '[F'*) key="end" ;; '[5~') key="page_up" ;; '[6~') key="page_down" ;; - '[Z') key="shift_tab" ;; - 'OP') key="f1";; - 'OQ') key="f2";; - 'OR') key="f3";; - 'OS') key="f4";; + '[Z'*) key="shift_tab" ;; + 'OP'*) key="f1";; + 'OQ'*) key="f2";; + 'OR'*) key="f3";; + 'OS'*) key="f4";; '[15') key="f5";; '[17') key="f6";; '[18') key="f7";; @@ -3418,7 +3439,8 @@ get_key() { #? Get one key from standard input and translate key code to readabl fi - read -rst 0.001 -n 1000 2>/dev/null ||true + #read -rst 0.001 -n 1000 2>/dev/null ||true + stty -cooked min 0 time 0; dd bs=512 count=1 >/dev/null 2>&1 if [[ -n $save && -n $key ]]; then saved_key+=("${key}"); return 0; fi @@ -3594,7 +3616,7 @@ collect_and_draw() { #? Run all collect and draw functions elif [[ -z $pause_screen ]]; then input_runs=0 while [[ -n ${saved_key[0]} ]] && ((time_left>0)) && ((++input_runs<=5)); do - process_input 0.001 + process_input unset late_update done fi @@ -3651,17 +3673,22 @@ main_loop() { #? main loop... #* If NOT waiting for input and time left is greater than 500ms, wait 500ms and loop if [[ -z $input_to_filter ]] && ((time_left>=500)); then - wait_string="0.5" + # wait_string="0.5" + wait_string="5" time_left=$((time_left-500)) #* If waiting for input and time left is greater than "50 ms", wait 50ms and loop - elif [[ -n $input_to_filter ]] && ((time_left>=50)); then - wait_string="0.05" - time_left=$((time_left-50)) + # elif [[ -n $input_to_filter ]] && ((time_left>=50)); then + # wait_string="0.05" + # time_left=$((time_left-50)) + elif [[ -n $input_to_filter ]] && ((time_left>=100)); then + wait_string="1" + time_left=$((time_left-100)) #* Else format wait string with padded zeroes if needed and break loop else - printf -v wait_string ".%03d" "${time_left}" + #printf -v wait_string ".%03d" "${time_left}" + if ((time_left>=100)); then wait_string=$((time_left/100)); else wait_string=0; fi time_left=0 fi