diff --git a/avdd b/avdd index dd26224..2164e37 100755 --- a/avdd +++ b/avdd @@ -96,18 +96,22 @@ draw_status() { # Draw the initial status draw_status -# If the module value is in the cache, indicating that the module controls -# part of the status bar, execute the module function and redraw the status -# bar if that part of the status bar has changed -process_cmd () { - local -r mod="$1" - if [[ -v stat_cache[${mod}] ]]; then - local -r new_val="$(eval "$(mod_to_fn "${mod}")")" - if [[ "${new_val}" != stat_cache["${mod}"] ]]; then - stat_cache["${mod}"]="${new_val}" - draw_status +# Process a list of mods. If a mod is in the status cache, call the module +# function to get the new value for that section of the status bar. If any +# of the new values are different from the cached ones, update the cache +# and redraw the status bar once after all the mods are processed. +process_mods () { + local mod new_val is_changed + for mod in "$@"; do + if [[ -v stat_cache[${mod}] ]]; then + new_val="$(eval "$(mod_to_fn "${mod}")")" + if [[ "${new_val}" != stat_cache["${mod}"] ]]; then + stat_cache["${mod}"]="${new_val}" + is_changed=1 + fi fi - fi + done + if [[ -v is_changed ]]; then draw_status; fi } # Setup the named pipe to receive commands @@ -118,15 +122,19 @@ trap "rm -f ${FIFO}" EXIT # Each time the pipe is emptied out, the inner while loop will finish, so # wrap it in an infinte loop to keep blocking until there is data on the pipe while :; do - while read -r cmd; do - case "${cmd}" in + while read -r fifo_mod_list; do + case "${fifo_mod_list}" in + res_all) + process_mods "${mods[@]}" + ;; res_quit) exit 0 ;; res_*) ;; *) - process_cmd "${cmd}" + IFS=', ' read -r -a fifo_mods <<< "${fifo_mod_list}" + process_mods "${fifo_mods[@]}" ;; esac done < "${FIFO}" diff --git a/avds b/avds index eebea7b..de66324 100755 --- a/avds +++ b/avds @@ -51,29 +51,30 @@ ms_to_s () { printf '%.3f' "${1}e-3" } -# Validate the arguments +# Validate the number arguments if [[ "$#" -lt 1 || "$#" -gt 3 ]]; then printf '%s' "${USAGE}" 1>&2 exit 128 fi -IFS=', ' read -r -a mods <<< "$1" +mod_list="$1" # Check if the user needs help -# shellcheck disable=SC2128 -if [[ "${mods}" =~ ^(-h|-(-)?help)$ ]]; then +if [[ "${mod_list}" =~ ^(-h|-(-)?help)$ ]]; then printf '%s' "${USAGE}" 1>&2 exit 0 fi when="${2:-0}" -repeat="$3" +# Validate when if [[ ! "${when}" =~ ^[0-9]+|[mhd]$ ]]; then printf 'Invalid argument : %s\n' "${when}" 1>&2 exit 128 fi +repeat="$3" + # Write to the pipe if this is the first run or if repeat is on first_run=1 while [[ "${first_run}" -eq 1 || -n "${repeat}" ]]; do @@ -107,6 +108,6 @@ while [[ "${first_run}" -eq 1 || -n "${repeat}" ]]; do printf 'The daemon %s is not running\n' "${DAEMON}" 1>&2 exit 1 fi - for mod in "${mods[@]}"; do printf '%s\n' "${mod}" >> "${FIFO}"; done + printf '%s\n' "${mod_list}" >> "${FIFO}" done