commit 7144e44e93242badf2c30a61c79df6f21da288f4 from: Peter Kaplan date: Mon Mar 30 08:02:35 2026 UTC river: toplevel capture for XdgPopups commit - 0d2b1235479134adf59940ca6d8dd58de7ccfbd1 commit + 7144e44e93242badf2c30a61c79df6f21da288f4 blob - 92b62cc4386dc959713fd0ad0c418d2559a798e7 blob + 01654ac78cf8e589bbdc1b912be3fed650952b4b --- river/LayerSurface.zig +++ river/LayerSurface.zig @@ -230,6 +230,7 @@ fn handleNewPopup(listener: *wl.Listener(*wlr.XdgPopup wlr_xdg_popup, layer_surface.popup_tree, layer_surface.popup_tree, + null, ) catch { wlr_xdg_popup.resource.postNoMemory(); return; blob - 3467210cb2acb56c94accfba034e043d232dc623 blob + 44982e6b538a6e2d9965316c79bdfee1079f15e5 --- river/XdgPopup.zig +++ 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, xdg_popup.root, xdg_popup.tree, + xdg_popup.image_capture_tree, ) catch { wlr_xdg_popup.resource.postNoMemory(); return; blob - 02c0537e15b1c24b9cf313a3919061945d9fffcf blob + 340671a53456e064a3433b1551dd77144f7eafdb --- river/XdgToplevel.zig +++ 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; };