From d06865c19accea068478f95098365054e5c10133 Mon Sep 17 00:00:00 2001 From: pleasesendmeloadsofvegetables Date: Sat, 9 May 2026 11:49:16 -0700 Subject: [PATCH] refactor: Remove uses of append, and fix not stopping hooks on error --- src/Monitor.zig | 3 ++- src/Window.zig | 3 ++- src/WindowHook.zig | 3 ++- src/WindowManager.zig | 9 +++++++-- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/Monitor.zig b/src/Monitor.zig index 3978fae..f517209 100644 --- a/src/Monitor.zig +++ b/src/Monitor.zig @@ -35,10 +35,11 @@ fn monitorEnumProc( const monitor: Monitor = .{ .handle = hmonitor.? }; - ctx.list.append(ctx.allocator, monitor) catch |e| { + ctx.list.ensureUnusedCapacity(ctx.allocator, 1) catch |e| { ctx.err = e; return 0; }; + ctx.list.appendAssumeCapacity(monitor); log.debug("spotted monitor (now {d})", .{ctx.list.items.len}); diff --git a/src/Window.zig b/src/Window.zig index 074f0db..2d59542 100644 --- a/src/Window.zig +++ b/src/Window.zig @@ -30,10 +30,11 @@ fn enumWindowsProc( if (!window.shouldManage()) return 1; - ctx.list.append(ctx.allocator, window) catch |e| { + ctx.list.ensureUnusedCapacity(ctx.allocator, 1) catch |e| { ctx.err = e; return 0; }; + ctx.list.appendAssumeCapacity(window); log.debug("spotted window (now {d})", .{ctx.list.items.len}); diff --git a/src/WindowHook.zig b/src/WindowHook.zig index 4ac78a5..e245734 100644 --- a/src/WindowHook.zig +++ b/src/WindowHook.zig @@ -61,10 +61,11 @@ fn winEventProc( if (!window.shouldManage()) return; const screen: *Screen = &wm.screens.items[0]; - screen.windows.append(wm.allocator, window) catch |e| { + screen.windows.ensureUnusedCapacity(wm.allocator, 1) catch |e| { log.err("couldn't add window: {s}", .{@errorName(e)}); std.debug.panic("{s}", .{@errorName(e)}); }; + screen.windows.appendAssumeCapacity(window); log.info("manageable window (now {d})", .{screen.windows.items.len}); } diff --git a/src/WindowManager.zig b/src/WindowManager.zig index 90f5818..0e632fd 100644 --- a/src/WindowManager.zig +++ b/src/WindowManager.zig @@ -7,7 +7,11 @@ screens: std.ArrayList(Screen) = .empty, pub fn init(allocator: std.mem.Allocator) !WindowManager { log.debug("getting the window manager ready", .{}); - return .{ .allocator = allocator, .window_hook = try .start(), .keyboard_hook = try .start() }; + const window_hook: WindowHook = try .start(); + errdefer window_hook.stop(); + const keyboard_hook: KeyboardHook = try .start(); + errdefer keyboard_hook.stop(); + return .{ .allocator = allocator, .window_hook = window_hook, .keyboard_hook = keyboard_hook }; } pub fn deinit(wm: *WindowManager) void { @@ -38,7 +42,8 @@ pub fn start(wm: *WindowManager) !void { log.info("found {d} open window(s)", .{windows.items.len}); const first_screen: *Screen = &wm.screens.items[0]; - try first_screen.windows.appendSlice(wm.allocator, windows.items); + try first_screen.windows.ensureUnusedCapacity(wm.allocator, windows.items.len); + first_screen.windows.appendSliceAssumeCapacity(windows.items); log.info("mimi is ready, listening for messages", .{}); -- 2.51.2