From b46fa5e00657c9750bce5edbba272b1d611cf4a1 Mon Sep 17 00:00:00 2001 From: Johan Malm Date: Thu, 17 Sep 2020 21:11:54 +0100 Subject: [PATCH] xwayland: constrain view to top/left edge --- include/labwc.h | 3 ++- src/deco.c | 18 +++++++++++++----- src/xdg.c | 2 +- src/xwayland.c | 23 +++++++++++++++-------- 4 files changed, 31 insertions(+), 15 deletions(-) diff --git a/include/labwc.h b/include/labwc.h index c76a6684..c210ae7f 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -234,7 +234,8 @@ void keyboard_new(struct server *server, struct wlr_input_device *device); void output_frame(struct wl_listener *listener, void *data); void output_new(struct wl_listener *listener, void *data); -struct border deco_max_extents(struct view *view); +struct border deco_thickness(struct view *view); +struct wlr_box deco_max_extents(struct view *view); struct wlr_box deco_box(struct view *view, enum deco_part deco_part); enum deco_part deco_at(struct view *view, double lx, double ly); diff --git a/src/deco.c b/src/deco.c index 4b365c16..6974003b 100644 --- a/src/deco.c +++ b/src/deco.c @@ -12,7 +12,7 @@ #define BORDER_WIDTH (2) -struct border deco_max_extents(struct view *view) +struct border deco_thickness(struct view *view) { struct border border = { .top = rc.title_height + BORDER_WIDTH, @@ -23,16 +23,24 @@ struct border deco_max_extents(struct view *view) return border; } +struct wlr_box deco_max_extents(struct view *view) +{ + struct border border = deco_thickness(view); + struct wlr_box box = { + .x = view->x - border.left, + .y = view->y - border.top, + .width = view->w + border.left + border.right, + .height = view->h + border.top + border.bottom, + }; + return box; +} + struct wlr_box deco_box(struct view *view, enum deco_part deco_part) { int margin; struct wlr_box box = { .x = 0, .y = 0, .width = 0, .height = 0 }; BUG_ON(!view); - if ((view->w < 1) || (view->h < 1)) { - warn("view (%p) has no width/height", view); - return box; - } switch (deco_part) { case LAB_DECO_BUTTON_CLOSE: wlr_texture_get_size(theme.xbm_close_active_unpressed, diff --git a/src/xdg.c b/src/xdg.c index 48117dfb..c5c761b2 100644 --- a/src/xdg.c +++ b/src/xdg.c @@ -149,7 +149,7 @@ static void xdg_toplevel_view_map(struct view *view) if (!view->been_mapped) { view->server_side_deco = has_ssd(view); if (view->server_side_deco) { - view->margin = deco_max_extents(view); + view->margin = deco_thickness(view); } else { view->margin = xdg_shell_border(view); view->xdg_grab_offset = -view->margin.left; diff --git a/src/xwayland.c b/src/xwayland.c index cdb842e4..006d1375 100644 --- a/src/xwayland.c +++ b/src/xwayland.c @@ -61,6 +61,19 @@ static bool want_deco(struct view *view) WLR_XWAYLAND_SURFACE_DECORATIONS_ALL; } +static void top_left_edge_boundary_check(struct view *view) +{ + struct wlr_box deco = deco_max_extents(view); + if (deco.x < 0) + view->x -= deco.x; + if (deco.y < 0) + view->y -= deco.y; + struct wlr_box box = { + .x = view->x, .y = view->y, .width = view->w, .height = view->h + }; + view->impl->configure(view, box); +} + static void map(struct view *view) { view->mapped = true; @@ -71,15 +84,9 @@ static void map(struct view *view) view->surface = view->xwayland_surface->surface; view->server_side_deco = want_deco(view); - view->margin = deco_max_extents(view); + view->margin = deco_thickness(view); - /* ensure we're inside screen */ - view->x += view->margin.left; - view->y += view->margin.top; - struct wlr_box box = { - .x = view->x, .y = view->y, .width = view->w, .height = view->h - }; - view->impl->configure(view, box); + top_left_edge_boundary_check(view); /* Add commit here, as xwayland map/unmap can change the wlr_surface */ wl_signal_add(&view->xwayland_surface->surface->events.commit,