aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIsaac Freund <ifreund@ifreund.xyz>2021-06-17 20:57:14 +0000
committerIsaac Freund <ifreund@ifreund.xyz>2021-06-17 20:57:14 +0000
commita2c81adba0235f48008b8aeaeecfbbe69bcde9a9 (patch)
treea21eec404ba17b7991a11a09845719f1d9784207
parent5daec347c03110c74cd2b7da670072baa84263ba (diff)
downloadriver-a2c81adba0235f48008b8aeaeecfbbe69bcde9a9.tar.gz
river-a2c81adba0235f48008b8aeaeecfbbe69bcde9a9.tar.xz
xdg-toplevel: remove listeners before view destroy
Currently in handleUnmap() we call View.unmap() before removing listeners. However View.unmap() may destroy the view before returning if the transaction started doesn't have to wait on any configures. To ensure that we don't try to remove listeners which have already been free'd, do this before calling View.unmap().
-rw-r--r--river/Root.zig3
-rw-r--r--river/View.zig3
-rw-r--r--river/XdgToplevel.zig4
3 files changed, 6 insertions, 4 deletions
diff --git a/river/Root.zig b/river/Root.zig
index a74d0ee..3ea79cf 100644
--- a/river/Root.zig
+++ b/river/Root.zig
@@ -384,13 +384,12 @@ fn commitTransaction(self: *Self) void {
var view_it = output.views.first;
while (view_it) |view_node| {
const view = &view_node.view;
+ view_it = view_node.next;
if (view.destroying) {
- view_it = view_node.next;
view.destroy();
continue;
}
- defer view_it = view_node.next;
if (view.pending_serial != null and !view.shouldTrackConfigure()) continue;
diff --git a/river/View.zig b/river/View.zig
index 816c72e..5b57774 100644
--- a/river/View.zig
+++ b/river/View.zig
@@ -19,6 +19,7 @@ const Self = @This();
const build_options = @import("build_options");
const std = @import("std");
+const assert = std.debug.assert;
const math = std.math;
const os = std.os;
const wlr = @import("wlroots");
@@ -486,7 +487,9 @@ pub fn map(self: *Self) void {
pub fn unmap(self: *Self) void {
log.debug("view '{s}' unmapped", .{self.getTitle()});
+ assert(!self.destroying);
self.destroying = true;
+
if (self.saved_buffers.items.len == 0) self.saveBuffers();
if (self.opacity_timer != null) {
diff --git a/river/XdgToplevel.zig b/river/XdgToplevel.zig
index 96b618b..ca360c3 100644
--- a/river/XdgToplevel.zig
+++ b/river/XdgToplevel.zig
@@ -248,8 +248,6 @@ fn handleMap(listener: *wl.Listener(*wlr.XdgSurface), xdg_surface: *wlr.XdgSurfa
fn handleUnmap(listener: *wl.Listener(*wlr.XdgSurface), xdg_surface: *wlr.XdgSurface) void {
const self = @fieldParentPtr(Self, "unmap", listener);
- self.view.unmap();
-
// Remove listeners that are only active while mapped
self.commit.link.remove();
self.request_fullscreen.link.remove();
@@ -257,6 +255,8 @@ fn handleUnmap(listener: *wl.Listener(*wlr.XdgSurface), xdg_surface: *wlr.XdgSur
self.request_resize.link.remove();
self.set_title.link.remove();
self.set_app_id.link.remove();
+
+ self.view.unmap();
}
/// Called when the surface is comitted