diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e82dbf1..e0f8093 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -5,6 +5,9 @@ on: pull_request: branches: [ master ] +env: + WLROOTS_VERSION: 0.19 + jobs: compile: runs-on: ubuntu-latest @@ -32,7 +35,7 @@ jobs: pacman -Syu --noconfirm xcb-util-wm seatd git clang meson libinput libdrm mesa libxkbcommon wayland wayland-protocols xorg-server-xwayland scdoc - name: Fetch wlroots as a subproject - run: git clone https://gitlab.freedesktop.org/wlroots/wlroots.git subprojects/wlroots -b 0.18 + run: git clone https://gitlab.freedesktop.org/wlroots/wlroots.git subprojects/wlroots -b $WLROOTS_VERSION - name: Compile Cage (XWayland=${{ matrix.xwayland }}) run: | @@ -52,7 +55,7 @@ jobs: pacman-key --init pacman -Syu --noconfirm xcb-util-wm seatd git clang meson libinput libdrm mesa libxkbcommon wayland wayland-protocols xorg-server-xwayland scdoc hwdata - name: Fetch wlroots as a subproject - run: git clone https://gitlab.freedesktop.org/wlroots/wlroots.git subprojects/wlroots -b 0.18 + run: git clone https://gitlab.freedesktop.org/wlroots/wlroots.git subprojects/wlroots -b $WLROOTS_VERSION - name: Check for formatting changes run: | meson build-clang-format -Dwlroots:xwayland=enabled @@ -71,7 +74,7 @@ jobs: pacman-key --init pacman -Syu --noconfirm xcb-util-wm seatd git clang meson libinput libdrm mesa libxkbcommon wayland wayland-protocols xorg-server-xwayland scdoc hwdata - name: Fetch wlroots as a subproject - run: git clone https://gitlab.freedesktop.org/wlroots/wlroots.git subprojects/wlroots -b 0.18 + run: git clone https://gitlab.freedesktop.org/wlroots/wlroots.git subprojects/wlroots -b $WLROOTS_VERSION - name: Run scan-build run: | meson build-scan-build -Dwlroots:xwayland=enabled diff --git a/cage.c b/cage.c index 40a675d..77ebc88 100644 --- a/cage.c +++ b/cage.c @@ -454,7 +454,7 @@ main(int argc, char *argv[]) goto end; } - struct wlr_presentation *presentation = wlr_presentation_create(server.wl_display, server.backend); + struct wlr_presentation *presentation = wlr_presentation_create(server.wl_display, server.backend, 2); if (!presentation) { wlr_log(WLR_ERROR, "Unable to create the presentation interface"); ret = 1; diff --git a/meson.build b/meson.build index 7b58cd8..07ca800 100644 --- a/meson.build +++ b/meson.build @@ -35,7 +35,7 @@ if is_freebsd ) endif -wlroots = dependency('wlroots-0.18', fallback: ['wlroots', 'wlroots']) +wlroots = dependency('wlroots-0.19', fallback: ['wlroots', 'wlroots']) wayland_protos = dependency('wayland-protocols', version: '>=1.14') wayland_server = dependency('wayland-server') xkbcommon = dependency('xkbcommon') diff --git a/seat.c b/seat.c index 9acbdd3..5f659a4 100644 --- a/seat.c +++ b/seat.c @@ -937,7 +937,7 @@ seat_set_focus(struct cg_seat *seat, struct cg_view *view) #if CAGE_HAS_XWAYLAND if (view->type == CAGE_XWAYLAND_VIEW) { struct cg_xwayland_view *xwayland_view = xwayland_view_from_view(view); - if (!wlr_xwayland_or_surface_wants_focus(xwayland_view->xwayland_surface)) { + if (!wlr_xwayland_surface_override_redirect_wants_focus(xwayland_view->xwayland_surface)) { return; } } diff --git a/view.c b/view.c index 8cbeb5e..d2cee1f 100644 --- a/view.c +++ b/view.c @@ -55,17 +55,21 @@ view_activate(struct cg_view *view, bool activate) static bool view_extends_output_layout(struct cg_view *view, struct wlr_box *layout_box) { - int width, height; - view->impl->get_geometry(view, &width, &height); + struct wlr_box view_box; + view->impl->get_geometry(view, &view_box); - return (layout_box->height < height || layout_box->width < width); + return (layout_box->height < view_box.height || layout_box->width < view_box.width); } static void view_maximize(struct cg_view *view, struct wlr_box *layout_box) { - view->lx = layout_box->x; - view->ly = layout_box->y; + struct wlr_box view_box; + view->impl->get_geometry(view, &view_box); + + // Do not forget to adjust position according to top left corner declared in view geometry + view->lx = layout_box->x - view_box.x; + view->ly = layout_box->y - view_box.y; if (view->scene_tree) { wlr_scene_node_set_position(&view->scene_tree->node, view->lx, view->ly); @@ -77,11 +81,12 @@ view_maximize(struct cg_view *view, struct wlr_box *layout_box) static void view_center(struct cg_view *view, struct wlr_box *layout_box) { - int width, height; - view->impl->get_geometry(view, &width, &height); + struct wlr_box view_box; + view->impl->get_geometry(view, &view_box); - view->lx = (layout_box->width - width) / 2; - view->ly = (layout_box->height - height) / 2; + // Do not forget to adjust position according to top left corner declared in view geometry + view->lx = (layout_box->width - view_box.width) / 2 - view_box.x; + view->ly = (layout_box->height - view_box.height) / 2 - view_box.y; if (view->scene_tree) { wlr_scene_node_set_position(&view->scene_tree->node, view->lx, view->ly); diff --git a/view.h b/view.h index 9b2ab75..5c8016b 100644 --- a/view.h +++ b/view.h @@ -36,7 +36,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 cae6c90..73cddf4 100644 --- a/xdg_shell.c +++ b/xdg_shell.c @@ -125,14 +125,12 @@ 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; + struct wlr_xdg_surface *xdg_surface = xdg_shell_view->xdg_toplevel->base; - wlr_xdg_surface_get_geometry(xdg_shell_view->xdg_toplevel->base, &geom); - *width_out = geom.width; - *height_out = geom.height; + memcpy(view_box, &xdg_surface->geometry, sizeof(*view_box)); } static bool diff --git a/xwayland.c b/xwayland.c index de81408..5188a5c 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 = xsurface->surface->current.width; + view_box->height = xsurface->surface->current.height; } static bool @@ -92,7 +96,7 @@ maximize(struct cg_view *view, int output_width, int output_height) struct cg_xwayland_view *xwayland_view = xwayland_view_from_view(view); wlr_xwayland_surface_configure(xwayland_view->xwayland_surface, view->lx, view->ly, output_width, output_height); - wlr_xwayland_surface_set_maximized(xwayland_view->xwayland_surface, true); + wlr_xwayland_surface_set_maximized(xwayland_view->xwayland_surface, true, true); } static void