From e66fbb225b31aa958b565fa75a40d9f54824224d Mon Sep 17 00:00:00 2001 From: LeRoyce Pearson Date: Thu, 10 Aug 2023 19:43:49 -0600 Subject: [PATCH] Add IdPool helper --- examples/01_client_connect.zig | 25 +++++++++++++------------ src/main.zig | 18 ++++++++++++++++++ 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/examples/01_client_connect.zig b/examples/01_client_connect.zig index ffb650b..8d96c99 100644 --- a/examples/01_client_connect.zig +++ b/examples/01_client_connect.zig @@ -12,8 +12,11 @@ pub fn main() !void { const socket = try std.net.connectUnixSocket(display_path); defer socket.close(); + // Create an id pool to allocate ids for us + var id_pool = wayland.IdPool{}; + // reserve an object id for the registry - const registry_id = 2; + const registry_id = id_pool.create(); { var buffer: [5]u32 = undefined; const message = try wayland.serialize(wayland.core.Display.Request, &buffer, 1, .{ .get_registry = .{ .registry = registry_id } }); @@ -21,16 +24,16 @@ pub fn main() !void { } // create a sync callback so we know when the registry is done listing extensions - const registry_done_id = 3; + const registry_done_id = id_pool.create(); { var buffer: [5]u32 = undefined; const message = try wayland.serialize(wayland.core.Display.Request, &buffer, 1, .{ .sync = .{ .callback = registry_done_id } }); try socket.writeAll(std.mem.sliceAsBytes(message)); } - var shm_id: u32 = 4; - var compositor_id: u32 = 5; - var xdg_wm_base_id: u32 = 6; + var shm_id: u32 = id_pool.create(); + var compositor_id: u32 = id_pool.create(); + var xdg_wm_base_id: u32 = id_pool.create(); var message_buffer = std.ArrayList(u32).init(gpa); defer message_buffer.deinit(); @@ -100,7 +103,7 @@ pub fn main() !void { } } - const surface_id = 7; + const surface_id = id_pool.create(); { var buffer: [10]u32 = undefined; const message = try wayland.serialize( @@ -114,7 +117,7 @@ pub fn main() !void { try socket.writeAll(std.mem.sliceAsBytes(message)); } - const xdg_surface_id = 8; + const xdg_surface_id = id_pool.create(); { var buffer: [10]u32 = undefined; const message = try wayland.serialize( @@ -129,7 +132,7 @@ pub fn main() !void { try socket.writeAll(std.mem.sliceAsBytes(message)); } - const xdg_toplevel_id = 9; + const xdg_toplevel_id = id_pool.create(); { var buffer: [10]u32 = undefined; const message = try wayland.serialize( @@ -205,7 +208,7 @@ pub fn main() !void { const event = try wayland.deserialize(wayland.core.Display.Event, header, message_buffer.items); switch (event) { .@"error" => |err| std.debug.print("<- error({}): {} {s}\n", .{ err.object_id, err.code, err.message }), - .delete_id => |id| std.debug.print("<- delete_id {}\n", .{id.name}), + .delete_id => |id| id_pool.destroy(id.name), } } else { std.debug.print("{} {x} \"{}\"\n", .{ header.object_id, header.size_and_opcode.opcode, std.zig.fmtEscapes(std.mem.sliceAsBytes(message_buffer.items)) }); @@ -379,9 +382,7 @@ pub fn main() !void { const event = try wayland.deserialize(wayland.core.Display.Event, header, message_buffer.items); switch (event) { .@"error" => |err| std.debug.print("<- error({}): {} {s}\n", .{ err.object_id, err.code, err.message }), - .delete_id => { - // TODO: add id to list of free ids - }, + .delete_id => |id| id_pool.destroy(id.name), } } else { std.debug.print("{} {x} \"{}\"\n", .{ header.object_id, header.size_and_opcode.opcode, std.zig.fmtEscapes(std.mem.sliceAsBytes(message_buffer.items)) }); diff --git a/src/main.zig b/src/main.zig index 663dc27..7878518 100644 --- a/src/main.zig +++ b/src/main.zig @@ -322,3 +322,21 @@ test "serialize Registry.Event.Global" { serialized, ); } + +pub const IdPool = struct { + next_id: u32 = 2, + free_ids: std.BoundedArray(u32, 1024) = .{}, + + pub fn create(this: *@This()) u32 { + if (this.free_ids.popOrNull()) |id| { + return id; + } + + defer this.next_id += 1; + return this.next_id; + } + + pub fn destroy(this: *@This(), id: u32) void { + this.free_ids.append(id) catch {}; + } +};