xdg_shell: don't overwrite for_window directive geometry

When a floating container is resized (e.g., via for_window rules or
internal transactions), a race condition occurs if the client commits a
buffer with its old geometry before processing the new configure event.

Sway currently accepts these stale dimensions and calls
view_update_size, causing the container to snap back to the client's
previous size and overwriting the compositor's intended geometry.
This commit is contained in:
Furkan Sahin 2026-04-15 14:45:03 -04:00
parent 9a5f09c867
commit 6ca9eea081

View file

@ -321,7 +321,8 @@ static void handle_commit(struct wl_listener *listener, void *data) {
// containers, we resize the container to match. For tiling containers,
// we only recenter the surface.
memcpy(&view->geometry, new_geo, sizeof(struct wlr_box));
if (container_is_floating(view->container)) {
bool pending_configures = xdg_surface->current.configure_serial < xdg_surface->scheduled_serial;
if (container_is_floating(view->container) && !view->container->node.instruction && !pending_configures) {
view_update_size(view);
// Only set the toplevel size the current container actually has a size.
if (view->container->current.width) {