From 60d41fb93c2fad58bc30ebd511390d81e7579789 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Sun, 1 Jun 2025 15:05:37 +0200 Subject: [PATCH 1/2] xdg_shell: handle xdg_popup reposition signal We are advertising xdg-shell v4, but forgot to handle this signal. --- xdg_shell.c | 12 ++++++++++++ xdg_shell.h | 1 + 2 files changed, 13 insertions(+) diff --git a/xdg_shell.c b/xdg_shell.c index cc86bf6..117a344 100644 --- a/xdg_shell.c +++ b/xdg_shell.c @@ -293,6 +293,7 @@ popup_handle_destroy(struct wl_listener *listener, void *data) struct cg_xdg_popup *popup = wl_container_of(listener, popup, destroy); wl_list_remove(&popup->destroy.link); wl_list_remove(&popup->commit.link); + wl_list_remove(&popup->reposition.link); free(popup); } @@ -306,6 +307,14 @@ popup_handle_commit(struct wl_listener *listener, void *data) } } +static void +popup_handle_reposition(struct wl_listener *listener, void *data) +{ + struct cg_xdg_popup *popup = wl_container_of(listener, popup, reposition); + + popup_unconstrain(popup->xdg_popup); +} + void handle_new_xdg_popup(struct wl_listener *listener, void *data) { @@ -350,6 +359,9 @@ handle_new_xdg_popup(struct wl_listener *listener, void *data) popup->commit.notify = popup_handle_commit; wl_signal_add(&wlr_popup->base->surface->events.commit, &popup->commit); + popup->reposition.notify = popup_handle_reposition; + wl_signal_add(&wlr_popup->events.reposition, &popup->reposition); + struct wlr_scene_tree *popup_scene_tree = wlr_scene_xdg_surface_create(parent_scene_tree, wlr_popup->base); if (popup_scene_tree == NULL) { wlr_log(WLR_ERROR, "Failed to allocate scene-graph node for XDG popup"); diff --git a/xdg_shell.h b/xdg_shell.h index 1fc000a..f819549 100644 --- a/xdg_shell.h +++ b/xdg_shell.h @@ -31,6 +31,7 @@ struct cg_xdg_popup { struct wl_listener destroy; struct wl_listener commit; + struct wl_listener reposition; }; void handle_new_xdg_toplevel(struct wl_listener *listener, void *data); From 63f186632ef721589a68ca47d3ee3949f789337a Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Sun, 1 Jun 2025 15:13:55 +0200 Subject: [PATCH 2/2] xdg_shell: bump to v5 v5 adds the wm_capabilities event. cage only supports fullscreen. --- cage.c | 2 +- xdg_shell.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/cage.c b/cage.c index 77ebc88..3452239 100644 --- a/cage.c +++ b/cage.c @@ -416,7 +416,7 @@ main(int argc, char *argv[]) wl_signal_add(&server.idle_inhibit_v1->events.new_inhibitor, &server.new_idle_inhibitor_v1); wl_list_init(&server.inhibitors); - struct wlr_xdg_shell *xdg_shell = wlr_xdg_shell_create(server.wl_display, 4); + struct wlr_xdg_shell *xdg_shell = wlr_xdg_shell_create(server.wl_display, 5); if (!xdg_shell) { wlr_log(WLR_ERROR, "Unable to create the XDG shell interface"); ret = 1; diff --git a/xdg_shell.c b/xdg_shell.c index 117a344..5493918 100644 --- a/xdg_shell.c +++ b/xdg_shell.c @@ -227,6 +227,8 @@ handle_xdg_toplevel_commit(struct wl_listener *listener, void *data) return; } + wlr_xdg_toplevel_set_wm_capabilities(xdg_shell_view->xdg_toplevel, XDG_TOPLEVEL_WM_CAPABILITIES_FULLSCREEN); + /* When an xdg_surface performs an initial commit, the compositor must * reply with a configure so the client can map the surface. */ view_position(&xdg_shell_view->view);