srdusr
aboutsummaryrefslogtreecommitdiffstats
path: root/config
diff options
context:
space:
mode:
authorsrdusr <[email protected]>2026-07-23 22:56:00 +0200
committersrdusr <[email protected]>2026-07-23 22:56:00 +0200
commit8ed79c21a53e10c29ea35b9a605250ea18f191cf (patch)
tree22fbfc5a9348c7449a0b831e8066020a5faa68a4 /config
parentc3a34348b39c9518ad2e5bb28569fb9d78ce5dc1 (diff)
downloadsrdwm-8ed79c21a53e10c29ea35b9a605250ea18f191cf.tar.gz
srdwm-8ed79c21a53e10c29ea35b9a605250ea18f191cf.zip
Do not draw a window before its client has painted anything
Reported as "before a window spawns, the border corners look funny". A toplevel is placed, sized and decorated the moment its role is created, which is well before the client draws. srdwm was rendering it from that moment, so what appeared first was an empty frame: border, titlebar and shadow standing around bare desktop, at the guessed 800x600 placeholder size, with nothing inside. When the real buffer arrived the frame snapped to the real size. Measured in a nested session, capturing a cold terminal's spawn with grim: four consecutive captured frames spanning 540ms showed a complete red border with zero client content inside it, at 642px outer height, which then settled at 610 - a jump of exactly one TITLEBAR_HEIGHT. After this change the same capture has no such frame at all: every frame that shows a border shows content in it, and the height does not change afterward. Two parts: - Nothing is drawn for a window that has never committed a buffer. All five paths that draw a frame agree on this - both udev render loops (Pixman and GPU), the winit render loop, and both screencopy paths, so a screenshot cannot show a frame the screen does not. - The open-slide starts at the first commit that carries a buffer rather than at role creation. A cold terminal took ~800ms to paint, long enough for the whole tween to finish against the empty frame, so the window simply appeared, already at rest, with no animation at all. It now animates where it can actually be seen. The answer latches once true (windows_shown_once), so a window that has legitimately shown something is never hidden again by this however its buffer state changes. A window that cannot be resolved to a surface counts as drawable, deliberately: this hides a window only on positive evidence that it has never drawn, so nothing whose surface plumbing works differently - an XWayland window - can be hidden by a lookup that did not apply to it. Same shape, and the same reason, as sync_layer_visibility's own has_buffer branch, which layer surfaces have had all along. 533 tests pass, clippy clean.
Diffstat (limited to 'config')
0 files changed, 0 insertions, 0 deletions