winewayland.drv: Ignore spurious size hints.

Due to the asynchronous nature of Wayland events, and the design of the
xdg_toplevel protocol, an xdg configure event may be a reaction to a
request in the application's configuration past, and the size hint may
be out of date. For example:

1. The client commits a 100x100 buffer to a surface.
2.1 The compositor sends xdg configure(100x100, state=activated).
2.2 In the meantime, the client resizes and commits a 50x50 buffer.
3. The client receives the event from (2.1). If we respect the
   size hint, we will resize back to 100x100, although this was
   neither the client's nor the compositor's intention.

To mitigate this we ignore size hints for states that do not
require strict size adherence.
This commit is contained in:
Alexandros Frantzis 2023-10-27 15:11:36 +03:00 committed by Alexandre Julliard
parent 9ddd0a5cb6
commit e0591fafae

View file

@ -412,9 +412,18 @@ static void wayland_configure_window(HWND hwnd)
surface->processing = surface->requested;
memset(&surface->requested, 0, sizeof(surface->requested));
width = surface->processing.width;
height = surface->processing.height;
state = surface->processing.state;
/* Ignore size hints if we don't have a state that requires strict
* size adherence, in order to avoid spurious resizes. */
if (state)
{
width = surface->processing.width;
height = surface->processing.height;
}
else
{
width = height = 0;
}
if ((state & WAYLAND_SURFACE_CONFIG_STATE_RESIZING) && !surface->resizing)
{