diff options
| author | srdusr <[email protected]> | 2025-12-01 19:28:00 +0200 |
|---|---|---|
| committer | srdusr <[email protected]> | 2025-12-01 19:28:00 +0200 |
| commit | 9e88d3e3f86a1248b72fdb9bab59d9936a3323a6 (patch) | |
| tree | 4e96d180377b7b450fc60d236ceb5090d19efa0e /crates/wayland/src/protocols | |
| parent | d48dfec46a6502d23648053916c2af91ee2a6f2e (diff) | |
| download | srdwm-9e88d3e3f86a1248b72fdb9bab59d9936a3323a6.tar.gz srdwm-9e88d3e3f86a1248b72fdb9bab59d9936a3323a6.zip | |
Let a new window pick its own size instead of forcing a guessed placeholder
Root-caused "windows spawn small and square, not remembering placement or
size": new_managed_window hardcoded a fresh toplevel's geometry to 800x632
before the client had said anything about its own preferred size, and
sync_geometry forced that guess onto the client's very first
xdg_toplevel::configure unconditionally. Per xdg-shell, size: None on that
first configure is how every mainstream compositor lets a client pick its
own natural size instead; this one never did, so every app converged on
the same placeholder rectangle regardless of what it would have chosen.
Window::size_is_provisional marks a size that really was just the guess
(not a remembered geometry, a rule's explicit geometry action, or a
maximize/phone-mode fill, none of which are guesses). sync_geometry sends
size: None for such a window's first configure; a new adopt_provisional_size,
called from the commit handler, adopts the client's own real first size
into Window::geometry the moment it commits one, clamping only position so
a bigger-than-guessed window can't hang off its monitor's edge.
Live-verified in a nested compositor: a zenity dialog now renders at its
own compact natural size instead of being stretched to the old guess.
Diffstat (limited to 'crates/wayland/src/protocols')
| -rw-r--r-- | crates/wayland/src/protocols/compositor.rs | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/crates/wayland/src/protocols/compositor.rs b/crates/wayland/src/protocols/compositor.rs index f7e7b74..e2868e4 100644 --- a/crates/wayland/src/protocols/compositor.rs +++ b/crates/wayland/src/protocols/compositor.rs @@ -83,6 +83,13 @@ impl CompositorHandler for CompState { if let Some(w) = self.id_to_window.get(&id) { w.on_commit(); } + // See `Window::size_is_provisional`'s own doc comment: before + // anything below reads `Window::geometry` (`redraw_decoration_ + // buffer`, `sync_geometry`), give a window still waiting on its + // own first real size a chance to adopt it from what `on_commit` + // just recomputed, rather than keep rendering/configuring + // against the guessed placeholder for one more round-trip. + self.adopt_provisional_size(id); // See `content_epoch`'s doc comment: this is the only per-commit // signal the udev backend's rounded-corner mask cache has to // invalidate itself, since content can change every frame, |