wayland: Add the libdecor toplevel bounds and constraints properties
This commit is contained in:
@@ -1198,6 +1198,7 @@ static void decoration_frame_configure(struct libdecor_frame *frame,
|
|||||||
bool tiled = false;
|
bool tiled = false;
|
||||||
bool suspended = false;
|
bool suspended = false;
|
||||||
bool resizing = false;
|
bool resizing = false;
|
||||||
|
wind->toplevel_constraints = 0;
|
||||||
|
|
||||||
static const enum libdecor_window_state tiled_states = (LIBDECOR_WINDOW_STATE_TILED_LEFT | LIBDECOR_WINDOW_STATE_TILED_RIGHT |
|
static const enum libdecor_window_state tiled_states = (LIBDECOR_WINDOW_STATE_TILED_LEFT | LIBDECOR_WINDOW_STATE_TILED_RIGHT |
|
||||||
LIBDECOR_WINDOW_STATE_TILED_TOP | LIBDECOR_WINDOW_STATE_TILED_BOTTOM);
|
LIBDECOR_WINDOW_STATE_TILED_TOP | LIBDECOR_WINDOW_STATE_TILED_BOTTOM);
|
||||||
@@ -1213,8 +1214,20 @@ static void decoration_frame_configure(struct libdecor_frame *frame,
|
|||||||
#endif
|
#endif
|
||||||
#if SDL_LIBDECOR_CHECK_VERSION(0, 3, 0)
|
#if SDL_LIBDECOR_CHECK_VERSION(0, 3, 0)
|
||||||
resizing = (window_state & LIBDECOR_WINDOW_STATE_RESIZING) != 0;
|
resizing = (window_state & LIBDECOR_WINDOW_STATE_RESIZING) != 0;
|
||||||
|
|
||||||
|
if (window_state & LIBDECOR_WINDOW_STATE_CONSTRAINED_LEFT) {
|
||||||
|
wind->toplevel_constraints |= WAYLAND_TOPLEVEL_CONSTRAINED_LEFT;
|
||||||
|
}
|
||||||
|
if (window_state & LIBDECOR_WINDOW_STATE_CONSTRAINED_RIGHT) {
|
||||||
|
wind->toplevel_constraints |= WAYLAND_TOPLEVEL_CONSTRAINED_RIGHT;
|
||||||
|
}
|
||||||
|
if (window_state & LIBDECOR_WINDOW_STATE_CONSTRAINED_TOP) {
|
||||||
|
wind->toplevel_constraints |= WAYLAND_TOPLEVEL_CONSTRAINED_TOP;
|
||||||
|
}
|
||||||
|
if (window_state & LIBDECOR_WINDOW_STATE_CONSTRAINED_BOTTOM) {
|
||||||
|
wind->toplevel_constraints |= WAYLAND_TOPLEVEL_CONSTRAINED_BOTTOM;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
// TODO: Toplevel constraint passthrough is waiting on upstream libdecor changes.
|
|
||||||
}
|
}
|
||||||
const bool floating = !(fullscreen || maximized || tiled);
|
const bool floating = !(fullscreen || maximized || tiled);
|
||||||
|
|
||||||
@@ -1289,6 +1302,13 @@ static void decoration_frame_configure(struct libdecor_frame *frame,
|
|||||||
if (floating) {
|
if (floating) {
|
||||||
width = window->floating.w;
|
width = window->floating.w;
|
||||||
height = window->floating.h;
|
height = window->floating.h;
|
||||||
|
|
||||||
|
// Clamp the window to the toplevel bounds, if any are set.
|
||||||
|
if (wind->shell_surface_status == WAYLAND_SHELL_SURFACE_STATUS_WAITING_FOR_CONFIGURE &&
|
||||||
|
wind->toplevel_bounds.width && wind->toplevel_bounds.height) {
|
||||||
|
width = SDL_min(wind->toplevel_bounds.width, width);
|
||||||
|
height = SDL_min(wind->toplevel_bounds.height, height);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
width = window->windowed.w;
|
width = window->windowed.w;
|
||||||
height = window->windowed.h;
|
height = window->windowed.h;
|
||||||
@@ -1451,11 +1471,25 @@ static void decoration_dismiss_popup(struct libdecor_frame *frame, const char *s
|
|||||||
// NOP
|
// NOP
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void decoration_frame_bounds(struct libdecor_frame *frame, int width, int height, void *user_data)
|
||||||
|
{
|
||||||
|
SDL_WindowData *window = (SDL_WindowData *)user_data;
|
||||||
|
window->toplevel_bounds.width = width;
|
||||||
|
window->toplevel_bounds.height = height;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if SDL_LIBDECOR_CHECK_VERSION(0, 3, 0)
|
||||||
|
#define FRAME_BOUNDS_FUNC_CAST(func) func
|
||||||
|
#else
|
||||||
|
#define FRAME_BOUNDS_FUNC_CAST(func) (void(*)(void))func
|
||||||
|
#endif
|
||||||
|
|
||||||
static struct libdecor_frame_interface libdecor_frame_interface = {
|
static struct libdecor_frame_interface libdecor_frame_interface = {
|
||||||
decoration_frame_configure,
|
decoration_frame_configure,
|
||||||
decoration_frame_close,
|
decoration_frame_close,
|
||||||
decoration_frame_commit,
|
decoration_frame_commit,
|
||||||
decoration_dismiss_popup
|
decoration_dismiss_popup,
|
||||||
|
FRAME_BOUNDS_FUNC_CAST(decoration_frame_bounds)
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user