From 0b0dcd8013b98fb1ac5e57921f79c25df952f262 Mon Sep 17 00:00:00 2001 From: sommerfeld Date: Tue, 21 Apr 2026 01:24:42 +0100 Subject: waybar: use iwctl (from iwd) instead of iw for wifi status --- dot_config/waybar/executable_wifi-status.sh | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) mode change 100644 => 100755 dot_config/waybar/executable_wifi-status.sh (limited to 'dot_config') diff --git a/dot_config/waybar/executable_wifi-status.sh b/dot_config/waybar/executable_wifi-status.sh old mode 100644 new mode 100755 index 082551f..b93a28c --- 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" -- cgit v1.2.3-70-g09d2