aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIsaac Freund <ifreund@ifreund.xyz>2020-03-26 21:43:02 +0100
committerIsaac Freund <ifreund@ifreund.xyz>2020-03-26 21:43:02 +0100
commit647545d9fbf1993c488d1d5352225d9f4b57b67d (patch)
tree0341c40a9602a1c537df8e860eaddaf0215d7847 /src
parentd787e2c2cc796170325e4bf2591d0f612bff6e04 (diff)
downloadriver-647545d9fbf1993c488d1d5352225d9f4b57b67d.tar.gz
river-647545d9fbf1993c488d1d5352225d9f4b57b67d.tar.xz
Handle arrange after view unmap/destroy properly
Diffstat (limited to 'src')
-rw-r--r--src/view.zig21
1 files changed, 11 insertions, 10 deletions
diff --git a/src/view.zig b/src/view.zig
index cd91773..6f2c776 100644
--- a/src/view.zig
+++ b/src/view.zig
@@ -107,31 +107,32 @@ pub const View = struct {
const view = @fieldParentPtr(View, "listen_map", listener.?);
view.mapped = true;
view.focus(view.wlr_xdg_surface.surface);
- view.root.arrange();
const node = @fieldParentPtr(std.TailQueue(View).Node, "data", view);
view.root.unmapped_views.remove(node);
view.root.views.prepend(node);
+
+ view.root.arrange();
}
fn handleUnmap(listener: ?*c.wl_listener, data: ?*c_void) callconv(.C) void {
const view = @fieldParentPtr(View, "listen_unmap", listener.?);
view.mapped = false;
+
+ const node = @fieldParentPtr(std.TailQueue(View).Node, "data", view);
+ view.root.views.remove(node);
+ view.root.unmapped_views.prepend(node);
+
+ view.root.arrange();
}
fn handleDestroy(listener: ?*c.wl_listener, data: ?*c_void) callconv(.C) void {
const view = @fieldParentPtr(View, "listen_destroy", listener.?);
const root = view.root;
- var it = root.views.first;
- const target = while (it) |node| : (it = node.next) {
- if (&node.data == view) {
- break node;
- }
- } else unreachable;
-
- root.views.remove(target);
- root.views.destroyNode(target, root.server.allocator);
+ const node = @fieldParentPtr(std.TailQueue(View).Node, "data", view);
+ root.unmapped_views.remove(node);
+ root.unmapped_views.destroyNode(node, root.server.allocator);
}
fn handleCommit(listener: ?*c.wl_listener, data: ?*c_void) callconv(.C) void {