aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIsaac Freund <ifreund@ifreund.xyz>2021-01-21 10:43:18 +0100
committerIsaac Freund <ifreund@ifreund.xyz>2021-01-21 10:43:18 +0100
commitcd005e15f8bcb6852b35fd3d89248e72611a5d5f (patch)
treead6082efb75d034f9704dcb356feafebc9e6e993
parent18bab45d4c12f64c3c28b07243c79e807fe45ccd (diff)
downloadriver-cd005e15f8bcb6852b35fd3d89248e72611a5d5f.tar.gz
river-cd005e15f8bcb6852b35fd3d89248e72611a5d5f.tar.xz
river-options: free options of destroyed outputs
This is done when river's internal Output struct is destroyed, not when the advertised wl_output global is removed. This means that options will persist when an output is disabled and re-enabled.
-rw-r--r--river/Option.zig1
-rw-r--r--river/OptionsManager.zig7
-rw-r--r--river/Output.zig2
3 files changed, 10 insertions, 0 deletions
diff --git a/river/Option.zig b/river/Option.zig
index 1008d5f..a6366bc 100644
--- a/river/Option.zig
+++ b/river/Option.zig
@@ -67,6 +67,7 @@ pub fn destroy(self: *Self) void {
var it = self.handles.safeIterator(.forward);
while (it.next()) |handle| handle.destroy();
if (self.value == .string) if (self.value.string) |s| util.gpa.free(mem.span(s));
+ self.link.remove();
util.gpa.destroy(self);
}
diff --git a/river/OptionsManager.zig b/river/OptionsManager.zig
index a3e2876..9d895dd 100644
--- a/river/OptionsManager.zig
+++ b/river/OptionsManager.zig
@@ -44,6 +44,13 @@ pub fn init(self: *Self, server: *Server) !void {
server.wl_server.addDestroyListener(&self.server_destroy);
}
+pub fn handleOutputDestroy(self: *Self, output: *Output) void {
+ var it = self.options.safeIterator(.forward);
+ while (it.next()) |option| {
+ if (option.output == output) option.destroy();
+ }
+}
+
fn handleServerDestroy(listener: *wl.Listener(*wl.Server), wl_server: *wl.Server) void {
const self = @fieldParentPtr(Self, "server_destroy", listener);
self.global.destroy();
diff --git a/river/Output.zig b/river/Output.zig
index c8cd6c3..1b599ef 100644
--- a/river/Output.zig
+++ b/river/Output.zig
@@ -487,6 +487,8 @@ fn handleDestroy(listener: *wl.Listener(*wlr.Output), wlr_output: *wlr.Output) v
log.debug(.server, "output '{}' destroyed", .{self.wlr_output.name});
+ root.server.options_manager.handleOutputDestroy(self);
+
// Remove the destroyed output from root if it wasn't already removed
root.removeOutput(self);