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