stevee

My wayland statusbar
git clone git://gtms.dev/stevee
Log | Files | Refs | Submodules | README | LICENSE

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:
Mbuild.zig | 9+++++++++
Msrc/Input.zig | 2+-
Msrc/Loop.zig | 19+++++++------------
Msrc/Monitor.zig | 2+-
Msrc/Wayland.zig | 62+++++++++++++++++++++++++++++++++++++++++++++++++++-----------
Msrc/modules/Backlight.zig | 7+++++--
Msrc/modules/Battery.zig | 2+-
Msrc/modules/Pulse.zig | 7+++++--
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| {