wayland: Fix SDL_SetWindowSize() being dropped right after exiting fullscreen

If we get a SDL_SetWindowSize() call right after SDL_SetWindowFullscreen() but
before we've gotten a new configure event from the compositor, the attempt to
set our window size will silently fail (when libdecor is enabled).

Fix this by remembering that we need to commit a new size, so we can do that
in decoration_frame_configure().
main
Cameron Gutman 2022-01-26 18:26:07 -06:00 committed by Ethan Lee
parent c6ec5a07f1
commit 77a9ca6ba0
2 changed files with 5 additions and 1 deletions

View File

@ -414,9 +414,10 @@ decoration_frame_configure(struct libdecor_frame *frame,
if (window->flags & SDL_WINDOW_ALLOW_HIGHDPI) { if (window->flags & SDL_WINDOW_ALLOW_HIGHDPI) {
scale_factor = driverdata->scale_factor; scale_factor = driverdata->scale_factor;
} }
} else if (!(window->flags & SDL_WINDOW_RESIZABLE)) { } else if (!(window->flags & SDL_WINDOW_RESIZABLE) || (floating && wind->floating_resize_pending)) {
width = window->windowed.w; width = window->windowed.w;
height = window->windowed.h; height = window->windowed.h;
wind->floating_resize_pending = SDL_FALSE;
} else { } else {
/* This will never set 0 for width/height unless the function returns false */ /* This will never set 0 for width/height unless the function returns false */
if (!libdecor_configuration_get_content_size(configuration, frame, &width, &height)) { if (!libdecor_configuration_get_content_size(configuration, frame, &width, &height)) {
@ -1424,6 +1425,8 @@ void Wayland_SetWindowSize(_THIS, SDL_Window * window)
if (data->shell.libdecor && if (data->shell.libdecor &&
wind->shell_surface.libdecor.frame && wind->shell_surface.libdecor.frame &&
!libdecor_frame_is_floating(wind->shell_surface.libdecor.frame)) { !libdecor_frame_is_floating(wind->shell_surface.libdecor.frame)) {
/* Commit the resize when we re-enter floating state */
wind->floating_resize_pending = SDL_TRUE;
return; return;
} }
#endif #endif

View File

@ -87,6 +87,7 @@ typedef struct {
float scale_factor; float scale_factor;
SDL_bool needs_resize_event; SDL_bool needs_resize_event;
SDL_bool floating_resize_pending;
} SDL_WindowData; } SDL_WindowData;
extern void Wayland_ShowWindow(_THIS, SDL_Window *window); extern void Wayland_ShowWindow(_THIS, SDL_Window *window);