From 2cba844ceed99695fe091477a9edfc2804c7c221 Mon Sep 17 00:00:00 2001 From: pleasesendmeloadsofvegetables Date: Sat, 9 May 2026 11:20:56 -0700 Subject: [PATCH] feat: add Screen type --- src/KeyboardHook.zig | 2 +- src/Screen.zig | 17 +++++++++++++++++ src/WindowHook.zig | 9 +++++---- src/WindowManager.zig | 33 ++++++++++++++++++++++++--------- 4 files changed, 47 insertions(+), 14 deletions(-) create mode 100644 src/Screen.zig diff --git a/src/KeyboardHook.zig b/src/KeyboardHook.zig index 98394de..bd88063 100644 --- a/src/KeyboardHook.zig +++ b/src/KeyboardHook.zig @@ -33,7 +33,7 @@ fn keyboardProc( return win32.ui.windows_and_messaging.CallNextHookEx(null, code, wparam, lparam); } - if (wparam != win32.ui.windows_and_messaging.win32.ui.windows_and_messaging_KEYDOWN and wparam != win32.ui.windows_and_messaging.win32.ui.windows_and_messaging_SYSKEYDOWN) { + if (wparam != win32.ui.windows_and_messaging.WM_KEYDOWN and wparam != win32.ui.windows_and_messaging.WM_SYSKEYDOWN) { return win32.ui.windows_and_messaging.CallNextHookEx(null, code, wparam, lparam); } diff --git a/src/Screen.zig b/src/Screen.zig new file mode 100644 index 0000000..a1e440f --- /dev/null +++ b/src/Screen.zig @@ -0,0 +1,17 @@ +const Screen = @This(); + +windows: std.ArrayList(Window), +monitor: Monitor, + +pub fn init(monitor: Monitor) Screen { + return .{ .monitor = monitor, .windows = .empty }; +} + +pub fn deinit(screen: *Screen, allocator: std.mem.Allocator) void { + screen.windows.deinit(allocator); +} + +const Window = @import("Window.zig"); +const Monitor = @import("Monitor.zig"); + +const std = @import("std"); diff --git a/src/WindowHook.zig b/src/WindowHook.zig index 5f58131..4ac78a5 100644 --- a/src/WindowHook.zig +++ b/src/WindowHook.zig @@ -21,8 +21,7 @@ pub fn start() !WindowHook { &winEventProc, 0, 0, - win32.ui.windows_and_messaging.WINEVENT_OUTOFCONTEXT | - win32.ui.windows_and_messaging.WINEVENT_SKIPOWNPROCESS, + win32.ui.windows_and_messaging.WINEVENT_OUTOFCONTEXT | win32.ui.windows_and_messaging.WINEVENT_SKIPOWNPROCESS, ) orelse { log.err("couldn't hook events 0x{x}..0x{x}", .{ event.min, event.max }); for (window_hook.hooks[0..i]) |hook| { @@ -61,18 +60,20 @@ fn winEventProc( if (!window.shouldManage()) return; - wm.windows.append(wm.allocator, window) catch |e| { + const screen: *Screen = &wm.screens.items[0]; + screen.windows.append(wm.allocator, window) catch |e| { log.err("couldn't add window: {s}", .{@errorName(e)}); std.debug.panic("{s}", .{@errorName(e)}); }; - log.info("manageable window (now {d})", .{wm.windows.items.len}); + log.info("manageable window (now {d})", .{screen.windows.items.len}); } const wm = &@import("main.zig").wm; const log = std.log.scoped(.window_hook); +const Screen = @import("Screen.zig"); const Window = @import("Window.zig"); const win32 = @import("win32"); diff --git a/src/WindowManager.zig b/src/WindowManager.zig index c08b7a6..90f5818 100644 --- a/src/WindowManager.zig +++ b/src/WindowManager.zig @@ -3,8 +3,7 @@ const WindowManager = @This(); allocator: std.mem.Allocator, window_hook: WindowHook, keyboard_hook: KeyboardHook, -windows: std.ArrayList(Window) = .empty, -monitors: std.ArrayList(Monitor) = .empty, +screens: std.ArrayList(Screen) = .empty, pub fn init(allocator: std.mem.Allocator) !WindowManager { log.debug("getting the window manager ready", .{}); @@ -14,18 +13,32 @@ pub fn init(allocator: std.mem.Allocator) !WindowManager { pub fn deinit(wm: *WindowManager) void { wm.keyboard_hook.stop(); wm.window_hook.stop(); - wm.windows.deinit(wm.allocator); - wm.monitors.deinit(wm.allocator); + for (wm.screens.items) |*screen| screen.deinit(wm.allocator); + wm.screens.deinit(wm.allocator); } pub fn start(wm: *WindowManager) !void { - log.debug("looking for open windows", .{}); - try Window.enumerate(wm.allocator, &wm.windows); - log.info("found {d} window(s) to manage", .{wm.windows.items.len}); + // [TODO]: Check which monitor the window is on during statup, and assign it to that monitors `Screen`. + var monitors: std.ArrayList(Monitor) = .empty; + defer monitors.deinit(wm.allocator); log.debug("looking for monitors", .{}); - try Monitor.enumerate(wm.allocator, &wm.monitors); - log.info("found {d} monitor(s)", .{wm.monitors.items.len}); + try Monitor.enumerate(wm.allocator, &monitors); + log.info("found {d} monitor(s)", .{monitors.items.len}); + + try wm.screens.ensureTotalCapacity(wm.allocator, monitors.items.len); + for (monitors.items) |monitor| { + wm.screens.appendAssumeCapacity(.init(monitor)); + } + + log.debug("looking for open windows", .{}); + var windows: std.ArrayList(Window) = .empty; + defer windows.deinit(wm.allocator); + try Window.enumerate(wm.allocator, &windows); + 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); log.info("mimi is ready, listening for messages", .{}); @@ -40,6 +53,8 @@ const log = std.log.scoped(.window_manager); const KeyboardHook = @import("KeyboardHook.zig"); const WindowHook = @import("WindowHook.zig"); + +const Screen = @import("Screen.zig"); const Window = @import("Window.zig"); const Monitor = @import("Monitor.zig"); -- 2.51.2