From 6f20285555da30e7b6df5d686a5061c2397a092d Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Thu, 10 Apr 2025 17:50:15 +0200 Subject: [PATCH 1/2] Upgrade wlroots to v0.19 --- .github/workflows/main.yml | 9 ++++++--- cage.c | 2 +- meson.build | 2 +- seat.c | 2 +- xdg_shell.c | 7 +++---- xwayland.c | 2 +- 6 files changed, 13 insertions(+), 11 deletions(-) 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/xdg_shell.c b/xdg_shell.c index cae6c90..10224ae 100644 --- a/xdg_shell.c +++ b/xdg_shell.c @@ -128,11 +128,10 @@ static void get_geometry(struct cg_view *view, int *width_out, int *height_out) { 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; + *width_out = xdg_surface->geometry.width; + *height_out = xdg_surface->geometry.height; } static bool diff --git a/xwayland.c b/xwayland.c index de81408..3df7a08 100644 --- a/xwayland.c +++ b/xwayland.c @@ -92,7 +92,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 From e8c038cc8a757775fbd51cad6bf5f12a97a7726a Mon Sep 17 00:00:00 2001 From: Jonathan GUILLOT Date: Mon, 15 Jan 2024 15:50:46 +0100 Subject: [PATCH 2/2] view: adjust position according to declared top left corner The XDG surface geometry includes an (x,y) coordinate indicating the top left corner of the window. Use this information to correctly set the view position. --- view.c | 23 ++++++++++++++--------- view.h | 2 +- xdg_shell.c | 5 ++--- xwayland.c | 14 +++++++++----- 4 files changed, 26 insertions(+), 18 deletions(-) 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 10224ae..73cddf4 100644 --- a/xdg_shell.c +++ b/xdg_shell.c @@ -125,13 +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_xdg_surface *xdg_surface = xdg_shell_view->xdg_toplevel->base; - *width_out = xdg_surface->geometry.width; - *height_out = xdg_surface->geometry.height; + memcpy(view_box, &xdg_surface->geometry, sizeof(*view_box)); } static bool diff --git a/xwayland.c b/xwayland.c index 3df7a08..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