diff --git a/view.c b/view.c index a8548df7..f325b2ae 100644 --- a/view.c +++ b/view.c @@ -65,11 +65,15 @@ view_position(struct cg_view *view) struct wlr_box layout_box; wlr_output_layout_get_box(view->server->output_layout, NULL, &layout_box); - view->impl->get_geometry(view, &view->width, &view->height); + struct wlr_box view_box; + view->impl->get_geometry(view, &view_box); // If view dimensions are not the same as output layout ones, it will be centered first - view->lx = layout_box.x + (layout_box.width - view->width) / 2; - view->ly = layout_box.y + (layout_box.height - view->height) / 2; + // Do not forget to adjust position according to top left corner declared in view geometry + view->lx = layout_box.x + (layout_box.width - view_box.width) / 2 - view_box.x; + view->ly = layout_box.y + (layout_box.height - view_box.height) / 2 - view_box.y; + view->width = view_box.width; + view->height = view_box.height; wlr_scene_node_set_position(&view->scene_tree->node, view->lx, view->ly); diff --git a/view.h b/view.h index 2fc8d08d..bffde48e 100644 --- a/view.h +++ b/view.h @@ -37,7 +37,7 @@ struct cg_view { struct cg_view_impl { char *(*get_title)(struct cg_view *view); - void (*get_geometry)(struct cg_view *view, int *width_out, int *height_out); + void (*get_geometry)(struct cg_view *view, struct wlr_box *view_box); bool (*is_primary)(struct cg_view *view); bool (*is_transient_for)(struct cg_view *child, struct cg_view *parent); void (*activate)(struct cg_view *view, bool activate); diff --git a/xdg_shell.c b/xdg_shell.c index 41179dd6..ef549092 100644 --- a/xdg_shell.c +++ b/xdg_shell.c @@ -101,14 +101,10 @@ get_title(struct cg_view *view) } static void -get_geometry(struct cg_view *view, int *width_out, int *height_out) +get_geometry(struct cg_view *view, struct wlr_box *view_box) { struct cg_xdg_shell_view *xdg_shell_view = xdg_shell_view_from_view(view); - struct wlr_box geom; - - wlr_xdg_surface_get_geometry(xdg_shell_view->xdg_toplevel->base, &geom); - *width_out = geom.width; - *height_out = geom.height; + wlr_xdg_surface_get_geometry(xdg_shell_view->xdg_toplevel->base, view_box); } static bool @@ -195,9 +191,9 @@ handle_xdg_shell_surface_commit(struct wl_listener *listener, void *data) struct cg_view *view = &xdg_shell_view->view; // Check if view dimensions have changed - int width, height; - get_geometry(view, &width, &height); - if (width != view->width || height != view->height) { + struct wlr_box view_box; + get_geometry(view, &view_box); + if (view_box.width != view->width || view_box.height != view->height) { view_position(view); } } diff --git a/xwayland.c b/xwayland.c index de814080..f3ea6c5b 100644 --- a/xwayland.c +++ b/xwayland.c @@ -38,18 +38,22 @@ get_title(struct cg_view *view) } static void -get_geometry(struct cg_view *view, int *width_out, int *height_out) +get_geometry(struct cg_view *view, struct wlr_box *view_box) { struct cg_xwayland_view *xwayland_view = xwayland_view_from_view(view); struct wlr_xwayland_surface *xsurface = xwayland_view->xwayland_surface; + + view_box->x = 0; + view_box->y = 0; + if (xsurface->surface == NULL) { - *width_out = 0; - *height_out = 0; + view_box->width = 0; + view_box->height = 0; return; } - *width_out = xsurface->surface->current.width; - *height_out = xsurface->surface->current.height; + view_box->width = xwayland_view->xwayland_surface->surface->current.width; + view_box->height = xwayland_view->xwayland_surface->surface->current.height; } static bool