From 7a6e34f153760cbb574f0541814e0bafa5ebc740 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sun, 26 Jul 2026 22:29:48 -0700 Subject: [PATCH] Scale the IPC handler check to the number of screens The bar is instantiated once per screen, so each widget registers its IPC handler once per screen and Quickshell reports a collision for every screen past the first. Failing on any collision would have failed the suite on multi-monitor desktops for behaviour that is correct; allow one per screen and fail only beyond that, which is still what duplicate component loads produce. Co-Authored-By: Claude Opus 5 (1M context) --- test/shell.d/runtime-smoke-test.sh | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) 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