From a1324c8cdc23cf182121ce5359c05251b5d467e6 Mon Sep 17 00:00:00 2001 From: John Lindgren Date: Tue, 17 Oct 2023 23:06:12 -0400 Subject: [PATCH] xwayland: center stored natural geometry for initially maximized views 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 | 2 ++ src/view.c | 2 +- src/xwayland.c | 31 ++++++++++++++++++++++++------- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/include/view.h b/include/view.h index b3cc0368..028b665f 100644 --- a/include/view.h +++ b/include/view.h @@ -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); /** diff --git a/src/view.c b/src/view.c index 813566bd..f38ab369 100644 --- a/src/view.c +++ b/src/view.c @@ -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) { diff --git a/src/xwayland.c b/src/xwayland.c index 88ebcf61..74f466c0 100644 --- a/src/xwayland.c +++ b/src/xwayland.c @@ -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