From 7144e44e93242badf2c30a61c79df6f21da288f4 Mon Sep 17 00:00:00 2001 From: Peter Kaplan Date: Mon, 14 Jul 2025 12:25:58 +0200 Subject: [PATCH] river: toplevel capture for XdgPopups --- river/LayerSurface.zig | 1 + river/XdgPopup.zig | 10 ++++++++++ river/XdgToplevel.zig | 7 ++++++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/river/LayerSurface.zig b/river/LayerSurface.zig index 92b62cc..01654ac 100644 --- a/river/LayerSurface.zig +++ b/river/LayerSurface.zig @@ -230,6 +230,7 @@ fn handleNewPopup(listener: *wl.Listener(*wlr.XdgPopup), wlr_xdg_popup: *wlr.Xdg wlr_xdg_popup, layer_surface.popup_tree, layer_surface.popup_tree, + null, ) catch { wlr_xdg_popup.resource.postNoMemory(); return; diff --git a/river/XdgPopup.zig b/river/XdgPopup.zig index 3467210..44982e6 100644 --- a/river/XdgPopup.zig +++ b/river/XdgPopup.zig @@ -34,6 +34,8 @@ root: *wlr.SceneTree, tree: *wlr.SceneTree, +image_capture_tree: ?*wlr.SceneTree, + destroy: wl.Listener(void) = wl.Listener(void).init(handleDestroy), commit: wl.Listener(*wlr.Surface) = wl.Listener(*wlr.Surface).init(handleCommit), new_popup: wl.Listener(*wlr.XdgPopup) = wl.Listener(*wlr.XdgPopup).init(handleNewPopup), @@ -44,14 +46,21 @@ pub fn create( wlr_xdg_popup: *wlr.XdgPopup, root: *wlr.SceneTree, parent: *wlr.SceneTree, + image_capture_parent: ?*wlr.SceneTree, ) error{OutOfMemory}!void { const xdg_popup = try util.gpa.create(XdgPopup); errdefer util.gpa.destroy(xdg_popup); + const image_capture_tree = if (image_capture_parent) |p| + try p.createSceneXdgSurface(wlr_xdg_popup.base) + else + null; + xdg_popup.* = .{ .wlr_xdg_popup = wlr_xdg_popup, .root = root, .tree = try parent.createSceneXdgSurface(wlr_xdg_popup.base), + .image_capture_tree = image_capture_tree, }; wlr_xdg_popup.events.destroy.add(&xdg_popup.destroy); @@ -86,6 +95,7 @@ fn handleNewPopup(listener: *wl.Listener(*wlr.XdgPopup), wlr_xdg_popup: *wlr.Xdg wlr_xdg_popup, xdg_popup.root, xdg_popup.tree, + xdg_popup.image_capture_tree, ) catch { wlr_xdg_popup.resource.postNoMemory(); return; diff --git a/river/XdgToplevel.zig b/river/XdgToplevel.zig index 02c0537..340671a 100644 --- a/river/XdgToplevel.zig +++ b/river/XdgToplevel.zig @@ -283,7 +283,12 @@ fn handleUnmap(listener: *wl.Listener(void)) void { fn handleNewPopup(listener: *wl.Listener(*wlr.XdgPopup), wlr_xdg_popup: *wlr.XdgPopup) void { const toplevel: *XdgToplevel = @fieldParentPtr("new_popup", listener); - XdgPopup.create(wlr_xdg_popup, toplevel.view.popup_tree, toplevel.view.popup_tree) catch { + XdgPopup.create( + wlr_xdg_popup, + toplevel.view.popup_tree, + toplevel.view.popup_tree, + &toplevel.view.image_capture_scene.tree, + ) catch { wlr_xdg_popup.resource.postNoMemory(); return; };