diff options
Diffstat (limited to 'dot_config/waybar/executable_wifi-status.sh')
| -rwxr-xr-x[-rw-r--r--] | dot_config/waybar/executable_wifi-status.sh | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/dot_config/waybar/executable_wifi-status.sh b/dot_config/waybar/executable_wifi-status.sh index 082551f..b93a28c 100644..100755 --- a/dot_config/waybar/executable_wifi-status.sh +++ b/dot_config/waybar/executable_wifi-status.sh @@ -1,19 +1,27 @@ #!/bin/sh -# Emit waybar JSON describing wifi link state. Handles bond-slaved wlan -# interfaces where waybar's built-in network module fails to detect wifi. +# Emit waybar JSON describing wifi link state. Uses iwctl (from iwd) so we +# don't need the separate `iw` package. Handles bond-slaved wlan where +# waybar's built-in network module fails to detect wifi. set -eu iface=wlan0 -link=$(iw dev "$iface" link 2>/dev/null || true) -if [ -z "$link" ] || [ "$link" = "Not connected." ]; then +# iwctl emits ANSI colour codes even when stdout is a pipe; strip them. +out=$(iwctl station "$iface" show 2>/dev/null | sed 's/\x1b\[[0-9;]*[a-zA-Z]//g' || true) + +state=$(printf '%s\n' "$out" | awk '/ State / {print $NF; exit}') +if [ "$state" != "connected" ]; then printf '{"text":"wifi off","class":"down"}\n' exit 0 fi -ssid=$(printf '%s\n' "$link" | awk -F': ' '/^\tSSID:/{print $2; exit}') -dbm=$(printf '%s\n' "$link" | awk '/signal:/{print $2; exit}') -pct=$(awk -v r="${dbm:-0}" 'BEGIN{p=2*(r+100); if(p>100)p=100; if(p<0)p=0; printf "%d",p}') +ssid=$(printf '%s\n' "$out" | + sed -n 's/^[[:space:]]*Connected network[[:space:]]\{2,\}//p' | + sed 's/[[:space:]]*$//') +rssi=$(printf '%s\n' "$out" | + sed -n 's/^[[:space:]]*\*\{0,1\}[[:space:]]*AverageRSSI[[:space:]]\{2,\}//p' | + awk '{print $1; exit}') +pct=$(awk -v r="${rssi:-0}" 'BEGIN{p=2*(r+100); if(p>100)p=100; if(p<0)p=0; printf "%d",p}') printf '{"text":"%s %s%%","class":"up","tooltip":"%s ยท %s dBm"}\n' \ - "$ssid" "$pct" "$iface" "$dbm" + "$ssid" "$pct" "$iface" "$rssi" |
