2020-12-29 01:02:32 +00:00
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
|
# Global readonly variables can't be shadowed by local variables so wrap
|
|
|
|
# our code in a function so we can declare all variables local
|
|
|
|
main() {
|
|
|
|
# Customizable configuration constants
|
|
|
|
local -r DEFAULT_MOD_LIST='cpu mem bl vol-amixer bat dt'
|
2020-12-29 02:58:52 +00:00
|
|
|
local -r DEFAULT_RES=.25
|
2020-12-29 01:02:32 +00:00
|
|
|
local -r DEFAULT_PRE=' '
|
|
|
|
local -r DEFAULT_SEP_L='| '
|
|
|
|
local -r DEFAULT_SEP_R=' '
|
|
|
|
local -r DEFAULT_SUF=' '
|
|
|
|
|
2020-12-29 02:58:52 +00:00
|
|
|
local -r mod_list="${1-${DEFAULT_MOD_LIST}}"
|
|
|
|
local -r res="${2:-${DEFAULT_RES}}"
|
2020-12-29 01:02:32 +00:00
|
|
|
local -r pre="${3-${DEFAULT_PRE}}"
|
|
|
|
local -r sep_l="${4-${DEFAULT_SEP_L}}"
|
|
|
|
local -r sep_r="${5-${DEFAULT_SEP_R}}"
|
|
|
|
local -r suf="${6-${DEFAULT_SUF}}"
|
|
|
|
|
|
|
|
local -r MOD_DIR="$(dirname "$0")"/module
|
|
|
|
local -r ACTION_DIR=/tmp/xrsb-action
|
|
|
|
local -i ACTION_DIR_LEN=${#ACTION_DIR}
|
|
|
|
|
|
|
|
# Cache module values so we can reuse them without recomputing them
|
|
|
|
local -A stat_cache
|
2020-12-29 03:04:18 +00:00
|
|
|
# Since stat_cache is hash ordered, maintain the display order (as defined
|
|
|
|
# by mod_list) of the keys so we can loop over the cache in display order
|
|
|
|
# when generating the full status
|
2020-12-29 19:19:54 +00:00
|
|
|
local -a stat_cache_ordered_mods mods
|
2020-12-29 16:13:34 +00:00
|
|
|
local mod mod_file
|
2020-12-29 01:02:32 +00:00
|
|
|
|
2020-12-29 16:13:34 +00:00
|
|
|
# Map the module file name to the module function
|
|
|
|
mod_to_fn() {
|
|
|
|
printf 'mod_%s' "${1//-/_}"
|
|
|
|
}
|
|
|
|
|
|
|
|
# For each module in the list, if the module file exists then source it, add
|
|
|
|
# its name to the ordered array, and call its function and cache the value
|
2020-12-29 19:19:54 +00:00
|
|
|
IFS=', ' read -r -a mods <<< "${mod_list}"
|
|
|
|
for mod in ${mods[@]}; do
|
2020-12-29 01:02:32 +00:00
|
|
|
mod_file="${MOD_DIR}/${mod}"
|
|
|
|
if [[ -r "${mod_file}" ]]; then
|
2020-12-29 01:17:51 +00:00
|
|
|
# shellcheck source=/dev/null
|
2020-12-29 01:02:32 +00:00
|
|
|
source "${mod_file}"
|
2020-12-29 16:13:34 +00:00
|
|
|
stat_cache_ordered_mods+=("${mod}")
|
|
|
|
stat_cache["${mod}"]="$("$(mod_to_fn "${mod}")")"
|
2020-12-29 01:02:32 +00:00
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
2020-12-29 16:13:34 +00:00
|
|
|
# Construct and display the status by looping over the cached values in order
|
|
|
|
draw_status() {
|
|
|
|
local mod stat
|
|
|
|
for mod in "${stat_cache_ordered_mods[@]}"; do
|
2020-12-29 01:02:32 +00:00
|
|
|
printf -v stat '%b%b%b%b' \
|
2020-12-29 16:13:34 +00:00
|
|
|
"${stat}" "${sep_l}" "${stat_cache[${mod}]}" "${sep_r}"
|
2020-12-29 01:02:32 +00:00
|
|
|
done
|
|
|
|
|
|
|
|
# Trim the leading left separator and trailing right separator, and
|
|
|
|
# display the status
|
|
|
|
local -ri offset=${#sep_l}
|
|
|
|
local -ri len=$((${#stat} - offset - ${#sep_r}))
|
|
|
|
xsetroot -name "${pre}${stat:${offset}:${len}}${suf}"
|
|
|
|
}
|
|
|
|
|
|
|
|
# Draw the initial status
|
|
|
|
draw_status
|
|
|
|
|
2020-12-29 16:13:34 +00:00
|
|
|
# For each file in the action directory, remove the file, and if a module for
|
|
|
|
# the action is cached, call the module function and update the cache. If
|
|
|
|
# any cache entries were updated, redraw the status.
|
2020-12-29 01:02:32 +00:00
|
|
|
process_signal () {
|
2020-12-29 16:13:34 +00:00
|
|
|
local -a action_paths
|
|
|
|
local action_path mod is_changed
|
|
|
|
readarray -d '' action_paths< \
|
2020-12-29 01:02:32 +00:00
|
|
|
<(find "${ACTION_DIR}" -maxdepth 1 -type f -exec rm -f {} + -print0)
|
2020-12-29 16:13:34 +00:00
|
|
|
for action_path in "${action_paths[@]}"; do
|
|
|
|
mod="${action_path:$((ACTION_DIR_LEN + 1))}"
|
|
|
|
if [[ -v stat_cache[${mod}] ]]; then
|
|
|
|
stat_cache["${mod}"]="$("$(mod_to_fn "${mod}")")"
|
|
|
|
is_changed=1
|
2020-12-29 01:02:32 +00:00
|
|
|
fi
|
|
|
|
done
|
2020-12-29 16:13:34 +00:00
|
|
|
if [[ -v is_changed ]]; then draw_status; fi
|
2020-12-29 01:02:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
# Wait for signals
|
|
|
|
mkdir -p "${ACTION_DIR}"
|
|
|
|
trap process_signal SIGUSR1
|
|
|
|
|
|
|
|
while :; do
|
|
|
|
sleep "${res}"
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
|
|
|
main "$@"
|
|
|
|
|