diff --git a/src/WindowManager.zig b/src/WindowManager.zig index e5af03e..a6e9cbc 100644 --- a/src/WindowManager.zig +++ b/src/WindowManager.zig @@ -34,6 +34,14 @@ pub fn deinit(wm: *WindowManager) void { } pub fn start(wm: *WindowManager) !void { + try wm.discoverScreens(); + try wm.registerWindows(); + + log.info("mimi is ready, listening for messages", .{}); + pumpMessages(); +} + +fn discoverScreens(wm: *WindowManager) !void { var monitors: std.ArrayList(Monitor) = .empty; defer monitors.deinit(wm.allocator); @@ -46,11 +54,13 @@ pub fn start(wm: *WindowManager) !void { return Error.NoMonitors; } - try wm.screens.ensureTotalCapacity(wm.allocator, monitors.items.len); + try wm.screens.ensureTotalCapacityPrecise(wm.allocator, monitors.items.len); for (monitors.items) |monitor| { wm.screens.appendAssumeCapacity(.init(monitor)); } +} +fn registerWindows(wm: *WindowManager) !void { var windows: std.ArrayList(Window) = .empty; defer windows.deinit(wm.allocator); @@ -59,13 +69,15 @@ pub fn start(wm: *WindowManager) !void { log.info("found {d} open window(s)", .{windows.items.len}); for (windows.items) |window| { - const monitor: Monitor = window.monitor(); - const screen: *Screen = wm.findScreen(monitor).?; + const screen: *Screen = wm.findScreen(window.monitor()) orelse { + log.debug("window on unknown monitor, skipping", .{}); + continue; + }; try screen.windows.append(wm.allocator, window); } +} - log.info("mimi is ready, listening for messages", .{}); - +fn pumpMessages() void { var msg: win32.ui.windows_and_messaging.MSG = undefined; while (win32.ui.windows_and_messaging.GetMessageW(&msg, null, 0, 0) != 0) { _ = win32.ui.windows_and_messaging.TranslateMessage(&msg);