From b8c6f9c216ef095535b6e7d2cb6c9cb128f8a04f Mon Sep 17 00:00:00 2001 From: Johan Malm Date: Fri, 12 Mar 2021 21:23:46 +0000 Subject: [PATCH] xdg: update padding on commit Maximize/unmaximize changes padding on XDG-shell views with CSD, so we need to update padding to render cycle-view decoration correctly. --- src/output.c | 4 ++-- src/xdg.c | 42 +++++++++++++++++++----------------------- 2 files changed, 21 insertions(+), 25 deletions(-) diff --git a/src/output.c b/src/output.c index 0ea204ea..6c8f153d 100644 --- a/src/output.c +++ b/src/output.c @@ -385,8 +385,8 @@ render_cycle_box(struct output *output, pixman_region32_t *output_damage, box.width += view->margin.left + view->margin.right; box.height += view->margin.top + view->margin.bottom; } else if (!view->maximized) { - box.x -= view->padding.left; - box.y -= view->padding.top; + box.x += view->padding.left; + box.y += view->padding.top; } float white[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; diff --git a/src/xdg.c b/src/xdg.c index 3c85fa38..e35d5f21 100644 --- a/src/xdg.c +++ b/src/xdg.c @@ -50,6 +50,10 @@ handle_commit(struct wl_listener *listener, void *data) view->w = size.width; view->h = size.height; + /* padding changes with maximize/unmaximize */ + view->padding.top = view->padding.bottom = size.y; + view->padding.left = view->padding.right = size.x; + uint32_t serial = view->pending_move_resize.configure_serial; if (serial > 0 && serial >= view->xdg_surface->configure_serial) { if (view->pending_move_resize.update_x) { @@ -178,27 +182,21 @@ xdg_toplevel_view_for_each_surface(struct view *view, wlr_xdg_surface_for_each_surface(view->xdg_surface, iterator, data); } +static void +update_padding(struct view *view) +{ + struct wlr_box padding; + wlr_xdg_surface_get_geometry(view->xdg_surface, &padding); + view->padding.top = view->padding.bottom = padding.y; + view->padding.left = view->padding.right = padding.x; +} + static void xdg_toplevel_view_maximize(struct view *view, bool maximized) { wlr_xdg_toplevel_set_maximized(view->xdg_surface, maximized); } -/* Return area between surface extremities and window */ -static struct border -xdg_shell_padding(struct view *view) -{ - struct wlr_box box; - wlr_xdg_surface_get_geometry(view->xdg_surface, &box); - struct border border = { - .top = -box.y, - .bottom = -box.y, - .left = -box.x, - .right = -box.x, - }; - return border; -} - static bool istopmost(struct view *view) { @@ -212,17 +210,15 @@ xdg_toplevel_view_map(struct view *view) view->surface = view->xdg_surface->surface; if (!view->been_mapped) { view->server_side_deco = has_ssd(view); + /* align to edge of screen */ if (view->server_side_deco) { view->margin = deco_thickness(view); - } else { - view->padding = xdg_shell_padding(view); - } - if (istopmost(view)) { - /* align to edge of screen */ view->x += view->margin.left; view->y += view->margin.top; - view->x += view->padding.left; - view->y += view->padding.top; + } else { + update_padding(view); + view->x -= view->padding.left; + view->y -= view->padding.top; } } view->been_mapped = true; @@ -256,7 +252,7 @@ static const struct view_impl xdg_toplevel_view_impl = { .map = xdg_toplevel_view_map, .move = xdg_toplevel_view_move, .unmap = xdg_toplevel_view_unmap, - .maximize = xdg_toplevel_view_maximize + .maximize = xdg_toplevel_view_maximize, }; void