stevee

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

commit cd7c193a78e94b769162bd7fc3f5a550a57edfbe
parent 0dda108b1b88baeb9ffe236c3239e5777d66a190
Author: Andrea Feletto <andrea@andreafeletto.com>
Date:   Sun, 30 Jan 2022 01:38:46 +0100

use zig-udev bindings

Diffstat:
M.gitmodules | 3+++
Mbuild.zig | 8+++++++-
Adeps/zig-udev | 1+
Msrc/c.zig | 1-
Msrc/event.zig | 23+++++++++--------------
Msrc/modules.zig | 57+++++++++++++++++++++++----------------------------------
6 files changed, 43 insertions(+), 50 deletions(-)

diff --git a/.gitmodules b/.gitmodules @@ -7,3 +7,6 @@ [submodule "deps/zig-fcft"] path = deps/zig-fcft url = https://git.sr.ht/~andreafeletto/zig-fcft +[submodule "deps/zig-udev"] + path = deps/zig-udev + url = https://git.sr.ht/~andreafeletto/zig-udev diff --git a/build.zig b/build.zig @@ -26,13 +26,16 @@ pub fn build(b: *std.build.Builder) void { .path = .{ .path = "deps/zig-fcft/fcft.zig" }, .dependencies = &[_]Pkg{ pixman }, }; + const udev = Pkg{ + .name = "udev", + .path = .{ .path = "deps/zig-udev/udev.zig" }, + }; const exe = b.addExecutable("levee", "src/main.zig"); exe.setTarget(target); exe.setBuildMode(mode); exe.linkLibC(); - exe.linkSystemLibrary("libudev"); exe.addPackage(wayland); exe.linkSystemLibrary("wayland-client"); @@ -45,6 +48,9 @@ pub fn build(b: *std.build.Builder) void { exe.addPackage(fcft); exe.linkSystemLibrary("fcft"); + exe.addPackage(udev); + exe.linkSystemLibrary("libudev"); + exe.install(); const run_cmd = exe.run(); diff --git a/deps/zig-udev b/deps/zig-udev @@ -0,0 +1 @@ +Subproject commit 01d0a1aadc67df24a65d7c39efce2fd0f9d0bdfc diff --git a/src/c.zig b/src/c.zig @@ -1,2 +1 @@ -pub const udev = @cImport(@cInclude("libudev.h")); pub const time = @cImport(@cInclude("time.h")); diff --git a/src/event.zig b/src/event.zig @@ -4,6 +4,7 @@ const os = std.os; const ArrayList = std.ArrayList; const wl = @import("wayland").client.wl; +const udev = @import("udev"); const c = @import("c.zig"); const render = @import("render.zig"); @@ -12,7 +13,7 @@ const State = @import("main.zig").State; pub const Loop = struct { state: *State, fds: [5]os.pollfd, - monitor: *c.udev.udev_monitor, + monitor: *udev.Monitor, pub fn init(state: *State) !Loop { // signals @@ -38,17 +39,11 @@ pub const Loop = struct { const ifd = os.linux.inotify_init1(os.linux.IN.CLOEXEC); // udev - const udev = c.udev.udev_new(); - if (udev == null) return error.UdevError; - const monitor = c.udev.udev_monitor_new_from_netlink(udev, "udev"); - if (monitor == null) return error.UdevError; - _ = c.udev.udev_monitor_filter_add_match_subsystem_devtype( - monitor, - "backlight", - null, - ); - _ = c.udev.udev_monitor_enable_receiving(monitor); - const ufd = c.udev.udev_monitor_get_fd(monitor); + const context = try udev.Udev.new(); + const monitor = try udev.Monitor.newFromNetlink(context, "udev"); + try monitor.filterAddMatchSubsystemDevType("backlight", null); + try monitor.enableReceiving(); + const ufd = try monitor.getFd(); return Loop{ .state = state, @@ -79,7 +74,7 @@ pub const Loop = struct { .revents = 0, }, }, - .monitor= monitor.?, + .monitor = monitor, }; } @@ -134,7 +129,7 @@ pub const Loop = struct { // udev if (self.fds[4].revents & os.POLL.IN != 0) { - _ = c.udev.udev_monitor_receive_device(self.monitor); + _ = try self.monitor.receiveDevice(); self.renderAllSurfaces(render.renderModules); } } diff --git a/src/modules.zig b/src/modules.zig @@ -5,7 +5,8 @@ const io = std.io; const mem = std.mem; const os = std.os; -const c = @import("c.zig"); +const udev = @import("udev"); + const State = @import("main.zig").State; const StringWriter = std.ArrayList(u8).Writer; @@ -128,7 +129,7 @@ pub const Battery = struct { pub const Backlight = struct { state: *State, - udev: *c.udev.udev, + context: *udev.Udev, devices: DeviceList, const Device = struct { @@ -139,16 +140,15 @@ pub const Backlight = struct { const DeviceList = std.ArrayList(Device); pub fn init(state: *State) !Backlight { - const udev = c.udev.udev_new(); - if (udev == null) return error.UdevError; + const context = try udev.Udev.new(); var devices = DeviceList.init(state.allocator); - try updateDevices(state.allocator, udev.?, &devices); + try updateDevices(state.allocator, context, &devices); if (devices.items.len == 0) return error.NoDevicesFound; return Backlight{ .state = state, - .udev = udev.?, + .context = context, .devices = devices, }; } @@ -160,7 +160,7 @@ pub const Backlight = struct { pub fn print(self_opaque: *anyopaque, writer: StringWriter) !void { const self = Module.cast(Backlight)(self_opaque); - try updateDevices(self.state.allocator, self.udev, &self.devices); + try updateDevices(self.state.allocator, self.context, &self.devices); const device = self.devices.items[0]; var percent = @intToFloat(f64, device.value) * 100.0; percent /= @intToFloat(f64, device.max); @@ -171,42 +171,31 @@ pub const Backlight = struct { fn updateDevices( allocator: mem.Allocator, - udev: *c.udev.udev, + context: *udev.Udev, devices: *DeviceList, ) !void { - const enumerate = c.udev.udev_enumerate_new(udev); - _ = c.udev.udev_enumerate_add_match_subsystem(enumerate, "backlight"); - _ = c.udev.udev_enumerate_scan_devices(enumerate); - const entries = c.udev.udev_enumerate_get_list_entry(enumerate); - - var entry = entries; - while (entry != null) { - const path = c.udev.udev_list_entry_get_name(entry); - const device = c.udev.udev_device_new_from_syspath(udev, path); - try updateOrAppend(allocator, devices, device.?); - - entry = c.udev.udev_list_entry_get_next(entries); + const enumerate = try udev.Enumerate.new(context); + try enumerate.addMatchSubsystem("backlight"); + try enumerate.scanDevices(); + const entries = enumerate.getListEntry(); + + var maybe_entry = entries; + while (maybe_entry) |entry| { + const path = entry.getName(); + const device = try udev.Device.newFromSyspath(context, path); + try updateOrAppend(allocator, devices, device); + maybe_entry = entry.getNext(); } } fn updateOrAppend( allocator: mem.Allocator, devices: *DeviceList, - dev: *c.udev.udev_device, + dev: *udev.Device, ) !void { - const value_c = c.udev.udev_device_get_sysattr_value( - dev, - "actual_brightness", - ); - const max_c = c.udev.udev_device_get_sysattr_value( - dev, - "max_brightness", - ); - const name_c = c.udev.udev_device_get_sysname(dev); - - const value = mem.span(value_c); - const max = mem.span(max_c); - const name = mem.span(name_c); + const value = try dev.getSysattrValue("actual_brightness"); + const max = try dev.getSysattrValue("max_brightness"); + const name = try dev.getSysname(); const device = blk: { for (devices.items) |*device| {