dotfiles/bin/sbar
2024-01-04 10:07:50 +01:00

105 lines
2.5 KiB
Bash
Executable File

#!/bin/bash
# INIT
echo "$$" > "$HOME/.cache/pidofbar"
# MODULES
update_crypto() {
local c="$(crypto)"
[ -n c ] && crypto="$c |"
}
update_cpu() {
cpu="$(grep -o "^[^ ]*" /proc/loadavg) |"
}
update_memory() {
memory="$(free -h | sed -n '2s/\([^ ]* *\)\{2\}\([^ ]*\).*/\2/p') |"
}
update_bat() {
local dir; dir="$(echo /sys/class/power_supply/BAT*/ | sort -n | tail -n1)"
bat="$(grep -q Charging "$dir/status" && printf '' || printf '')"
bat="$bat $(cat "$dir/capacity")% |"
}
update_vol() {
local v; v="$(wpctl get-volume '@DEFAULT_AUDIO_SINK@')"
if grep -q 'MUTED' <<< "$v"; then
vol='🔇'
else
vol="$((10#$(tr -dc '0-9' <<< "$v")))"
fi
vol="$vol |"
}
update_wlp() {
local sig; sig="$(grep wlp /proc/net/wireless | awk '{print $3 * 100}')"
local ssid; ssid="$(nmcli device wifi show-password | grep SSID | sed 's/SSID: //')"
[ -z "$ssid" ] && wlp='⚠' && return
[ -z "$sig" ] && sig=0
# https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/blob/d9b06a95/src/libnmc-base/nm-client-utils.c#L628
{ [ "$sig" -gt 5600 ] && wlp="▂▄▆█ $ssid"; } ||
{ [ "$sig" -gt 3850 ] && wlp="▂▄▆_ $ssid"; } ||
{ [ "$sig" -gt 1650 ] && wlp="▂▄__ $ssid"; } ||
{ [ "$sig" -gt 275 ] && wlp="▂___ $ssid"; } ||
{ wlp="____ $ssid"; }
wlp="$wlp |"
}
update_time() {
time="$(date "+%a %m/%d %R")"
}
# modules that don't update on their own need to be run at the start for getting their initial value
while [ -z "$(wpctl get-volume '@DEFAULT_AUDIO_SINK@' 2> /dev/null)" ]; do
sleep 1
done
update_vol
reload_bar() {
sec=0
}
display() {
"${DISPLAYCMD[@]}" "$crypto $cpu $memory $vol $wlp $bat $time"
}
# SIGNALING
# trap '<function>;display' 'RTMIN+n'
trap 'reload_bar;display' 'RTMIN'
trap 'update_vol;display' 'RTMIN+1'
trap 'update_crypto;display' 'RTMIN+2'
# to update it from external commands
## kill -m "$(cat ~/.cache/pidofbar)"
# where m = 34 + n
if [ "$XDG_SESSION_TYPE" = wayland ]; then
DISPLAYCMD=(echo)
else
DISPLAYCMD=(xsetroot -name)
fi
# crypto & > /tmp
# sleep 5 && cat /tmp
sec=0
while true; do
[ "$((sec % 300))" = 0 ] && update_crypto
[ "$((sec % 10))" = 0 ] && {
update_time
update_cpu
update_memory
update_bat
update_wlp
display
}
sleep "$(awk "BEGIN {s=$(date '+%S.%N'); print 10 - s % 10}")" & wait
sec="$((sec + 10))"
done