]> git.mdlowis.com Git - proto/labwc.git/commitdiff
xdg: improve positioning of new xdg-toplevel views
authorJohan Malm <jgm323@gmail.com>
Sat, 20 Mar 2021 14:30:45 +0000 (14:30 +0000)
committerJohan Malm <jgm323@gmail.com>
Sat, 20 Mar 2021 14:30:45 +0000 (14:30 +0000)
Top/left align topmost parent.
Center-align children relative to parent.

src/xdg.c

index 0de246b29a375e323c53c794b46a7983c5e6499f..377b926fcc80d4ce91db13cf3664c752fe46716d 100644 (file)
--- a/src/xdg.c
+++ b/src/xdg.c
@@ -203,6 +203,43 @@ istopmost(struct view *view)
        return view->xdg_surface->toplevel->parent == NULL;
 }
 
+static struct view *
+parent_of(struct view *view)
+{
+       struct view *p;
+       wl_list_for_each (p, &view->server->views, link) {
+               if (p->xdg_surface == view->xdg_surface->toplevel->parent) {
+                       return p;
+               }
+       }
+       return NULL;
+}
+
+static void
+position_xdg_toplevel_view(struct view *view)
+{
+       if (istopmost(view)) {
+               /*
+                * For topmost xdg-toplevel, we just top/left align for the
+                * time being
+                */
+               view->x = view->y = 0;
+       } else {
+               /*
+                * If child-toplevel-views, we center-align relative to their
+                * parents
+                */
+               struct view *parent = parent_of(view);
+               assert(parent);
+               int center_x = parent->x + parent->w / 2;
+               int center_y = parent->y + parent->h / 2;
+               view->x = center_x - view->xdg_surface->geometry.width / 2;
+               view->y = center_y - view->xdg_surface->geometry.height / 2;
+       }
+       view->x += view->margin.left - view->padding.left;
+       view->y += view->margin.top - view->padding.top;
+}
+
 static void
 xdg_toplevel_view_map(struct view *view)
 {
@@ -214,17 +251,13 @@ xdg_toplevel_view_map(struct view *view)
                 * and keep code simple
                 */
                view_maximize(view, false);
+
                view->server_side_deco = has_ssd(view);
-               /* align to edge of screen */
                if (view->server_side_deco) {
                        view->margin = deco_thickness(view);
-                       view->x += view->margin.left;
-                       view->y += view->margin.top;
-               } else {
-                       update_padding(view);
-                       view->x -= view->padding.left;
-                       view->y -= view->padding.top;
                }
+               update_padding(view);
+               position_xdg_toplevel_view(view);
        }
        view->been_mapped = true;