From: Cwooper <cwooperm@gmail.com> When a window sets WS_MINIMIZE, the driver was sending xdg_toplevel_unset_fullscreen/unset_maximized, causing the compositor to respond with a 0x0 configure that stalls Vulkan present. Detect WS_MINIMIZE and call xdg_toplevel_set_minimized instead, suppressing the incorrect unset transitions. Wine-Bug: http://bugs.winehq.org/show_bug.cgi?id=59577 --- dlls/winewayland.drv/waylanddrv.h | 1 + dlls/winewayland.drv/window.c | 12 ++++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/dlls/winewayland.drv/waylanddrv.h b/dlls/winewayland.drv/waylanddrv.h index ad41a1b474e..4aef4d2e9b9 100644 --- a/dlls/winewayland.drv/waylanddrv.h +++ b/dlls/winewayland.drv/waylanddrv.h @@ -235,6 +235,7 @@ struct wayland_window_config double scale; BOOL visible; BOOL managed; + BOOL minimized; }; struct wayland_client_surface diff --git a/dlls/winewayland.drv/window.c b/dlls/winewayland.drv/window.c index fff3eed36f6..ea98618ca36 100644 --- a/dlls/winewayland.drv/window.c +++ b/dlls/winewayland.drv/window.c @@ -159,6 +159,8 @@ static void wayland_win_data_get_config(struct wayland_win_data *data, TRACE("window=%s style=%#x\n", wine_dbgstr_rect(&conf->rect), style); + conf->minimized = !!(style & WS_MINIMIZE); + /* The fullscreen state is implied by the window position and style. */ if (data->is_fullscreen) { @@ -267,12 +269,14 @@ static void wayland_surface_update_state_toplevel(struct wayland_surface *surfac /* First do all state unsettings, before setting new state. Some * Wayland compositors misbehave if the order is reversed. */ if (!(surface->window.state & WAYLAND_SURFACE_CONFIG_STATE_MAXIMIZED) && - (surface->current.state & WAYLAND_SURFACE_CONFIG_STATE_MAXIMIZED)) + (surface->current.state & WAYLAND_SURFACE_CONFIG_STATE_MAXIMIZED) && + !surface->window.minimized) { xdg_toplevel_unset_maximized(surface->xdg_toplevel); } if (!(surface->window.state & WAYLAND_SURFACE_CONFIG_STATE_FULLSCREEN) && - (surface->current.state & WAYLAND_SURFACE_CONFIG_STATE_FULLSCREEN)) + (surface->current.state & WAYLAND_SURFACE_CONFIG_STATE_FULLSCREEN) && + !surface->window.minimized) { xdg_toplevel_unset_fullscreen(surface->xdg_toplevel); } @@ -287,6 +291,10 @@ static void wayland_surface_update_state_toplevel(struct wayland_surface *surfac { xdg_toplevel_set_fullscreen(surface->xdg_toplevel, NULL); } + if (surface->window.minimized) + { + xdg_toplevel_set_minimized(surface->xdg_toplevel); + } } else { -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10487