libdecor: use same fullscreen/maximised restore logic as for xdg-toplevel

This commit is contained in:
Christian Rauch 2021-08-01 18:14:53 +01:00 committed by Sam Lantinga
parent 42452f8ca5
commit cfcdfb7be9
1 changed files with 55 additions and 22 deletions

View File

@ -320,12 +320,18 @@ decoration_frame_configure(struct libdecor_frame *frame,
enum libdecor_window_state window_state; enum libdecor_window_state window_state;
struct libdecor_state *state; struct libdecor_state *state;
SDL_bool fullscreen = SDL_FALSE;
SDL_bool maximized = SDL_FALSE;
/* window size */ /* window size */
if (!libdecor_configuration_get_content_size(configuration, frame, &width, &height)) { if (!libdecor_configuration_get_content_size(configuration, frame, &width, &height)) {
width = window->w; width = wind->floating_width;
height = window->h; height = wind->floating_height;
} }
width = (width == 0) ? window->w : width;
height = (height == 0) ? window->h : height;
wind->resize.width = width; wind->resize.width = width;
wind->resize.height = height; wind->resize.height = height;
@ -342,38 +348,65 @@ decoration_frame_configure(struct libdecor_frame *frame,
window_state = LIBDECOR_WINDOW_STATE_NONE; window_state = LIBDECOR_WINDOW_STATE_NONE;
} }
/* Always send maximized/restored/focus events; if the event is redundant it will /* translate libdecor to SDL states */
* automatically be discarded (see src/events/SDL_windowevents.c). switch (window_state) {
* case LIBDECOR_WINDOW_STATE_FULLSCREEN:
* No, we do not get minimize events from libdecor. fullscreen = SDL_TRUE;
*/ break;
if (window_state & LIBDECOR_WINDOW_STATE_FULLSCREEN) { case LIBDECOR_WINDOW_STATE_MAXIMIZED:
window->flags |= SDL_WINDOW_FULLSCREEN; maximized = SDL_TRUE;
} else { break;
}
if (!fullscreen) {
if (window->flags & SDL_WINDOW_FULLSCREEN) { if (window->flags & SDL_WINDOW_FULLSCREEN) {
/* We might need to re-enter fullscreen after being restored from minimized */ /* We might need to re-enter fullscreen after being restored from minimized */
SDL_WaylandOutputData *driverdata = (SDL_WaylandOutputData *) SDL_GetDisplayForWindow(window)->driverdata; SDL_WaylandOutputData *driverdata = (SDL_WaylandOutputData *) SDL_GetDisplayForWindow(window)->driverdata;
SetFullscreen(window, driverdata->output); SetFullscreen(window, driverdata->output);
fullscreen = SDL_TRUE;
}
if (width == 0 || height == 0) {
width = wind->floating_width;
height = wind->floating_height;
}
if ((window->flags & SDL_WINDOW_RESIZABLE)) {
if (window->max_w > 0) {
width = SDL_min(width, window->max_w);
}
width = SDL_max(width, window->min_w);
if (window->max_h > 0) {
height = SDL_min(height, window->max_h);
}
height = SDL_max(height, window->min_h);
} else { } else {
wind->resize.width = window->w;
wind->resize.height = window->h;
return;
}
}
if (!fullscreen) {
SDL_SendWindowEvent(window, SDL_SendWindowEvent(window,
(window_state & LIBDECOR_WINDOW_STATE_MAXIMIZED) ? maximized ?
SDL_WINDOWEVENT_MAXIMIZED : SDL_WINDOWEVENT_MAXIMIZED :
SDL_WINDOWEVENT_RESTORED, SDL_WINDOWEVENT_RESTORED,
0, 0); 0, 0);
} }
window->flags &= ~SDL_WINDOW_FULLSCREEN;
}
SDL_SendWindowEvent(window,
(window_state & LIBDECOR_WINDOW_STATE_ACTIVE) ?
SDL_WINDOWEVENT_FOCUS_GAINED :
SDL_WINDOWEVENT_FOCUS_LOST,
0, 0);
/* commit frame state */ /* commit frame state */
state = libdecor_state_new(width, height); state = libdecor_state_new(width, height);
libdecor_frame_commit(frame, state, configuration); libdecor_frame_commit(frame, state, configuration);
libdecor_state_free(state); libdecor_state_free(state);
/* store floating dimensions */
if (libdecor_frame_is_floating(frame)) {
wind->floating_width = width;
wind->floating_height = height;
}
/* Update the resize capability. Since this will change the capabilities and /* Update the resize capability. Since this will change the capabilities and
* commit a new frame state with the last known content dimension, this has * commit a new frame state with the last known content dimension, this has
* to be called after the new state has been commited and the new content * to be called after the new state has been commited and the new content