mirror of https://github.com/encounter/SDL.git
libdecor: use same fullscreen/maximised restore logic as for xdg-toplevel
This commit is contained in:
parent
42452f8ca5
commit
cfcdfb7be9
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue