river: toplevel capture for XdgPopups

This commit is contained in:
Peter Kaplan
2025-07-14 12:25:58 +02:00
parent 0d2b123547
commit 7144e44e93
3 changed files with 17 additions and 1 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;
};