#!/bin/bash function update_crypto() { local c c="$(crypto 2> /dev/null)" && crypto="$c" } function update_cpu() { cpu=" $(awk '{print $1}' /proc/loadavg)" } function update_memory() { memory=" $(free -h | awk '/^Mem:/{print $3}')" } function update_bat() { local dir cap dir='/sys/class/power_supply/BAT0' cap="$(cat "$dir/capacity")" { grep -qv Discharging "$dir/status" && bat=" $cap%"; } || { [ "$cap" -gt 80 ] && bat=" $cap%"; } || { [ "$cap" -gt 60 ] && bat=" $cap%"; } || { [ "$cap" -gt 40 ] && bat=" $cap%"; } || { [ "$cap" -gt 20 ] && bat=" $cap%"; } || { bat=" $cap%"; } } function update_sink_vol() { local sink vol sink="$(wpctl get-volume '@DEFAULT_AUDIO_SINK@')" if grep -q MUTED <<< "$sink"; then sink_vol='🔇' return fi vol="$(awk '{printf "%.0f", $2 * 100}' <<< "$sink")" { [ "$vol" -gt 67 ] && sink_vol=" $vol"; } || { [ "$vol" -gt 33 ] && sink_vol=" $vol"; } || { sink_vol=" $vol"; } } function update_source_vol() { local source vol source="$(wpctl get-volume '@DEFAULT_AUDIO_SOURCE@')" if grep -q MUTED <<< "$source"; then source_vol='' return fi source_vol=" $(awk '{printf "%.0f", $2 * 100}' <<< "$source")" } function update_net() { local dev j ssid sig dev="$(ip route show default | sed -n 's/.*dev\s\+\(\w\+\).*/\1/p;q')" j="$(networkctl status "$dev" --json=short)" case "$(jq -r .Type <<< "$j")" in ether) net="🌐 $dev" ;; wlan) ssid="$(jq -r .SSID <<< "$j")" sig="$(awk "/$dev/{printf \"%.0f\", \$3}" /proc/net/wireless)" { [ "$sig" -gt 56 ] && net="▂▄▆█ $ssid"; } || { [ "$sig" -gt 38 ] && net="▂▄▆_ $ssid"; } || { [ "$sig" -gt 21 ] && net="▂▄__ $ssid"; } || { [ "$sig" -gt 3 ] && net="▂___ $ssid"; } || { net="____ $ssid"; } ;; *) net='⚠' ;; esac } function update_time() { time="$(date '+%a %m-%d %R')" } function reload() { sec=0 } function display() { "${DISPLAYCMD[@]}" "$crypto | $cpu | $memory | $sink_vol $source_vol | $net | $bat | $time" } if [ "$XDG_SESSION_TYPE" = wayland ]; then DISPLAYCMD=(echo) else DISPLAYCMD=(xsetroot -name) fi # SIGNALING # trap ';display;wait' 'RTMIN+n' trap 'reload' 'RTMIN' trap 'update_sink_vol;display;wait' 'RTMIN+1' trap 'update_source_vol;display;wait' 'RTMIN+2' trap 'update_net;display;wait' 'RTMIN+3' # to update it from external commands ## kill -m "$(cat ~/.cache/pidofbar)" # where m = 34 + n echo "$$" > "$HOME/.cache/pidofbar" sec=0 while true; do [ "$((sec % 300))" -eq 5 ] && update_crypto [ "$((sec % 5))" -eq 0 ] && { update_cpu update_memory update_sink_vol update_source_vol update_net update_bat update_time display } ((sec += 5)) awk "@load \"time\"; BEGIN {d=5; s=$(date '+%S.%N'); sleep(d - s % d)}" & wait done