]> git.mdlowis.com Git - proto/labwc.git/commitdiff
xdg: update padding on commit
authorJohan Malm <jgm323@gmail.com>
Fri, 12 Mar 2021 21:23:46 +0000 (21:23 +0000)
committerJohan Malm <jgm323@gmail.com>
Fri, 12 Mar 2021 21:23:46 +0000 (21:23 +0000)
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
src/xdg.c

index 0ea204ea7ce7fb000f0da54d5eebfa96a0b01bb6..6c8f153d2a8289d3557924923497769353aed729 100644 (file)
@@ -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 };
index 3c85fa38902077db6e577eca612cdda3ba0fec41..e35d5f21a7de95f672aff90f6ced0c4373cfeffe 100644 (file)
--- 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) {
@@ -179,24 +183,18 @@ xdg_toplevel_view_for_each_surface(struct view *view,
 }
 
 static void
-xdg_toplevel_view_maximize(struct view *view, bool maximized)
+update_padding(struct view *view)
 {
-       wlr_xdg_toplevel_set_maximized(view->xdg_surface, maximized);
+       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;
 }
 
-/* Return area between surface extremities and window */
-static struct border
-xdg_shell_padding(struct view *view)
+static void
+xdg_toplevel_view_maximize(struct view *view, bool maximized)
 {
-       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;
+       wlr_xdg_toplevel_set_maximized(view->xdg_surface, maximized);
 }
 
 static bool
@@ -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