diff options
| author | Isaac Freund <mail@isaacfreund.com> | 2023-03-01 23:04:42 +0100 |
|---|---|---|
| committer | Isaac Freund <mail@isaacfreund.com> | 2023-03-01 23:04:42 +0100 |
| commit | ecb959f06857197f2b0cfd035189f37f88ae2c24 (patch) | |
| tree | 7a44c2a4ee967c2c43451b5958c006db9a8915e2 | |
| parent | 83fe764fcd68eccaa0ed73269ea98334d5055c51 (diff) | |
| download | river-ecb959f06857197f2b0cfd035189f37f88ae2c24.tar.gz river-ecb959f06857197f2b0cfd035189f37f88ae2c24.tar.xz | |
View: fix frame perfection on unmap
| -rw-r--r-- | river/XdgToplevel.zig | 10 | ||||
| -rw-r--r-- | river/XwaylandView.zig | 8 |
2 files changed, 15 insertions, 3 deletions
diff --git a/river/XdgToplevel.zig b/river/XdgToplevel.zig index cb5a20c..cade2eb 100644 --- a/river/XdgToplevel.zig +++ b/river/XdgToplevel.zig @@ -220,7 +220,17 @@ fn handleUnmap(listener: *wl.Listener(void)) void { self.set_title.link.remove(); self.set_app_id.link.remove(); + // TODO(wlroots): This enable/disable dance is a workaround for an signal + // ordering issue with the scene xdg surface helper's unmap handler that + // disables the node. We however need the node enabled for View.unmap() + // so that we can save buffers for frame perfection. + var it = self.view.surface_tree.children.iterator(.forward); + const xdg_surface_tree_node = it.next().?; + xdg_surface_tree_node.setEnabled(true); + self.view.unmap(); + + xdg_surface_tree_node.setEnabled(false); } fn handleNewPopup(listener: *wl.Listener(*wlr.XdgPopup), wlr_xdg_popup: *wlr.XdgPopup) void { diff --git a/river/XwaylandView.zig b/river/XwaylandView.zig index 10373d5..d94393b 100644 --- a/river/XwaylandView.zig +++ b/river/XwaylandView.zig @@ -222,9 +222,6 @@ pub fn handleMap(listener: *wl.Listener(*wlr.XwaylandSurface), xwayland_surface: fn handleUnmap(listener: *wl.Listener(*wlr.XwaylandSurface), _: *wlr.XwaylandSurface) void { const self = @fieldParentPtr(Self, "unmap", listener); - self.surface_tree.?.node.destroy(); - self.surface_tree = null; - // Remove listeners that are only active while mapped self.set_title.link.remove(); self.set_class.link.remove(); @@ -232,6 +229,11 @@ fn handleUnmap(listener: *wl.Listener(*wlr.XwaylandSurface), _: *wlr.XwaylandSur self.request_minimize.link.remove(); self.view.unmap(); + + // Don't destroy the surface tree until after View.unmap() has a chance + // to save buffers for frame perfection. + self.surface_tree.?.node.destroy(); + self.surface_tree = null; } fn handleRequestConfigure( |
