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 patch prevents the overwrite by checking two conditions:
1. !node.instruction: Ensures we aren't mid-transaction.
2. !pending_configures: Compares current.configure_serial against
   scheduled_serial to ensure the client has acknowledged the latest
   requested dimensions before we allow it to dictate a resize.
This commit is contained in:
Furkan Sahin 2026-04-15 14:45:03 -04:00
parent e51f9d7183
commit aa1ec44e27

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) {