commit cd7c193a78e94b769162bd7fc3f5a550a57edfbe
parent 0dda108b1b88baeb9ffe236c3239e5777d66a190
Author: Andrea Feletto <andrea@andreafeletto.com>
Date: Sun, 30 Jan 2022 01:38:46 +0100
use zig-udev bindings
Diffstat:
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| {