diff --git a/include/sway/tree/view.h b/include/sway/tree/view.h index e071e6c9..18dc2019 100644 --- a/include/sway/tree/view.h +++ b/include/sway/tree/view.h @@ -317,6 +317,7 @@ void view_map(struct sway_view *view, struct wlr_surface *wlr_surface, void view_unmap(struct sway_view *view); void view_update_size(struct sway_view *view, int width, int height); +void view_center_surface(struct sway_view *view); void view_child_init(struct sway_view_child *child, const struct sway_view_child_impl *impl, struct sway_view *view, diff --git a/sway/desktop/transaction.c b/sway/desktop/transaction.c index 2d71ad2b..ead662f9 100644 --- a/sway/desktop/transaction.c +++ b/sway/desktop/transaction.c @@ -255,18 +255,7 @@ static void apply_container_state(struct sway_container *container, // the container. This is important for fullscreen views which // refuse to resize to the size of the output. if (view && view->surface) { - if (view->geometry.width < container->current.content_width) { - container->surface_x = container->current.content_x + - (container->current.content_width - view->geometry.width) / 2; - } else { - container->surface_x = container->current.content_x; - } - if (view->geometry.height < container->current.content_height) { - container->surface_y = container->current.content_y + - (container->current.content_height - view->geometry.height) / 2; - } else { - container->surface_y = container->current.content_y; - } + view_center_surface(view); } if (!container->node.destroying) { diff --git a/sway/tree/view.c b/sway/tree/view.c index 3b1e67ea..f4ae8171 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -887,6 +887,16 @@ void view_update_size(struct sway_view *view, int width, int height) { } } +void view_center_surface(struct sway_view *view) { + struct sway_container *con = view->container; + // We always center the current coordinates rather than the next, as the + // geometry immediately affects the currently active rendering. + con->surface_x = fmax(con->current.content_x, con->current.content_x + + (con->current.content_width - view->geometry.width) / 2); + con->surface_y = fmax(con->current.content_y, con->current.content_y + + (con->current.content_height - view->geometry.height) / 2); +} + static const struct sway_view_child_impl subsurface_impl; static void subsurface_get_root_coords(struct sway_view_child *child,