wayland: store and restore floating states

Some Wayland compositors send (0,0) as "suggested" configure event sizes to
indicate that the client has to decide on its own which sizes to used. This
is commonly done when restoring from maximised, fullscreen or tiles states
to fullscreen.
We now store the last known floating states in a new set of variables and
restore them when we receive such a (0,0) configure event.
main
Christian Rauch 2021-08-01 13:51:30 +01:00 committed by Sam Lantinga
parent d4e1b4974a
commit 42452f8ca5
2 changed files with 30 additions and 4 deletions

View File

@ -214,11 +214,23 @@ handle_configure_xdg_toplevel(void *data,
enum xdg_toplevel_state *state;
SDL_bool fullscreen = SDL_FALSE;
SDL_bool maximized = SDL_FALSE;
SDL_bool floating = SDL_TRUE;
wl_array_for_each(state, states) {
if (*state == XDG_TOPLEVEL_STATE_FULLSCREEN) {
switch (*state) {
case XDG_TOPLEVEL_STATE_FULLSCREEN:
fullscreen = SDL_TRUE;
} else if (*state == XDG_TOPLEVEL_STATE_MAXIMIZED) {
floating = SDL_FALSE;
break;
case XDG_TOPLEVEL_STATE_MAXIMIZED:
maximized = SDL_TRUE;
floating = SDL_FALSE;
break;
case XDG_TOPLEVEL_STATE_TILED_LEFT:
case XDG_TOPLEVEL_STATE_TILED_RIGHT:
case XDG_TOPLEVEL_STATE_TILED_TOP:
case XDG_TOPLEVEL_STATE_TILED_BOTTOM:
floating = SDL_FALSE;
break;
}
}
@ -231,8 +243,8 @@ handle_configure_xdg_toplevel(void *data,
}
if (width == 0 || height == 0) {
width = window->windowed.w;
height = window->windowed.h;
width = wind->floating_width;
height = wind->floating_height;
}
/* xdg_toplevel spec states that this is a suggestion.
@ -274,6 +286,12 @@ handle_configure_xdg_toplevel(void *data,
return;
}
if (floating) {
/* store current floating dimensions for restoring */
wind->floating_width = width;
wind->floating_height = height;
}
wind->resize.width = width;
wind->resize.height = height;
}
@ -1303,6 +1321,11 @@ void Wayland_SetWindowSize(_THIS, SDL_Window * window)
}
#endif
if (!(window->flags & (SDL_WINDOW_FULLSCREEN | SDL_WINDOW_MAXIMIZED))) {
wind->floating_width = window->w;
wind->floating_height = window->h;
}
region = wl_compositor_create_region(data->compositor);
wl_region_add(region, 0, 0, window->w, window->h);
wl_surface_set_opaque_region(wind->surface, region);

View File

@ -68,6 +68,9 @@ typedef struct {
struct zwp_idle_inhibitor_v1 *idle_inhibitor;
struct xdg_activation_token_v1 *activation_token;
/* floating dimensions for restoring from maximized and fullscreen */
int floating_width, floating_height;
SDL_atomic_t swap_interval_ready;
#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH