mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-05-10 06:19:36 -04:00
hasFullscreenToplevelOnScreen's fast-path used `NiriService.currentOutput === screenName` as a proxy for "the active toplevel is on screenName". Those are two independent state channels (niri's workspace-activated events drive currentOutput; wlr-foreign-toplevel-management drives ToplevelManager.activeToplevel) and they don't update atomically. When focus crosses from a fullscreen toplevel on monitor A to a non-fullscreen toplevel on monitor B, currentOutput flips to B before activeToplevel updates away from A's still-fullscreen-and-activated window. For one tick, B's bar evaluates `active.fullscreen && active.activated && currentOutput === B` → true, hides itself, then flips back when activeToplevel finally updates. Visible as a one-frame bar flicker on focus changes between monitors when one has a fullscreen window. Replace the proxy with _toplevelOnScreen(active, screenName), the same helper the X11 fallback path uses 25 lines below. The check now inspects the toplevel's actual outputs instead of trusting a separate state signal, so the race can't fire. The per-workspace loop below was already correct; it would catch any real fullscreen+activated toplevel on the bar's workspace regardless of focused output. The fast-path was redundant when the assertion held and wrong when it didn't. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>