aboutsummaryrefslogtreecommitdiff
path: root/src/wl/display.zig
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2025-08-27 20:21:34 +0200
committerNathan Reiner <nathan@nathanreiner.xyz>2025-08-27 20:21:34 +0200
commitf0f2124949056e3008416dcd089766a2ef69a08b (patch)
tree7e8f674fda0c5af7f30671e9dd088f7ec7d35e5e /src/wl/display.zig
parent8a7392dea729d3ed49a8bf8eee25906c4fd616ac (diff)
add wl.buffer and wl.surface
Diffstat (limited to 'src/wl/display.zig')
-rw-r--r--src/wl/display.zig14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/wl/display.zig b/src/wl/display.zig
index c9e2e6e..2a7b94c 100644
--- a/src/wl/display.zig
+++ b/src/wl/display.zig
@@ -82,7 +82,7 @@ pub fn request(self: *Self, object: anytype, args: @TypeOf(object.*).Request) !v
inline for (@typeInfo(tag_type).@"enum".fields) |f| {
if (f.value == opcode) {
- const data = @field(args, f.name);
+ const data = if (@FieldType(@TypeOf(args), f.name) == void) .{} else @field(args, f.name);
const id: u32 = @truncate(object.handle);
var size: u32 = 8;
@@ -103,6 +103,7 @@ pub fn request(self: *Self, object: anytype, args: @TypeOf(object.*).Request) !v
const padding_size: usize = padding_len(ptr.child, value.len);
size += @intCast(@sizeOf(u32) + (value.len * @sizeOf(ptr.child)) + padding_size);
} else @compileError(std.fmt.comptimePrint("size: unsupported type {}", .{t})),
+ .@"enum" => size += @sizeOf(u32),
else => @compileError(std.fmt.comptimePrint("size: unsupported type {}", .{t})),
},
}
@@ -150,6 +151,7 @@ pub fn request(self: *Self, object: anytype, args: @TypeOf(object.*).Request) !v
_ = try self.stream.writeAll(std.mem.asBytes(&@as(u8, 0)));
}
} else @compileError(std.fmt.comptimePrint("size: unsupported type {}", .{t})),
+ .@"enum" => _ = try self.stream.writeAll(std.mem.asBytes(&@as(u32, @intFromEnum(value)))),
else => @compileError(std.fmt.comptimePrint("size: unsupported type {}", .{t})),
},
}
@@ -239,6 +241,7 @@ test "request" {
req3: struct { []const u8 },
req4: struct { []const u16 },
req5: struct { wayland.types.Fd },
+ req6: void,
};
pub const Events = wayland.EventSet(@This(), .{});
@@ -271,6 +274,7 @@ test "request" {
try displ.request(&sample, .{ .req3 = .{"abcd"} });
try displ.request(&sample, .{ .req4 = .{&[_]u16{ 1, 32, 4, 5, 5 }} });
try displ.request(&sample, .{ .req5 = .{ .{ .fd = displ.stream.handle } } });
+ try displ.request(&sample, .{ .req6 = {} });
}
const conn = try server.accept();
@@ -330,6 +334,14 @@ test "request" {
test_buffer[0..size],
);
+ size = try file.readAll(test_buffer[0..8]);
+ try std.testing.expectEqualSlices(
+ u8,
+ &(std.mem.toBytes(@as(u32, 42)) ++
+ std.mem.toBytes(@as(u32, (8 << 16) | 5))),
+ test_buffer[0..size],
+ );
+
size = try file.readAll(test_buffer[0..]);
try std.testing.expectEqual(0, size);
}