]> git.mdlowis.com Git - proto/labwc.git/commitdiff
xwayland: center stored natural geometry for initially maximized views
authorJohn Lindgren <john@jlindgren.net>
Wed, 18 Oct 2023 03:06:12 +0000 (23:06 -0400)
committerJohan Malm <johanmalm@users.noreply.github.com>
Wed, 18 Oct 2023 18:49:53 +0000 (19:49 +0100)
For views that are initially maximized or fullscreen and have no
explicitly specified position, we need to center the stored natural
geometry, or the view may end up partially offscreen once unmaximized/
unfullscreened.

include/view.h
src/view.c
src/xwayland.c

index b3cc0368dce785b5eb4963545ef2c2eee28b0390..028b665f00c522497d853684b36b0d4007ded411 100644 (file)
@@ -337,6 +337,8 @@ void view_move(struct view *view, int x, int y);
 void view_move_to_cursor(struct view *view);
 void view_moved(struct view *view);
 void view_minimize(struct view *view, bool minimized);
+bool view_compute_centered_position(struct view *view,
+       const struct wlr_box *ref, int w, int h, int *x, int *y);
 void view_store_natural_geometry(struct view *view);
 
 /**
index 813566bdccfbd987d3eedb0761cfe5118cd75af2..f38ab369d22c61881097e42074d84be0398a4c39 100644 (file)
@@ -539,7 +539,7 @@ view_minimize(struct view *view, bool minimized)
        minimize_sub_views(root, minimized);
 }
 
-static bool
+bool
 view_compute_centered_position(struct view *view, const struct wlr_box *ref,
                int w, int h, int *x, int *y)
 {
index 88ebcf61e228f82750659bc994a372af46b25e3d..74f466c08d07287e0f1dd2035611375723589146 100644 (file)
@@ -452,10 +452,30 @@ set_initial_position(struct view *view,
                        XCB_ICCCM_SIZE_HINT_P_POSITION));
 
        if (has_position) {
-               /* Just make sure the view is on-screen */
-               view_adjust_for_layout_change(view);
+               /*
+                * Make sure a floating view is onscreen. For a
+                * maximized/fullscreen view, do nothing; if it is
+                * unmaximized/leaves fullscreen later, we will make
+                * sure it is on-screen at that point.
+                */
+               if (view_is_floating(view)) {
+                       view_adjust_for_layout_change(view);
+               }
        } else {
-               view_center(view, NULL);
+               if (view_is_floating(view)) {
+                       view_center(view, NULL);
+               } else {
+                       /*
+                        * View is maximized/fullscreen. Center the
+                        * stored natural geometry without actually
+                        * moving the view.
+                        */
+                       view_compute_centered_position(view, NULL,
+                               view->natural_geometry.width,
+                               view->natural_geometry.height,
+                               &view->natural_geometry.x,
+                               &view->natural_geometry.y);
+               }
        }
 }
 
@@ -554,10 +574,7 @@ xwayland_view_map(struct view *view)
        }
 
        if (!view->been_mapped) {
-               if (view_is_floating(view)) {
-                       set_initial_position(view, xwayland_surface);
-               }
-
+               set_initial_position(view, xwayland_surface);
                /*
                 * When mapping the view for the first time, visual
                 * artifacts are reduced if we display it immediately at