river: remove Root.server

The server is now global so this is no longer needed.
This commit is contained in:
Isaac Freund 2021-05-13 14:26:27 +02:00
parent 271b1563a8
commit 89e0d4c083
No known key found for this signature in database
GPG Key ID: 86DED400DDFD7A11
10 changed files with 46 additions and 48 deletions

View File

@ -21,6 +21,7 @@ const std = @import("std");
const wlr = @import("wlroots");
const wl = @import("wayland").server.wl;
const server = &@import("main.zig").server;
const util = @import("util.zig");
const Box = @import("Box.zig");
@ -109,7 +110,7 @@ fn handleUnmap(listener: *wl.Listener(*wlr.LayerSurfaceV1), wlr_layer_surface: *
self.output.layers[@intCast(usize, @enumToInt(self.state.layer))].remove(self_node);
// If the unmapped surface is focused, clear focus
var it = self.output.root.server.input_manager.seats.first;
var it = server.input_manager.seats.first;
while (it) |node| : (it = node.next) {
const seat = &node.data;
if (seat.focused == .layer and seat.focused.layer == self)
@ -122,7 +123,7 @@ fn handleUnmap(listener: *wl.Listener(*wlr.LayerSurfaceV1), wlr_layer_surface: *
// Ensure that focus is given to the appropriate view if there is no
// other top/overlay layer surface to grab focus.
it = self.output.root.server.input_manager.seats.first;
it = server.input_manager.seats.first;
while (it) |node| : (it = node.next) {
const seat = &node.data;
seat.focus(null);

View File

@ -22,6 +22,7 @@ const wlr = @import("wlroots");
const wayland = @import("wayland");
const wl = wayland.server.wl;
const server = &@import("main.zig").server;
const util = @import("util.zig");
const Layout = @import("Layout.zig");
@ -46,13 +47,13 @@ view_boxen: []Box,
timeout_timer: *wl.EventSource,
pub fn init(layout: *Layout, views: u32) !Self {
const event_loop = layout.output.root.server.wl_server.getEventLoop();
const event_loop = server.wl_server.getEventLoop();
const timeout_timer = try event_loop.addTimer(*Layout, handleTimeout, layout);
errdefer timeout_timer.remove();
try timeout_timer.timerUpdate(timeout_ms);
return Self{
.serial = layout.output.root.server.wl_server.nextSerial(),
.serial = server.wl_server.nextSerial(),
.views = @intCast(i32, views),
.view_boxen = try util.gpa.alloc(Box, views),
.timeout_timer = timeout_timer,
@ -86,7 +87,7 @@ pub fn pushViewDimensions(self: *Self, output: *Output, x: i32, y: i32, width: u
// Here we apply the offset to align the coords with the origin of the
// usable area and shrink the dimensions to accomodate the border size.
const border_width = output.root.server.config.border_width;
const border_width = server.config.border_width;
self.view_boxen[self.view_boxen.len - @intCast(usize, self.views)] = .{
.x = x + output.usable_box.x + @intCast(i32, border_width),
.y = y + output.usable_box.y + @intCast(i32, border_width),

View File

@ -25,8 +25,8 @@ const wayland = @import("wayland");
const wl = wayland.server.wl;
const zwlr = wayland.server.zwlr;
const c = @import("c.zig");
const render = @import("render.zig");
const server = &@import("main.zig").server;
const util = @import("util.zig");
const Box = @import("Box.zig");
@ -133,7 +133,7 @@ pub fn init(self: *Self, root: *Root, wlr_output: *wlr.Output) !void {
} else {
// Ensure that a cursor image at the output's scale factor is loaded
// for each seat.
var it = root.server.input_manager.seats.first;
var it = server.input_manager.seats.first;
while (it) |node| : (it = node.next) {
const seat = &node.data;
seat.cursor.xcursor_manager.load(wlr_output.scale) catch
@ -248,7 +248,7 @@ pub fn arrangeLayers(self: *Self) void {
}
} else null;
var it = self.root.server.input_manager.seats.first;
var it = server.input_manager.seats.first;
while (it) |node| : (it = node.next) {
const seat = &node.data;
@ -503,5 +503,5 @@ pub fn handleLayoutNamespaceChange(self: *Self) void {
}
pub fn layoutNamespace(self: Self) []const u8 {
return self.layout_namespace orelse self.root.server.config.default_layout_namespace;
return self.layout_namespace orelse server.config.default_layout_namespace;
}

View File

@ -23,10 +23,10 @@ const assert = std.debug.assert;
const wlr = @import("wlroots");
const wl = @import("wayland").server.wl;
const server = &@import("main.zig").server;
const util = @import("util.zig");
const Output = @import("Output.zig");
const Server = @import("Server.zig");
const View = @import("View.zig");
const ViewStack = @import("view_stack.zig").ViewStack;
const XwaylandUnmanaged = @import("XwaylandUnmanaged.zig");
@ -40,7 +40,6 @@ const DragIcon = @import("DragIcon.zig");
// encountered during normal usage.
const min_size = 50;
server: *Server,
new_output: wl.Listener(*wlr.Output) = wl.Listener(*wlr.Output).init(handleNewOutput),
output_layout: *wlr.OutputLayout,
@ -86,7 +85,7 @@ pending_configures: u32 = 0,
/// Handles timeout of transactions
transaction_timer: *wl.EventSource,
pub fn init(self: *Self, server: *Server) !void {
pub fn init(self: *Self) !void {
const output_layout = try wlr.OutputLayout.create();
errdefer output_layout.destroy();
@ -97,7 +96,6 @@ pub fn init(self: *Self, server: *Server) !void {
errdefer transaction_timer.remove();
self.* = .{
.server = server,
.output_layout = output_layout,
.output_manager = try wlr.OutputManagerV1.create(server.wl_server),
.power_manager = try wlr.OutputPowerManagerV1.create(server.wl_server),
@ -200,7 +198,7 @@ pub fn removeOutput(self: *Self, output: *Output) void {
}
// If any seat has the removed output focused, focus the fallback one
var seat_it = self.server.input_manager.seats.first;
var seat_it = server.input_manager.seats.first;
while (seat_it) |seat_node| : (seat_it = seat_node.next) {
const seat = &seat_node.data;
if (seat.focused_output == output) {
@ -241,7 +239,7 @@ pub fn addOutput(self: *Self, output: *Output) void {
while (self.noop_output.views.last) |n| n.view.sendToOutput(output);
// Focus the new output with all seats
var it = self.server.input_manager.seats.first;
var it = server.input_manager.seats.first;
while (it) |seat_node| : (it = seat_node.next) {
const seat = &seat_node.data;
seat.focusOutput(output);

View File

@ -113,7 +113,7 @@ pub fn init(self: *Self) !void {
self.config = try Config.init();
try self.decoration_manager.init(self);
try self.root.init(self);
try self.root.init();
// Must be called after root is initialized
try self.input_manager.init(self);
try self.control.init(self);

View File

@ -24,6 +24,7 @@ const os = std.os;
const wlr = @import("wlroots");
const wl = @import("wayland").server.wl;
const server = &@import("main.zig").server;
const util = @import("util.zig");
const Box = @import("Box.zig");
@ -147,14 +148,14 @@ pub fn init(self: *Self, output: *Output, tags: u32, surface: anytype) void {
.output = output,
.current = .{
.tags = tags,
.target_opacity = output.root.server.config.opacity.initial,
.target_opacity = server.config.opacity.initial,
},
.pending = .{
.tags = tags,
.target_opacity = output.root.server.config.opacity.initial,
.target_opacity = server.config.opacity.initial,
},
.saved_buffers = std.ArrayList(SavedBuffer).init(util.gpa),
.opacity = output.root.server.config.opacity.initial,
.opacity = server.config.opacity.initial,
};
if (@TypeOf(surface) == *wlr.XdgSurface) {
@ -228,9 +229,9 @@ pub fn applyPending(self: *Self) void {
// Restore configured opacity
self.pending.target_opacity = if (self.pending.focus > 0)
self.output.root.server.config.opacity.focused
server.config.opacity.focused
else
self.output.root.server.config.opacity.unfocused;
server.config.opacity.unfocused;
}
if (arrange_output) self.output.arrangeViews();
@ -339,7 +340,6 @@ pub fn close(self: Self) void {
.xwayland_view => |xwayland_view| xwayland_view.close(),
}
}
pub inline fn forEachPopupSurface(
self: Self,
comptime T: type,
@ -396,8 +396,7 @@ pub fn getConstraints(self: Self) Constraints {
/// Modify the pending x/y of the view by the given deltas, clamping to the
/// bounds of the output.
pub fn move(self: *Self, delta_x: i32, delta_y: i32) void {
const config = &self.output.root.server.config;
const border_width = if (self.draw_borders) @intCast(i32, config.border_width) else 0;
const border_width = if (self.draw_borders) @intCast(i32, server.config.border_width) else 0;
const output_resolution = self.output.getEffectiveResolution();
const max_x = @intCast(i32, output_resolution.width) - @intCast(i32, self.pending.box.width) - border_width;
@ -445,15 +444,13 @@ pub fn shouldTrackConfigure(self: Self) bool {
/// Called by the impl when the surface is ready to be displayed
pub fn map(self: *Self) void {
const root = self.output.root;
self.pending.target_opacity = self.output.root.server.config.opacity.unfocused;
self.pending.target_opacity = server.config.opacity.unfocused;
log.debug("view '{}' mapped", .{self.getTitle()});
if (self.foreign_toplevel_handle == null) {
self.foreign_toplevel_handle = wlr.ForeignToplevelHandleV1.create(
root.server.foreign_toplevel_manager,
server.foreign_toplevel_manager,
) catch {
log.crit("out of memory", .{});
self.surface.?.resource.getClient().postNoMemory();
@ -476,7 +473,7 @@ pub fn map(self: *Self) void {
// Focus the new view, assuming the seat is focusing the proper output
// and there isn't something else like a fullscreen view grabbing focus.
var it = root.server.input_manager.seats.first;
var it = server.input_manager.seats.first;
while (it) |seat_node| : (it = seat_node.next) seat_node.data.focus(self);
self.surface.?.sendEnter(self.output.wlr_output);
@ -502,7 +499,7 @@ pub fn unmap(self: *Self) void {
}
// Inform all seats that the view has been unmapped so they can handle focus
var it = root.server.input_manager.seats.first;
var it = server.input_manager.seats.first;
while (it) |node| : (it = node.next) {
const seat = &node.data;
seat.handleViewUnmap(self);
@ -521,7 +518,7 @@ pub fn notifyTitle(self: Self) void {
if (self.getTitle()) |s| handle.setTitle(s);
}
// Send title to all status listeners attached to a seat which focuses this view
var seat_it = self.output.root.server.input_manager.seats.first;
var seat_it = server.input_manager.seats.first;
while (seat_it) |seat_node| : (seat_it = seat_node.next) {
if (seat_node.data.focused == .view and seat_node.data.focused.view == &self) {
var client_it = seat_node.data.status_trackers.first;
@ -542,12 +539,11 @@ pub fn notifyAppId(self: Self) void {
/// If the target opacity was reached, return true.
fn incrementOpacity(self: *Self) bool {
// TODO damage view when implementing damage based rendering
const config = &self.output.root.server.config;
if (self.opacity < self.current.target_opacity) {
self.opacity += config.opacity.delta;
self.opacity += server.config.opacity.delta;
if (self.opacity < self.current.target_opacity) return false;
} else {
self.opacity -= config.opacity.delta;
self.opacity -= server.config.opacity.delta;
if (self.opacity > self.current.target_opacity) return false;
}
self.opacity = self.current.target_opacity;
@ -562,7 +558,7 @@ fn killOpacityTimer(self: *Self) void {
/// Set the timeout on a views opacity timer
fn armOpacityTimer(self: *Self) void {
const delta_t = self.output.root.server.config.opacity.delta_t;
const delta_t = server.config.opacity.delta_t;
self.opacity_timer.?.timerUpdate(delta_t) catch |err| {
log.err("failed to update opacity timer: {}", .{err});
self.killOpacityTimer();
@ -581,7 +577,7 @@ fn handleOpacityTimer(self: *Self) callconv(.C) c_int {
/// Create an opacity timer for a view and arm it
fn attachOpacityTimer(self: *Self) void {
const event_loop = self.output.root.server.wl_server.getEventLoop();
const event_loop = server.wl_server.getEventLoop();
self.opacity_timer = event_loop.addTimer(*Self, handleOpacityTimer, self) catch {
log.err("failed to create opacity timer for view '{}'", .{self.getTitle()});
return;

View File

@ -21,6 +21,7 @@ const std = @import("std");
const wlr = @import("wlroots");
const wl = @import("wayland").server.wl;
const server = &@import("main.zig").server;
const util = @import("util.zig");
const Box = @import("Box.zig");
@ -103,7 +104,6 @@ pub fn configure(self: Self) void {
pub fn close(self: Self) void {
self.xdg_surface.role_data.toplevel.sendClose();
}
pub inline fn forEachPopupSurface(
self: Self,
comptime T: type,
@ -157,7 +157,6 @@ fn handleDestroy(listener: *wl.Listener(*wlr.XdgSurface), xdg_surface: *wlr.XdgS
fn handleMap(listener: *wl.Listener(*wlr.XdgSurface), xdg_surface: *wlr.XdgSurface) void {
const self = @fieldParentPtr(Self, "map", listener);
const view = self.view;
const root = view.output.root;
const toplevel = self.xdg_surface.role_data.toplevel;
// Add listeners that are only active while mapped
@ -198,7 +197,7 @@ fn handleMap(listener: *wl.Listener(*wlr.XdgSurface), xdg_surface: *wlr.XdgSurfa
view.pending.box = view.float_box;
} else {
// Make views with app_ids listed in the float filter float
for (root.server.config.float_filter.items) |filter_app_id| {
for (server.config.float_filter.items) |filter_app_id| {
if (std.mem.eql(u8, std.mem.span(app_id), std.mem.span(filter_app_id))) {
view.current.float = true;
view.pending.float = true;
@ -210,7 +209,7 @@ fn handleMap(listener: *wl.Listener(*wlr.XdgSurface), xdg_surface: *wlr.XdgSurfa
// If the toplevel has an app_id which is not configured to use client side
// decorations, inform it that it is tiled.
for (root.server.config.csd_filter.items) |filter_app_id| {
for (server.config.csd_filter.items) |filter_app_id| {
if (std.mem.eql(u8, std.mem.span(app_id), filter_app_id)) {
view.draw_borders = false;
break;
@ -225,7 +224,6 @@ fn handleMap(listener: *wl.Listener(*wlr.XdgSurface), xdg_surface: *wlr.XdgSurfa
/// Called when the surface is unmapped and will no longer be displayed.
fn handleUnmap(listener: *wl.Listener(*wlr.XdgSurface), xdg_surface: *wlr.XdgSurface) void {
const self = @fieldParentPtr(Self, "unmap", listener);
const root = self.view.output.root;
self.view.unmap();

View File

@ -22,6 +22,8 @@ const math = std.math;
const wlr = @import("wlroots");
const wl = @import("wayland").server.wl;
const server = &@import("main.zig").server;
const Box = @import("Box.zig");
const View = @import("View.zig");
const ViewStack = @import("view_stack.zig").ViewStack;
@ -187,7 +189,7 @@ fn handleMap(listener: *wl.Listener(*wlr.XwaylandSurface), xwayland_surface: *wl
view.pending.box = view.float_box;
} else {
// Make views with app_ids listed in the float filter float
for (root.server.config.float_filter.items) |filter_app_id| {
for (server.config.float_filter.items) |filter_app_id| {
if (std.mem.eql(u8, std.mem.span(app_id), std.mem.span(filter_app_id))) {
view.current.float = true;
view.pending.float = true;

View File

@ -17,6 +17,8 @@
const std = @import("std");
const server = &@import("../main.zig").server;
const Error = @import("../command.zig").Error;
const PhysicalDirection = @import("../command.zig").PhysicalDirection;
const Orientation = @import("../command.zig").Orientation;
@ -61,7 +63,7 @@ pub fn snap(
return Error.InvalidPhysicalDirection;
const view = getView(seat) orelse return;
const border_width = @intCast(i32, view.output.root.server.config.border_width);
const border_width = @intCast(i32, server.config.border_width);
const output_box = view.output.getEffectiveResolution();
switch (direction) {
.up => view.pending.box.y = border_width,
@ -89,7 +91,7 @@ pub fn resize(
return Error.InvalidOrientation;
const view = getView(seat) orelse return;
const border_width = @intCast(i32, view.output.root.server.config.border_width);
const border_width = @intCast(i32, server.config.border_width);
const output_box = view.output.getEffectiveResolution();
switch (orientation) {
.horizontal => {

View File

@ -22,6 +22,7 @@ const wlr = @import("wlroots");
const wl = @import("wayland").server.wl;
const pixman = @import("pixman");
const server = &@import("main.zig").server;
const util = @import("util.zig");
const Box = @import("Box.zig");
@ -47,7 +48,6 @@ const SurfaceRenderData = struct {
/// The rendering order in this function must be kept in sync with Cursor.surfaceAt()
pub fn renderOutput(output: *Output) void {
const config = &output.root.server.config;
const renderer = output.wlr_output.backend.getRenderer().?;
var now: os.timespec = undefined;
@ -72,7 +72,7 @@ pub fn renderOutput(output: *Output) void {
if (!view.destroying) renderViewPopups(output, view, &now);
} else {
// No fullscreen view, so render normal layers/views
renderer.clear(&config.background_color);
renderer.clear(&server.config.background_color);
renderLayer(output, output.getLayer(.background).*, &now, .toplevels);
renderLayer(output, output.getLayer(.bottom).*, &now, .toplevels);
@ -324,7 +324,7 @@ fn renderTexture(
}
fn renderBorders(output: *const Output, view: *View, now: *os.timespec) void {
const config = &output.root.server.config;
const config = &server.config;
const color = if (view.current.focus != 0) &config.border_color_focused else &config.border_color_unfocused;
const border_width = config.border_width;
const actual_box = if (view.saved_buffers.items.len != 0) view.saved_surface_box else view.surface_box;