From 5542c53a39977b95ee531283fefa62223fc34b2f Mon Sep 17 00:00:00 2001 From: Filip Rojek Date: Mon, 10 Nov 2025 15:27:47 +0100 Subject: [PATCH] waybar: added pipewire listener for displaying audio status changes in real time --- .config/river/init | 3 +++ .config/waybar/config.jsonc | 1 + .local/bin/waybar_audio_event_bridge.sh | 26 +++++++++++++++++++++++++ 3 files changed, 30 insertions(+) create mode 100755 .local/bin/waybar_audio_event_bridge.sh diff --git a/.config/river/init b/.config/river/init index 1376d51..fe2f5e6 100755 --- a/.config/river/init +++ b/.config/river/init @@ -201,6 +201,9 @@ riverctl spawn "wlclock --layer background --background-colour '#00000000' --clo #riverctl spawn "$HOME/.config/river/bar" riverctl spawn waybar +# Start waybar audio listener +~/.local/bin/waybar_audio_event_bridge.sh & + # Idle configuration riverctl spawn "swayidle -w timeout 1200 'wlopm --off \"*\"' resume 'wlopm --on \"*\"' before-sleep 'waylock -fork-on-lock'" diff --git a/.config/waybar/config.jsonc b/.config/waybar/config.jsonc index 4246254..25fa9ba 100644 --- a/.config/waybar/config.jsonc +++ b/.config/waybar/config.jsonc @@ -71,6 +71,7 @@ "custom/audio": { "exec": "~/.local/bin/waybar_audio.sh", + "signal": 8, "return-type": "json", "format": "{icon} {text}", "format-icons": { diff --git a/.local/bin/waybar_audio_event_bridge.sh b/.local/bin/waybar_audio_event_bridge.sh new file mode 100755 index 0000000..62e663e --- /dev/null +++ b/.local/bin/waybar_audio_event_bridge.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +set -euo pipefail +SIG=8 + +get_waybar_pid() { pgrep -u "$USER" -x waybar | head -n1 || true; } +log() { echo "[waybar-audio-bridge] $*" >&2; } + +WAYBAR_PID="" +while [[ -z "$WAYBAR_PID" ]]; do + WAYBAR_PID="$(get_waybar_pid)" + sleep 1 +done +log "connected to Waybar PID $WAYBAR_PID" + +# read pw-mon output, but only care about Audio nodes +pw-mon 2>/dev/null | grep --line-buffered -E "Audio|Sink|Source|Stream|Node" | while read -r _; do + # small debounce to avoid spamming CPU when multiple updates arrive fast + sleep 0.2 + if ! kill -0 "$WAYBAR_PID" 2>/dev/null; then + WAYBAR_PID="$(get_waybar_pid)" + [[ -z "$WAYBAR_PID" ]] && continue + log "reconnected to Waybar PID $WAYBAR_PID" + fi + kill -RTMIN+"$SIG" "$WAYBAR_PID" 2>/dev/null || true +done +