diff --git a/test/shell.d/runtime-smoke-test.sh b/test/shell.d/runtime-smoke-test.sh index d6006b73..321bbbdb 100755 --- a/test/shell.d/runtime-smoke-test.sh +++ b/test/shell.d/runtime-smoke-test.sh @@ -230,18 +230,23 @@ for panel_id in omarchy.audio omarchy.bluetooth omarchy.monitor omarchy.network done pass "direct panel IPC opens and closes default panels" -# Each widget registers its IPC handler once while the shell starts. A second -# registration for the same target means two instances of that widget were -# live at once, which is what duplicate component loads produced: every sync -# pass that ran while a widget's asynchronous load was still in flight started -# a second load, and swapping a slot's component builds the replacement before -# dropping the original. Checked before the reload below, which rebuilds -# widgets by design. -if grep -q "another handler is registered for target" "$log"; then +# Each widget registers its IPC handler once per bar, and the bar is +# instantiated once per screen, so Quickshell reports one collision per screen +# past the first. Anything beyond that is two instances on the same screen — +# the shape duplicate component loads produced, where a sync pass that ran +# while a widget's asynchronous load was still in flight started a second one. +# Checked before the reload below, which rebuilds widgets by design. +screens=$(hyprctl -j monitors 2>/dev/null | jq 'length' 2>/dev/null || true) +[[ $screens =~ ^[0-9]+$ ]] && (( screens > 0 )) || screens=1 +# No matches is the good case, and pipefail would otherwise abort the run. +worst=$(grep -oE "another handler is registered for target [a-z.-]+" "$log" | + sort | uniq -c | sort -rn | head -1 | awk '{print $1}' || true) +worst=${worst:-0} +if (( worst > screens - 1 )); then grep "another handler is registered for target" "$log" | sed 's/^/ /' | head -20 >&2 - fail_with_log "each widget registers its IPC handler once while starting" + fail_with_log "each widget registers its IPC handler once per screen (saw $worst for $screens screen(s))" fi -pass "each widget registers its IPC handler once while starting" +pass "each widget registers its IPC handler once per screen" HOME="$test_home" OMARCHY_PATH="$test_root" PATH="$ROOT/bin:$PATH" "$ROOT/bin/omarchy-bar-plugin" remove omarchy.audio