commit b92fecdc3e6a1372b6b57c57a264ede86fc8c1a6
parent 350c98104e552e8a2d5619145f0331a8bd82bb91
Author: Andrea Feletto <andrea@andreafeletto.com>
Date: Fri, 13 May 2022 00:59:15 +0200
update zig-wayland and add some logs
Diffstat:
8 files changed, 80 insertions(+), 30 deletions(-)
diff --git a/build.zig b/build.zig
@@ -17,6 +17,15 @@ pub fn build(b: *std.build.Builder) void {
scanner.addProtocolPath("protocol/river-status-unstable-v1.xml");
scanner.addProtocolPath("protocol/river-control-unstable-v1.xml");
+ scanner.generate("wl_compositor", 4);
+ scanner.generate("wl_subcompositor", 1);
+ scanner.generate("wl_shm", 1);
+ scanner.generate("wl_output", 4);
+ scanner.generate("wl_seat", 7);
+ scanner.generate("zwlr_layer_shell_v1", 1);
+ scanner.generate("zriver_status_manager_v1", 1);
+ scanner.generate("zriver_control_v1", 1);
+
exe.step.dependOn(&scanner.step);
scanner.addCSource(exe);
diff --git a/src/Input.zig b/src/Input.zig
@@ -19,7 +19,7 @@ pointer: struct {
pub fn create(state: *State, registry: *wl.Registry, name: u32) !*Input {
const self = try state.gpa.create(Input);
self.state = state;
- self.seat = try registry.bind(name, wl.Seat, 3);
+ self.seat = try registry.bind(name, wl.Seat, 7);
self.globalName = name;
self.pointer.pointer = null;
diff --git a/src/Loop.zig b/src/Loop.zig
@@ -14,13 +14,13 @@ pub const Event = struct {
callbackIn: Callback,
callbackOut: Callback,
- pub const Callback = fn (*anyopaque) error{Terminate}!void;
+ pub const Callback = fn (*anyopaque) void;
- pub fn terminate(_: *anyopaque) error{Terminate}!void {
- return error.Terminate;
+ pub fn terminate(_: *anyopaque) void {
+ os.exit(0);
}
- pub fn noop(_: *anyopaque) error{Terminate}!void {
+ pub fn noop(_: *anyopaque) void {
return;
}
};
@@ -38,7 +38,6 @@ pub fn init(state: *State) !Loop {
pub fn run(self: *Loop) !void {
const gpa = self.state.gpa;
- const display = self.state.wayland.display;
var events: std.MultiArrayList(Event) = .{};
defer events.deinit(gpa);
@@ -56,11 +55,7 @@ pub fn run(self: *Loop) !void {
const fds = events.items(.fd);
while (true) {
- while (true) {
- const ret = try display.dispatchPending();
- _ = try display.flush();
- if (ret <= 0) break;
- }
+ self.state.wayland.flushAndPrepareRead();
_ = try os.poll(fds, -1);
for (fds) |fd, i| {
@@ -69,11 +64,11 @@ pub fn run(self: *Loop) !void {
if (fd.revents & os.POLL.IN != 0) {
const event = events.get(i);
- event.callbackIn(event.data) catch return;
+ event.callbackIn(event.data);
}
if (fd.revents & os.POLL.OUT != 0) {
const event = events.get(i);
- event.callbackOut(event.data) catch return;
+ event.callbackOut(event.data);
}
}
}
diff --git a/src/Monitor.zig b/src/Monitor.zig
@@ -16,7 +16,7 @@ tags: *Tags,
pub fn create(state: *State, registry: *wl.Registry, name: u32) !*Monitor {
const self = try state.gpa.create(Monitor);
self.state = state;
- self.output = try registry.bind(name, wl.Output, 3);
+ self.output = try registry.bind(name, wl.Output, 4);
self.globalName = name;
self.scale = 1;
diff --git a/src/Wayland.zig b/src/Wayland.zig
@@ -60,11 +60,15 @@ pub fn deinit(self: *Wayland) void {
pub fn registerGlobals(self: *Wayland) !void {
self.registry.setListener(*State, registryListener, self.state);
- _ = try self.display.roundtrip();
-
- for (self.globalsMask) |is_registered| {
- if (!is_registered) return error.UnsupportedGlobal;
+ if (self.display.roundtrip() != .SUCCESS) {
+ std.log.err("failed roundtrip for initialization of globals", .{});
+ os.exit(1);
}
+
+ for (self.globalsMask) |is_registered| if (!is_registered) {
+ std.log.err("missing global", .{});
+ os.exit(1);
+ };
}
pub fn getEvent(self: *Wayland) !Event {
@@ -77,19 +81,55 @@ pub fn getEvent(self: *Wayland) !Event {
.revents = undefined,
},
.data = @ptrCast(*anyopaque, self),
- .callbackIn = dispatch,
- .callbackOut = flush,
+ .callbackIn = read,
+ .callbackOut = Event.noop,
};
}
-fn dispatch(self_opaque: *anyopaque) error{Terminate}!void {
- const self = utils.cast(Wayland)(self_opaque);
- _ = self.display.dispatch() catch return;
+pub fn flushAndPrepareRead(self: *Wayland) void {
+ while (!self.display.prepareRead()) {
+ const errno = self.display.dispatchPending();
+ if (errno != .SUCCESS) {
+ std.log.err("failed to dispatch pending wayland events", .{});
+ os.exit(1);
+ }
+ }
+
+ while (true) {
+ const errno = self.display.flush();
+ switch (errno) {
+ .SUCCESS => return,
+ .PIPE => {
+ _ = self.display.readEvents();
+ std.log.err("connection to wayland server unexpectedly terminated", .{});
+ os.exit(1);
+ },
+ .AGAIN => {
+ var wayland_out = [_]os.pollfd{.{
+ .fd = self.display.getFd(),
+ .events = os.POLL.OUT,
+ .revents = undefined,
+ }};
+ _ = os.poll(&wayland_out, -1) catch {
+ std.log.err("polling for wayland socket being writable failed", .{});
+ os.exit(1);
+ };
+ },
+ else => {
+ std.log.err("failed to flush wayland requests", .{});
+ os.exit(1);
+ },
+ }
+ }
}
-fn flush(self_opaque: *anyopaque) error{Terminate}!void {
+fn read(self_opaque: *anyopaque) void {
const self = utils.cast(Wayland)(self_opaque);
- _ = self.display.flush() catch return;
+ const errno = self.display.readEvents();
+ if (errno != .SUCCESS) {
+ std.log.err("failed to read wayland events", .{});
+ os.exit(1);
+ }
}
fn registryListener(
diff --git a/src/modules/Backlight.zig b/src/modules/Backlight.zig
@@ -68,10 +68,13 @@ fn getEvent(self_opaque: *anyopaque) !Event {
};
}
-fn callbackIn(self_opaque: *anyopaque) error{Terminate}!void {
+fn callbackIn(self_opaque: *anyopaque) void {
const self = utils.cast(Backlight)(self_opaque);
- _ = self.monitor.receiveDevice() catch return;
+ _ = self.monitor.receiveDevice() catch {
+ std.log.err("failed to receive udev device", .{});
+ os.exit(1);
+ };
for (self.state.wayland.monitors.items) |monitor| {
if (monitor.bar) |bar| {
if (bar.configured) {
diff --git a/src/modules/Battery.zig b/src/modules/Battery.zig
@@ -107,7 +107,7 @@ pub fn destroy(self_opaque: *anyopaque) void {
self.state.gpa.destroy(self);
}
-fn callbackIn(self_opaque: *anyopaque) error{Terminate}!void {
+fn callbackIn(self_opaque: *anyopaque) void {
const self = utils.cast(Battery)(self_opaque);
var expirations = mem.zeroes([8]u8);
diff --git a/src/modules/Pulse.zig b/src/modules/Pulse.zig
@@ -67,11 +67,14 @@ fn print(self_opaque: *anyopaque, writer: Module.StringWriter) !void {
}
}
-fn callbackIn(self_opaque: *anyopaque) error{Terminate}!void {
+fn callbackIn(self_opaque: *anyopaque) void {
const self = utils.cast(Pulse)(self_opaque);
var data = mem.zeroes([8]u8);
- _ = os.read(self.fd, &data) catch return error.Terminate;
+ _ = os.read(self.fd, &data) catch {
+ std.log.err("read failed", .{});
+ os.exit(1);
+ };
for (self.state.wayland.monitors.items) |monitor| {
if (monitor.bar) |bar| {