The bar's PanelWindow was screen-sized because the frame band and every
panel drew into it. Hyprland blurs that namespace, and blur is recomputed
whenever what is behind the surface changes — with a game underneath, that
is every pixel every frame. Measured at 3440x1440 it cost a third of the
card; the diagnostic shrink took game-running GPU 57% -> 38% and made the
stutter unprovokable.
So the surface is now barWidth at rest and grows to the screen only while a
dropdown, the toast or the launcher is up. exclusiveZone is unchanged, so
windows never reflow on resize. chromeSdf's cutout derives from
screen.width rather than the surface width, so the shader is identical at
both sizes and the narrow surface simply clips it.
The frame band moves to its own background-layer surface, below windows and
matched by no blur rule. Its shader hides (rather than the window
unmapping, which would flicker) while the bar is wide, since chromeSdf then
draws the frame itself and melts panels into it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>