aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--river/Output.zig53
-rw-r--r--river/render.zig55
2 files changed, 40 insertions, 68 deletions
diff --git a/river/Output.zig b/river/Output.zig
index 95dde75..b92a4e2 100644
--- a/river/Output.zig
+++ b/river/Output.zig
@@ -26,7 +26,6 @@ const wayland = @import("wayland");
const wl = wayland.server.wl;
const zwlr = wayland.server.zwlr;
-const render = @import("render.zig");
const server = &@import("main.zig").server;
const util = @import("util.zig");
@@ -38,6 +37,8 @@ const OutputStatus = @import("OutputStatus.zig");
const SceneNodeData = @import("SceneNodeData.zig");
const View = @import("View.zig");
+const log = std.log.scoped(.output);
+
wlr_output: *wlr.Output,
/// The area left for views and other layer surfaces after applying the
@@ -269,7 +270,7 @@ pub fn create(wlr_output: *wlr.Output) !void {
while (it) |seat_node| : (it = seat_node.next) {
const seat = &seat_node.data;
seat.cursor.xcursor_manager.load(wlr_output.scale) catch
- std.log.scoped(.cursor).err("failed to load xcursor theme at scale {}", .{wlr_output.scale});
+ log.err("failed to load xcursor theme at scale {}", .{wlr_output.scale});
}
output.setTitle();
@@ -328,7 +329,7 @@ pub fn arrangeLayers(self: *Self) void {
fn handleDestroy(listener: *wl.Listener(*wlr.Output), _: *wlr.Output) void {
const output = @fieldParentPtr(Self, "destroy", listener);
- std.log.scoped(.server).debug("output '{s}' destroyed", .{output.wlr_output.name});
+ log.debug("output '{s}' destroyed", .{output.wlr_output.name});
// Remove the destroyed output from root if it wasn't already removed
server.root.removeOutput(output);
@@ -390,11 +391,6 @@ fn handleEnable(listener: *wl.Listener(*wlr.Output), wlr_output: *wlr.Output) vo
}
}
-fn handleFrame(listener: *wl.Listener(*wlr.Output), _: *wlr.Output) void {
- const self = @fieldParentPtr(Self, "frame", listener);
- render.renderOutput(self);
-}
-
fn handleMode(listener: *wl.Listener(*wlr.Output), _: *wlr.Output) void {
const self = @fieldParentPtr(Self, "mode", listener);
@@ -408,27 +404,58 @@ fn handleMode(listener: *wl.Listener(*wlr.Output), _: *wlr.Output) void {
const background_color_rect = @fieldParentPtr(wlr.SceneRect, "node", it.next().?);
background_color_rect.setSize(width, height);
- std.log.info("new output mode, width: {}, height: {}", .{ width, height });
+ log.info("new output mode, width: {}, height: {}", .{ width, height });
}
server.root.applyPending();
}
+fn handleFrame(listener: *wl.Listener(*wlr.Output), _: *wlr.Output) void {
+ const output = @fieldParentPtr(Self, "frame", listener);
+ const scene_output = server.root.scene.getSceneOutput(output.wlr_output).?;
+
+ if (scene_output.commit()) {
+ if (server.lock_manager.state == .locked or
+ (server.lock_manager.state == .waiting_for_lock_surfaces and output.locked_content.node.enabled) or
+ server.lock_manager.state == .waiting_for_blank)
+ {
+ assert(!output.normal_content.node.enabled);
+ assert(output.locked_content.node.enabled);
+
+ switch (server.lock_manager.state) {
+ .unlocked => unreachable,
+ .locked => switch (output.lock_render_state) {
+ .unlocked, .pending_blank, .pending_lock_surface => unreachable,
+ .blanked, .lock_surface => {},
+ },
+ .waiting_for_blank => output.lock_render_state = .pending_blank,
+ .waiting_for_lock_surfaces => output.lock_render_state = .pending_lock_surface,
+ }
+ }
+ } else {
+ log.err("output commit failed for {s}", .{output.wlr_output.name});
+ }
+
+ var now: std.os.timespec = undefined;
+ std.os.clock_gettime(std.os.CLOCK.MONOTONIC, &now) catch @panic("CLOCK_MONOTONIC not supported");
+ scene_output.sendFrameDone(&now);
+}
+
fn handlePresent(
listener: *wl.Listener(*wlr.Output.event.Present),
event: *wlr.Output.event.Present,
) void {
- const self = @fieldParentPtr(Self, "present", listener);
+ const output = @fieldParentPtr(Self, "present", listener);
- switch (self.lock_render_state) {
+ switch (output.lock_render_state) {
.unlocked => assert(server.lock_manager.state != .locked),
.pending_blank, .pending_lock_surface => {
if (!event.presented) {
- self.lock_render_state = .unlocked;
+ output.lock_render_state = .unlocked;
return;
}
- self.lock_render_state = switch (self.lock_render_state) {
+ output.lock_render_state = switch (output.lock_render_state) {
.pending_blank => .blanked,
.pending_lock_surface => .lock_surface,
.unlocked, .blanked, .lock_surface => unreachable,
diff --git a/river/render.zig b/river/render.zig
deleted file mode 100644
index 86d14cd..0000000
--- a/river/render.zig
+++ /dev/null
@@ -1,55 +0,0 @@
-// This file is part of river, a dynamic tiling wayland compositor.
-//
-// Copyright 2020 The River Developers
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, version 3.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see <https://www.gnu.org/licenses/>.
-
-const std = @import("std");
-const assert = std.debug.assert;
-const os = std.os;
-
-const server = &@import("main.zig").server;
-
-const Output = @import("Output.zig");
-
-const log = std.log.scoped(.render);
-
-pub fn renderOutput(output: *Output) void {
- const scene_output = server.root.scene.getSceneOutput(output.wlr_output).?;
-
- if (scene_output.commit()) {
- if (server.lock_manager.state == .locked or
- (server.lock_manager.state == .waiting_for_lock_surfaces and output.locked_content.node.enabled) or
- server.lock_manager.state == .waiting_for_blank)
- {
- assert(!output.normal_content.node.enabled);
- assert(output.locked_content.node.enabled);
-
- switch (server.lock_manager.state) {
- .unlocked => unreachable,
- .locked => switch (output.lock_render_state) {
- .unlocked, .pending_blank, .pending_lock_surface => unreachable,
- .blanked, .lock_surface => {},
- },
- .waiting_for_blank => output.lock_render_state = .pending_blank,
- .waiting_for_lock_surfaces => output.lock_render_state = .pending_lock_surface,
- }
- }
- } else {
- log.err("output commit failed for {s}", .{output.wlr_output.name});
- }
-
- var now: os.timespec = undefined;
- os.clock_gettime(os.CLOCK.MONOTONIC, &now) catch @panic("CLOCK_MONOTONIC not supported");
- scene_output.sendFrameDone(&now);
-}