#!/usr/bin/env zsh PANEL_FIFO="$1" PREFIX="$2" DELAY="$3" MAX_LEN="$(("$4"-3))" exec 5>"$PANEL_FIFO" main() { local win_id="$(bspc query -N -n focused)" local win_name="$(xprop -id "$win_id" | grep "^WM_NAME" | cut -d' ' -f3- | tr -d '"')" local trimmed_win_name="${win_name:0:$MAX_LEN}" if [[ "$win_name" != "$trimmed_win_name" ]]; then win_name="${trimmed_win_name}..." fi REPLY="$trimmed_win_name" } # Run 2 loops here, one for instant updates once other window is focused # in bspwm, other for timed updates, in case the window changes it's title # on it's own (such as when we switch a tab in firefox) {print init; stdbuf -oL bspc subscribe node} | while read line; do case ${line} in node_focus* ) main ;; init ) main ;; * ) continue ;; esac echo "$PREFIX $REPLY" >&5 done & while :; do main echo "$PREFIX $REPLY" >&5 sleep "$DELAY" done wait $!