mirror of https://github.com/encounter/SDL.git
wayland: Fix toggling fullscreen with fixed-size windows
This commit is contained in:
parent
0f4aba7bcd
commit
c7e29a9e95
|
@ -43,12 +43,60 @@ static float get_window_scale_factor(SDL_Window *window) {
|
||||||
return ((SDL_WindowData*)window->driverdata)->scale_factor;
|
return ((SDL_WindowData*)window->driverdata)->scale_factor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
CommitMinMaxDimensions(SDL_Window *window)
|
||||||
|
{
|
||||||
|
SDL_WindowData *wind = window->driverdata;
|
||||||
|
SDL_VideoData *data = wind->waylandData;
|
||||||
|
int min_width, min_height, max_width, max_height;
|
||||||
|
|
||||||
|
if (window->flags & SDL_WINDOW_FULLSCREEN) {
|
||||||
|
min_width = 0;
|
||||||
|
min_height = 0;
|
||||||
|
max_width = 0;
|
||||||
|
max_height = 0;
|
||||||
|
} else if (window->flags & SDL_WINDOW_RESIZABLE) {
|
||||||
|
min_width = window->min_w;
|
||||||
|
min_height = window->min_h;
|
||||||
|
max_width = window->max_w;
|
||||||
|
max_height = window->max_h;
|
||||||
|
} else {
|
||||||
|
min_width = window->w;
|
||||||
|
min_height = window->h;
|
||||||
|
max_width = window->w;
|
||||||
|
max_height = window->h;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data->shell.xdg) {
|
||||||
|
xdg_toplevel_set_min_size(wind->shell_surface.xdg.roleobj.toplevel,
|
||||||
|
min_width,
|
||||||
|
min_height);
|
||||||
|
xdg_toplevel_set_max_size(wind->shell_surface.xdg.roleobj.toplevel,
|
||||||
|
max_width,
|
||||||
|
max_height);
|
||||||
|
} else if (data->shell.zxdg) {
|
||||||
|
zxdg_toplevel_v6_set_min_size(wind->shell_surface.zxdg.roleobj.toplevel,
|
||||||
|
min_width,
|
||||||
|
min_height);
|
||||||
|
zxdg_toplevel_v6_set_max_size(wind->shell_surface.zxdg.roleobj.toplevel,
|
||||||
|
max_width,
|
||||||
|
max_height);
|
||||||
|
}
|
||||||
|
|
||||||
|
wl_surface_commit(wind->surface);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
SetFullscreen(SDL_Window *window, struct wl_output *output)
|
SetFullscreen(SDL_Window *window, struct wl_output *output)
|
||||||
{
|
{
|
||||||
SDL_WindowData *wind = window->driverdata;
|
SDL_WindowData *wind = window->driverdata;
|
||||||
SDL_VideoData *viddata = wind->waylandData;
|
SDL_VideoData *viddata = wind->waylandData;
|
||||||
|
|
||||||
|
/* The desktop may try to enforce min/max sizes here, so turn them off for
|
||||||
|
* fullscreen and on (if applicable) for windowed
|
||||||
|
*/
|
||||||
|
CommitMinMaxDimensions(window);
|
||||||
|
|
||||||
if (viddata->shell.xdg) {
|
if (viddata->shell.xdg) {
|
||||||
if (output) {
|
if (output) {
|
||||||
xdg_toplevel_set_fullscreen(wind->shell_surface.xdg.roleobj.toplevel, output);
|
xdg_toplevel_set_fullscreen(wind->shell_surface.xdg.roleobj.toplevel, output);
|
||||||
|
@ -634,40 +682,7 @@ Wayland_SetWindowBordered(_THIS, SDL_Window * window, SDL_bool bordered)
|
||||||
void
|
void
|
||||||
Wayland_SetWindowResizable(_THIS, SDL_Window * window, SDL_bool resizable)
|
Wayland_SetWindowResizable(_THIS, SDL_Window * window, SDL_bool resizable)
|
||||||
{
|
{
|
||||||
int min_width, min_height, max_width, max_height;
|
CommitMinMaxDimensions(window);
|
||||||
SDL_VideoData *data = _this->driverdata;
|
|
||||||
SDL_WindowData *wind = window->driverdata;
|
|
||||||
|
|
||||||
if (resizable) {
|
|
||||||
/* FIXME: Is there a better way to get max window size from Wayland? -flibit */
|
|
||||||
const int maxsize = 0x7FFFFFFF;
|
|
||||||
min_width = window->min_w;
|
|
||||||
min_height = window->min_h;
|
|
||||||
max_width = (window->max_w == 0) ? maxsize : window->max_w;
|
|
||||||
max_height = (window->max_h == 0) ? maxsize : window->max_h;
|
|
||||||
} else {
|
|
||||||
min_width = window->w;
|
|
||||||
min_height = window->h;
|
|
||||||
max_width = window->w;
|
|
||||||
max_height = window->h;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Note that this is also handled by the xdg-shell/wl_shell callbacks! */
|
|
||||||
if (data->shell.xdg) {
|
|
||||||
xdg_toplevel_set_min_size(wind->shell_surface.xdg.roleobj.toplevel,
|
|
||||||
min_width,
|
|
||||||
min_height);
|
|
||||||
xdg_toplevel_set_max_size(wind->shell_surface.xdg.roleobj.toplevel,
|
|
||||||
max_width,
|
|
||||||
max_height);
|
|
||||||
} else if (data->shell.zxdg) {
|
|
||||||
zxdg_toplevel_v6_set_min_size(wind->shell_surface.zxdg.roleobj.toplevel,
|
|
||||||
min_width,
|
|
||||||
min_height);
|
|
||||||
zxdg_toplevel_v6_set_max_size(wind->shell_surface.zxdg.roleobj.toplevel,
|
|
||||||
max_width,
|
|
||||||
max_height);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -786,28 +801,12 @@ int Wayland_CreateWindow(_THIS, SDL_Window *window)
|
||||||
data->shell_surface.xdg.roleobj.toplevel = xdg_surface_get_toplevel(data->shell_surface.xdg.surface);
|
data->shell_surface.xdg.roleobj.toplevel = xdg_surface_get_toplevel(data->shell_surface.xdg.surface);
|
||||||
xdg_toplevel_add_listener(data->shell_surface.xdg.roleobj.toplevel, &toplevel_listener_xdg, data);
|
xdg_toplevel_add_listener(data->shell_surface.xdg.roleobj.toplevel, &toplevel_listener_xdg, data);
|
||||||
xdg_toplevel_set_app_id(data->shell_surface.xdg.roleobj.toplevel, c->classname);
|
xdg_toplevel_set_app_id(data->shell_surface.xdg.roleobj.toplevel, c->classname);
|
||||||
if (!(window->flags & SDL_WINDOW_RESIZABLE)) {
|
|
||||||
xdg_toplevel_set_min_size(data->shell_surface.xdg.roleobj.toplevel,
|
|
||||||
window->w,
|
|
||||||
window->h);
|
|
||||||
xdg_toplevel_set_max_size(data->shell_surface.xdg.roleobj.toplevel,
|
|
||||||
window->w,
|
|
||||||
window->h);
|
|
||||||
}
|
|
||||||
} else if (c->shell.zxdg) {
|
} else if (c->shell.zxdg) {
|
||||||
data->shell_surface.zxdg.surface = zxdg_shell_v6_get_xdg_surface(c->shell.zxdg, data->surface);
|
data->shell_surface.zxdg.surface = zxdg_shell_v6_get_xdg_surface(c->shell.zxdg, data->surface);
|
||||||
/* !!! FIXME: add popup role */
|
/* !!! FIXME: add popup role */
|
||||||
data->shell_surface.zxdg.roleobj.toplevel = zxdg_surface_v6_get_toplevel(data->shell_surface.zxdg.surface);
|
data->shell_surface.zxdg.roleobj.toplevel = zxdg_surface_v6_get_toplevel(data->shell_surface.zxdg.surface);
|
||||||
zxdg_toplevel_v6_add_listener(data->shell_surface.zxdg.roleobj.toplevel, &toplevel_listener_zxdg, data);
|
zxdg_toplevel_v6_add_listener(data->shell_surface.zxdg.roleobj.toplevel, &toplevel_listener_zxdg, data);
|
||||||
zxdg_toplevel_v6_set_app_id(data->shell_surface.zxdg.roleobj.toplevel, c->classname);
|
zxdg_toplevel_v6_set_app_id(data->shell_surface.zxdg.roleobj.toplevel, c->classname);
|
||||||
if (!(window->flags & SDL_WINDOW_RESIZABLE)) {
|
|
||||||
zxdg_toplevel_v6_set_min_size(data->shell_surface.zxdg.roleobj.toplevel,
|
|
||||||
window->w,
|
|
||||||
window->h);
|
|
||||||
zxdg_toplevel_v6_set_max_size(data->shell_surface.zxdg.roleobj.toplevel,
|
|
||||||
window->w,
|
|
||||||
window->h);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
data->shell_surface.wl = wl_shell_get_shell_surface(c->shell.wl, data->surface);
|
data->shell_surface.wl = wl_shell_get_shell_surface(c->shell.wl, data->surface);
|
||||||
wl_shell_surface_set_class(data->shell_surface.wl, c->classname);
|
wl_shell_surface_set_class(data->shell_surface.wl, c->classname);
|
||||||
|
@ -885,7 +884,8 @@ int Wayland_CreateWindow(_THIS, SDL_Window *window)
|
||||||
Wayland_input_lock_pointer(c->input);
|
Wayland_input_lock_pointer(c->input);
|
||||||
}
|
}
|
||||||
|
|
||||||
wl_surface_commit(data->surface);
|
/* This will call wl_surface_commit */
|
||||||
|
CommitMinMaxDimensions(window);
|
||||||
WAYLAND_wl_display_flush(c->display);
|
WAYLAND_wl_display_flush(c->display);
|
||||||
|
|
||||||
/* we have to wait until the surface gets a "configure" event, or
|
/* we have to wait until the surface gets a "configure" event, or
|
||||||
|
@ -954,39 +954,13 @@ Wayland_HandlePendingResize(SDL_Window *window)
|
||||||
void
|
void
|
||||||
Wayland_SetWindowMinimumSize(_THIS, SDL_Window * window)
|
Wayland_SetWindowMinimumSize(_THIS, SDL_Window * window)
|
||||||
{
|
{
|
||||||
SDL_VideoData *data = _this->driverdata;
|
CommitMinMaxDimensions(window);
|
||||||
SDL_WindowData *wind = window->driverdata;
|
|
||||||
|
|
||||||
if (window->flags & SDL_WINDOW_RESIZABLE) {
|
|
||||||
if (data->shell.xdg) {
|
|
||||||
xdg_toplevel_set_min_size(wind->shell_surface.xdg.roleobj.toplevel,
|
|
||||||
window->min_w,
|
|
||||||
window->min_h);
|
|
||||||
} else if (data->shell.zxdg) {
|
|
||||||
zxdg_toplevel_v6_set_min_size(wind->shell_surface.zxdg.roleobj.toplevel,
|
|
||||||
window->min_w,
|
|
||||||
window->min_h);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Wayland_SetWindowMaximumSize(_THIS, SDL_Window * window)
|
Wayland_SetWindowMaximumSize(_THIS, SDL_Window * window)
|
||||||
{
|
{
|
||||||
SDL_VideoData *data = _this->driverdata;
|
CommitMinMaxDimensions(window);
|
||||||
SDL_WindowData *wind = window->driverdata;
|
|
||||||
|
|
||||||
if (window->flags & SDL_WINDOW_RESIZABLE) {
|
|
||||||
if (data->shell.xdg) {
|
|
||||||
xdg_toplevel_set_max_size(wind->shell_surface.xdg.roleobj.toplevel,
|
|
||||||
window->max_w,
|
|
||||||
window->max_h);
|
|
||||||
} else if (data->shell.zxdg) {
|
|
||||||
zxdg_toplevel_v6_set_max_size(wind->shell_surface.zxdg.roleobj.toplevel,
|
|
||||||
window->max_w,
|
|
||||||
window->max_h);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Wayland_SetWindowSize(_THIS, SDL_Window * window)
|
void Wayland_SetWindowSize(_THIS, SDL_Window * window)
|
||||||
|
@ -995,24 +969,6 @@ void Wayland_SetWindowSize(_THIS, SDL_Window * window)
|
||||||
SDL_WindowData *wind = window->driverdata;
|
SDL_WindowData *wind = window->driverdata;
|
||||||
struct wl_region *region;
|
struct wl_region *region;
|
||||||
|
|
||||||
if (!(window->flags & SDL_WINDOW_RESIZABLE)) {
|
|
||||||
if (data->shell.xdg) {
|
|
||||||
xdg_toplevel_set_min_size(wind->shell_surface.xdg.roleobj.toplevel,
|
|
||||||
window->w,
|
|
||||||
window->h);
|
|
||||||
xdg_toplevel_set_max_size(wind->shell_surface.xdg.roleobj.toplevel,
|
|
||||||
window->w,
|
|
||||||
window->h);
|
|
||||||
} else if (data->shell.zxdg) {
|
|
||||||
zxdg_toplevel_v6_set_min_size(wind->shell_surface.zxdg.roleobj.toplevel,
|
|
||||||
window->w,
|
|
||||||
window->h);
|
|
||||||
zxdg_toplevel_v6_set_max_size(wind->shell_surface.zxdg.roleobj.toplevel,
|
|
||||||
window->w,
|
|
||||||
window->h);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
wl_surface_set_buffer_scale(wind->surface, get_window_scale_factor(window));
|
wl_surface_set_buffer_scale(wind->surface, get_window_scale_factor(window));
|
||||||
|
|
||||||
if (wind->egl_window) {
|
if (wind->egl_window) {
|
||||||
|
|
Loading…
Reference in New Issue