lib/wayland/src/protocol/bootstrap/registry.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const protocol = @import("../root.zig");
2
3 const core = protocol.core.wl_registry;
4
5 pub const Bind = struct {
6 name: u32,
7 interface: []const u8,
8 version: u32,
9 id: protocol.value.NewId,
10
11 pub fn encode(self: Bind, encoder: *protocol.value.Encoder) !protocol.value.Encoded {
12 encoder.reset();
13 errdefer encoder.reset();
14 try encoder.unsigned(self.name);
15 try encoder.dynamicNewId(self.interface, self.version, self.id);
16 return encoder.finish(&core.requests.bind);
17 }
18 };
19
20 pub const Global = struct {
21 name: u32,
22 interface: []const u8,
23 version: u32,
24 };
25
26 pub const GlobalRemove = struct {
27 name: u32,
28 };
29
30 pub const Event = union(enum) {
31 global: Global,
32 global_remove: GlobalRemove,
33 };
34
35 pub fn decodeEvent(
36 opcode: u16,
37 payload: []const u8,
38 descriptors: []const @import("sys").fd.Descriptor,
39 ) !Event {
40 const metadata = core.metadata.event(opcode) orelse return error.UnknownOpcode;
41 var decoder = try protocol.value.Decoder.init(metadata, payload, descriptors);
42 const event: Event = switch (opcode) {
43 core.events.global.opcode => .{ .global = .{
44 .name = try decoder.unsigned(),
45 .interface = try decoder.string(),
46 .version = try decoder.unsigned(),
47 } },
48 core.events.global_remove.opcode => .{ .global_remove = .{
49 .name = try decoder.unsigned(),
50 } },
51 else => unreachable,
52 };
53 try decoder.finish();
54 return event;
55 }
56
57 test "registry bind expands its dynamic new_id from XML wire meaning" {
58 const std = @import("std");
59
60 var encoder = try protocol.value.Encoder.init(
61 std.testing.allocator,
62 protocol.value.default_encoder_capacity,
63 );
64 defer encoder.deinit();
65 const encoded = try (Bind{
66 .name = 7,
67 .interface = "wl_compositor",
68 .version = 6,
69 .id = try .init(4),
70 }).encode(&encoder);
71 try std.testing.expectEqualStrings("usun", encoded.metadata.signature);
72 var decoder = try protocol.value.Decoder.init(encoded.metadata, encoded.payload, encoded.descriptors);
73 try std.testing.expectEqual(@as(u32, 7), try decoder.unsigned());
74 const created = try decoder.dynamicNewId();
75 try std.testing.expectEqualStrings("wl_compositor", created.interface);
76 try std.testing.expectEqual(@as(u32, 6), created.version);
77 try std.testing.expectEqual(@as(u32, 4), created.id.raw);
78 try decoder.finish();
79 }
80
81 test "registry global event decodes borrowed protocol text" {
82 const std = @import("std");
83
84 var encoder = try protocol.value.Encoder.init(
85 std.testing.allocator,
86 protocol.value.default_encoder_capacity,
87 );
88 defer encoder.deinit();
89 try encoder.unsigned(11);
90 try encoder.string("wl_seat");
91 try encoder.unsigned(9);
92 const encoded = try encoder.finish(&core.events.global);
93 const event = try decodeEvent(encoded.opcode(), encoded.payload, encoded.descriptors);
94 try std.testing.expectEqual(@as(u32, 11), event.global.name);
95 try std.testing.expectEqualStrings("wl_seat", event.global.interface);
96 try std.testing.expectEqual(@as(u32, 9), event.global.version);
97 }