git.lucas.co / cce-compositor
Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git

commit6ab1de60d21516c50d23f60aa085de1d3a26e32f
parent4be1b05810
authorIsaac Freund <[email protected]>
date2021-05-13 14:35
river: remove Output.root

The server is now global so this is no longer needed.

 river/Cursor.zig             |  6 +++---
 river/LayerSurface.zig       |  4 ++--
 river/Layout.zig             |  7 ++++---
 river/LayoutDemand.zig       |  4 ++--
 river/Output.zig             | 19 ++++++++-----------
 river/Root.zig               |  6 +++---
 river/View.zig               | 14 ++++++--------
 river/XwaylandView.zig       |  5 ++---
 river/command/focus_view.zig |  6 ++++--
 river/command/swap.zig       |  4 +++-
 river/command/tags.zig       |  6 ++++--
 river/command/zoom.zig       |  4 +++-
 river/render.zig             |  8 ++++----
 13 files changed, 48 insertions(+), 45 deletions(-)

diff --git a/river/Cursor.zig b/river/Cursor.zig
index 44cf8f3..27d9ec5 100644
--- a/river/Cursor.zig
+++ b/river/Cursor.zig
@@ -26,6 +26,7 @@ const wl = wayland.server.wl;
 const zwlr = wayland.server.zwlr;
 
 const c = @import("c.zig");
+const server = &@import("main.zig").server;
 const util = @import("util.zig");
 
 const Box = @import("Box.zig");
@@ -138,7 +139,6 @@ pub fn deinit(self: *Self) void {
 /// this is the default seat. Either argument may be null, in which case a
 /// default will be used.
 pub fn setTheme(self: *Self, theme: ?[*:0]const u8, _size: ?u32) !void {
-    const server = self.seat.input_manager.server;
     const size = _size orelse default_size;
 
     self.xcursor_manager.destroy();
@@ -536,7 +536,7 @@ pub fn enterMode(self: *Self, mode: @TagType(Mode), view: *View) void {
         .passthrough => unreachable,
         .down => {
             self.mode = .{ .down = view };
-            view.output.root.startTransaction();
+            server.root.startTransaction();
         },
         .move, .resize => {
             const cur_box = &view.current.box;
@@ -626,7 +626,7 @@ fn processMotion(self: *Self, device: *wlr.InputDevice, time: u32, delta_x: f64,
         .down => |view| {
             self.wlr_cursor.move(device, dx, dy);
             // This takes surface-local coordinates
-            const output_box = view.output.root.output_layout.getBox(view.output.wlr_output).?;
+            const output_box = server.root.output_layout.getBox(view.output.wlr_output).?;
             self.seat.wlr_seat.pointerNotifyMotion(
                 time,
                 self.wlr_cursor.x - @intToFloat(f64, output_box.x + view.current.box.x - view.surface_box.x),
diff --git a/river/LayerSurface.zig b/river/LayerSurface.zig
index ead75f6..ea73fc9 100644
--- a/river/LayerSurface.zig
+++ b/river/LayerSurface.zig
@@ -129,7 +129,7 @@ fn handleUnmap(listener: *wl.Listener(*wlr.LayerSurfaceV1), wlr_layer_surface: *
         seat.focus(null);
     }
 
-    self.output.root.startTransaction();
+    server.root.startTransaction();
 }
 
 fn handleCommit(listener: *wl.Listener(*wlr.Surface), wlr_surface: *wlr.Surface) void {
@@ -152,7 +152,7 @@ fn handleCommit(listener: *wl.Listener(*wlr.Surface), wlr_surface: *wlr.Surface)
         self.state = new_state.*;
 
         self.output.arrangeLayers();
-        self.output.root.startTransaction();
+        server.root.startTransaction();
     }
 }
 
diff --git a/river/Layout.zig b/river/Layout.zig
index c6af635..b5c72a9 100644
--- a/river/Layout.zig
+++ b/river/Layout.zig
@@ -24,6 +24,7 @@ const wayland = @import("wayland");
 const wl = wayland.server.wl;
 const river = wayland.server.river;
 
+const server = &@import("main.zig").server;
 const util = @import("util.zig");
 
 const Box = @import("Box.zig");
@@ -70,7 +71,7 @@ pub fn create(client: *wl.Client, version: u32, id: u32, output: *Output, namesp
 /// Returns true if the given namespace is already in use on the given output
 /// or on another output by a different client.
 fn namespaceInUse(namespace: []const u8, output: *Output, client: *wl.Client) bool {
-    var output_it = output.root.outputs.first;
+    var output_it = server.root.outputs.first;
     while (output_it) |output_node| : (output_it = output_node.next) {
         var layout_it = output_node.data.layouts.first;
         if (output_node.data.wlr_output == output.wlr_output) {
@@ -125,7 +126,7 @@ pub fn startLayoutDemand(self: *Self, views: u32) void {
     }
     self.layout.sendAdvertiseDone(serial);
 
-    self.output.root.trackLayoutDemands();
+    server.root.trackLayoutDemands();
 }
 
 fn handleRequest(layout: *river.LayoutV2, request: river.LayoutV2.Request, self: *Self) void {
@@ -183,7 +184,7 @@ fn handleDestroy(layout: *river.LayoutV2, self: *Self) void {
     if (self == self.output.pending.layout) {
         self.output.pending.layout = null;
         self.output.arrangeViews();
-        self.output.root.startTransaction();
+        server.root.startTransaction();
     }
 
     util.gpa.free(self.namespace);
diff --git a/river/LayoutDemand.zig b/river/LayoutDemand.zig
index 9518ae1..12c58c1 100644
--- a/river/LayoutDemand.zig
+++ b/river/LayoutDemand.zig
@@ -75,7 +75,7 @@ fn handleTimeout(layout: *Layout) callconv(.C) c_int {
     layout.output.layout_demand.?.deinit();
     layout.output.layout_demand = null;
 
-    layout.output.root.notifyLayoutDemandDone();
+    server.root.notifyLayoutDemandDone();
 
     return 0;
 }
@@ -107,7 +107,7 @@ pub fn apply(self: *Self, layout: *Layout) void {
     defer {
         output.layout_demand.?.deinit();
         output.layout_demand = null;
-        output.root.notifyLayoutDemandDone();
+        server.root.notifyLayoutDemandDone();
     }
 
     // Check that the number of proposed dimensions is correct.
diff --git a/river/Output.zig b/river/Output.zig
index 9ea74b6..9731192 100644
--- a/river/Output.zig
+++ b/river/Output.zig
@@ -55,7 +55,6 @@ const State = struct {
     layout: ?*Layout = null,
 };
 
-root: *Root,
 wlr_output: *wlr.Output,
 
 /// All layer surfaces on the output, indexed by the layer enum.
@@ -98,7 +97,7 @@ enable: wl.Listener(*wlr.Output) = wl.Listener(*wlr.Output).init(handleEnable),
 frame: wl.Listener(*wlr.Output) = wl.Listener(*wlr.Output).init(handleFrame),
 mode: wl.Listener(*wlr.Output) = wl.Listener(*wlr.Output).init(handleMode),
 
-pub fn init(self: *Self, root: *Root, wlr_output: *wlr.Output) !void {
+pub fn init(self: *Self, wlr_output: *wlr.Output) !void {
     // Some backends don't have modes. DRM+KMS does, and we need to set a mode
     // before we can use the output. The mode is a tuple of (width, height,
     // refresh rate), and each monitor supports only a specific set of modes. We
@@ -111,7 +110,6 @@ pub fn init(self: *Self, root: *Root, wlr_output: *wlr.Output) !void {
     }
 
     self.* = .{
-        .root = root,
         .wlr_output = wlr_output,
         .usable_box = undefined,
     };
@@ -179,7 +177,7 @@ pub fn arrangeFilter(view: *View, filter_tags: u32) bool {
 /// blocked until the layout demand has either finished or was aborted. Both
 /// cases will start a transaction.
 pub fn arrangeViews(self: *Self) void {
-    if (self == &self.root.noop_output) return;
+    if (self == &server.root.noop_output) return;
 
     // If there is already an active layout demand, discard it.
     if (self.layout_demand) |demand| {
@@ -418,17 +416,16 @@ fn arrangeLayer(
 /// and then remove it from the list of outputs.
 fn handleDestroy(listener: *wl.Listener(*wlr.Output), wlr_output: *wlr.Output) void {
     const self = @fieldParentPtr(Self, "destroy", listener);
-    const root = self.root;
 
     std.log.scoped(.server).debug("output '{}' destroyed", .{self.wlr_output.name});
 
     // Remove the destroyed output from root if it wasn't already removed
-    root.removeOutput(self);
+    server.root.removeOutput(self);
 
-    var it = root.all_outputs.first;
+    var it = server.root.all_outputs.first;
     while (it) |all_node| : (it = all_node.next) {
         if (all_node.data == self) {
-            root.all_outputs.remove(all_node);
+            server.root.all_outputs.remove(all_node);
             break;
         }
     }
@@ -454,7 +451,7 @@ fn handleEnable(listener: *wl.Listener(*wlr.Output), wlr_output: *wlr.Output) vo
 
     // Add the output to root.outputs and the output layout if it has not
     // already been added.
-    if (wlr_output.enabled) self.root.addOutput(self);
+    if (wlr_output.enabled) server.root.addOutput(self);
 }
 
 fn handleFrame(listener: *wl.Listener(*wlr.Output), wlr_output: *wlr.Output) void {
@@ -468,7 +465,7 @@ fn handleMode(listener: *wl.Listener(*wlr.Output), wlr_output: *wlr.Output) void
     const self = @fieldParentPtr(Self, "mode", listener);
     self.arrangeLayers();
     self.arrangeViews();
-    self.root.startTransaction();
+    server.root.startTransaction();
 }
 
 pub fn getEffectiveResolution(self: *Self) struct { width: u32, height: u32 } {
@@ -499,7 +496,7 @@ pub fn handleLayoutNamespaceChange(self: *Self) void {
         if (mem.eql(u8, self.layoutNamespace(), node.data.namespace)) break &node.data;
     } else null;
     self.arrangeViews();
-    self.root.startTransaction();
+    server.root.startTransaction();
 }
 
 pub fn layoutNamespace(self: Self) []const u8 {
diff --git a/river/Root.zig b/river/Root.zig
index 10a5f37..37072f7 100644
--- a/river/Root.zig
+++ b/river/Root.zig
@@ -75,7 +75,7 @@ xwayland_unmanaged_views: if (build_options.xwayland)
     std.TailQueue(XwaylandUnmanaged)
 else
     void = if (build_options.xwayland)
-.{},
+    .{},
 
 /// Number of layout demands pending before the transaction may be started.
 pending_layout_demands: u32 = 0,
@@ -104,7 +104,7 @@ pub fn init(self: *Self) !void {
     };
 
     const noop_wlr_output = try server.noop_backend.noopAddOutput();
-    try self.noop_output.init(self, noop_wlr_output);
+    try self.noop_output.init(noop_wlr_output);
 
     server.backend.events.new_output.add(&self.new_output);
     self.output_manager.events.apply.add(&self.manager_apply);
@@ -134,7 +134,7 @@ fn handleNewOutput(listener: *wl.Listener(*wlr.Output), wlr_output: *wlr.Output)
         wlr_output.destroy();
         return;
     };
-    node.data.init(self, wlr_output) catch {
+    node.data.init(wlr_output) catch {
         wlr_output.destroy();
         util.gpa.destroy(node);
         return;
diff --git a/river/View.zig b/river/View.zig
index 8ab0eff..8d09e8e 100644
--- a/river/View.zig
+++ b/river/View.zig
@@ -215,7 +215,7 @@ pub fn applyPending(self: *Self) void {
         self.post_fullscreen_box = self.current.box;
 
         self.pending.target_opacity = 1.0;
-        const layout_box = self.output.root.output_layout.getBox(self.output.wlr_output).?;
+        const layout_box = server.root.output_layout.getBox(self.output.wlr_output).?;
         self.pending.box = .{
             .x = 0,
             .y = 0,
@@ -236,7 +236,7 @@ pub fn applyPending(self: *Self) void {
 
     if (arrange_output) self.output.arrangeViews();
 
-    self.output.root.startTransaction();
+    server.root.startTransaction();
 }
 
 pub fn needsConfigure(self: Self) bool {
@@ -280,7 +280,7 @@ pub fn saveBuffers(self: *Self) void {
 pub fn notifyConfiguredOrApplyPending(self: *Self) void {
     self.pending_serial = null;
     if (self.shouldTrackConfigure())
-        self.output.root.notifyConfigured()
+        server.root.notifyConfigured()
     else {
         const self_tags_changed = self.pending.tags != self.current.tags;
         self.current = self.pending;
@@ -482,13 +482,11 @@ pub fn map(self: *Self) void {
 
     if (!self.current.float) self.output.arrangeViews();
 
-    self.output.root.startTransaction();
+    server.root.startTransaction();
 }
 
 /// Called by the impl when the surface will no longer be displayed
 pub fn unmap(self: *Self) void {
-    const root = self.output.root;
-
     log.debug("view '{}' unmapped", .{self.getTitle()});
 
     self.destroying = true;
@@ -510,7 +508,7 @@ pub fn unmap(self: *Self) void {
     // Still need to arrange if fullscreened from the layout
     if (!self.current.float) self.output.arrangeViews();
 
-    root.startTransaction();
+    server.root.startTransaction();
 }
 
 pub fn notifyTitle(self: Self) void {
@@ -608,7 +606,7 @@ fn handleForeignActivate(
     const self = @fieldParentPtr(Self, "foreign_activate", listener);
     const seat = @intToPtr(*Seat, event.seat.data);
     seat.focus(self);
-    self.output.root.startTransaction();
+    server.root.startTransaction();
 }
 
 fn handleForeignFullscreen(
diff --git a/river/XwaylandView.zig b/river/XwaylandView.zig
index ba383a3..f5360c7 100644
--- a/river/XwaylandView.zig
+++ b/river/XwaylandView.zig
@@ -72,7 +72,7 @@ pub fn deinit(self: *Self) void {
 
 pub fn needsConfigure(self: Self) bool {
     const output = self.view.output;
-    const output_box = output.root.output_layout.getBox(output.wlr_output).?;
+    const output_box = server.root.output_layout.getBox(output.wlr_output).?;
     return self.xwayland_surface.x != self.view.pending.box.x + output_box.x or
         self.xwayland_surface.y != self.view.pending.box.y + output_box.y or
         self.xwayland_surface.width != self.view.pending.box.width or
@@ -83,7 +83,7 @@ pub fn needsConfigure(self: Self) bool {
 /// shouldTrackConfigure() is always false for xwayland views.
 pub fn configure(self: Self) void {
     const output = self.view.output;
-    const output_box = output.root.output_layout.getBox(output.wlr_output).?;
+    const output_box = server.root.output_layout.getBox(output.wlr_output).?;
 
     const state = &self.view.pending;
     self.xwayland_surface.setFullscreen(state.fullscreen);
@@ -156,7 +156,6 @@ fn handleDestroy(listener: *wl.Listener(*wlr.XwaylandSurface), xwayland_surface:
 fn handleMap(listener: *wl.Listener(*wlr.XwaylandSurface), xwayland_surface: *wlr.XwaylandSurface) void {
     const self = @fieldParentPtr(Self, "map", listener);
     const view = self.view;
-    const root = view.output.root;
 
     // Add listeners that are only active while mapped
     xwayland_surface.surface.?.events.commit.add(&self.commit);
diff --git a/river/command/focus_view.zig b/river/command/focus_view.zig
index 650e848..984df82 100644
--- a/river/command/focus_view.zig
+++ b/river/command/focus_view.zig
@@ -17,6 +17,8 @@
 
 const std = @import("std");
 
+const server = &@import("../main.zig").server;
+
 const Direction = @import("../command.zig").Direction;
 const Error = @import("../command.zig").Error;
 const Seat = @import("../Seat.zig");
@@ -53,7 +55,7 @@ pub fn focusView(
         // Focus the next visible node if there is one
         if (it.next()) |view| {
             seat.focus(view);
-            output.root.startTransaction();
+            server.root.startTransaction();
             return;
         }
     }
@@ -66,7 +68,7 @@ pub fn focusView(
     };
 
     seat.focus(it.next());
-    output.root.startTransaction();
+    server.root.startTransaction();
 }
 
 fn filter(view: *View, filter_tags: u32) bool {
diff --git a/river/command/swap.zig b/river/command/swap.zig
index 2c138fe..99b2d6d 100644
--- a/river/command/swap.zig
+++ b/river/command/swap.zig
@@ -17,6 +17,8 @@
 
 const std = @import("std");
 
+const server = &@import("../main.zig").server;
+
 const Error = @import("../command.zig").Error;
 const Direction = @import("../command.zig").Direction;
 const Seat = @import("../Seat.zig");
@@ -74,7 +76,7 @@ pub fn swap(
     output.views.swap(focused_node, to_swap);
 
     output.arrangeViews();
-    output.root.startTransaction();
+    server.root.startTransaction();
 }
 
 fn filter(view: *View, filter_tags: u32) bool {
diff --git a/river/command/tags.zig b/river/command/tags.zig
index 9fd28d3..d056299 100644
--- a/river/command/tags.zig
+++ b/river/command/tags.zig
@@ -17,6 +17,8 @@
 
 const std = @import("std");
 
+const server = &@import("../main.zig").server;
+
 const Error = @import("../command.zig").Error;
 const Seat = @import("../Seat.zig");
 
@@ -32,7 +34,7 @@ pub fn setFocusedTags(
         seat.focused_output.pending.tags = tags;
         seat.focused_output.arrangeViews();
         seat.focus(null);
-        seat.focused_output.root.startTransaction();
+        server.root.startTransaction();
     }
 }
 
@@ -77,7 +79,7 @@ pub fn toggleFocusedTags(
         output.pending.tags = new_focused_tags;
         output.arrangeViews();
         seat.focus(null);
-        output.root.startTransaction();
+        server.root.startTransaction();
     }
 }
 
diff --git a/river/command/zoom.zig b/river/command/zoom.zig
index 02cb974..e5e2a49 100644
--- a/river/command/zoom.zig
+++ b/river/command/zoom.zig
@@ -17,6 +17,8 @@
 
 const std = @import("std");
 
+const server = &@import("../main.zig").server;
+
 const Error = @import("../command.zig").Error;
 const Seat = @import("../Seat.zig");
 const View = @import("../View.zig");
@@ -53,7 +55,7 @@ pub fn zoom(
             output.views.push(to_bump);
             seat.focus(&to_bump.view);
             output.arrangeViews();
-            output.root.startTransaction();
+            server.root.startTransaction();
         }
     }
 }
diff --git a/river/render.zig b/river/render.zig
index 1e870e2..5c00240 100644
--- a/river/render.zig
+++ b/river/render.zig
@@ -234,9 +234,9 @@ fn renderViewPopups(output: *const Output, view: *View, now: *os.timespec) void
 }
 
 fn renderDragIcons(output: *const Output, now: *os.timespec) void {
-    const output_box = output.root.output_layout.getBox(output.wlr_output).?;
+    const output_box = server.root.output_layout.getBox(output.wlr_output).?;
 
-    var it = output.root.drag_icons.first;
+    var it = server.root.drag_icons.first;
     while (it) |node| : (it = node.next) {
         const drag_icon = &node.data;
 
@@ -255,9 +255,9 @@ fn renderDragIcons(output: *const Output, now: *os.timespec) void {
 
 /// Render all xwayland unmanaged windows that appear on the output
 fn renderXwaylandUnmanaged(output: *const Output, now: *os.timespec) void {
-    const output_box = output.root.output_layout.getBox(output.wlr_output).?;
+    const output_box = server.root.output_layout.getBox(output.wlr_output).?;
 
-    var it = output.root.xwayland_unmanaged_views.first;
+    var it = server.root.xwayland_unmanaged_views.first;
     while (it) |node| : (it = node.next) {
         const xwayland_surface = node.data.xwayland_surface;