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 }