const std = @import("std"); const input = @import("input.zig"); const windows = @cImport({ @cInclude("windows.h"); }); const stdin = windows.GetStdHandle(windows.STD_INPUT_HANDLE); const PlatformError = error{ReadInputCall}; pub fn ReadInput( out_buf: *[input.IO_BUF_SIZE]input.Record, n_out: *usize, str_buf: *[input.STR_BUF_SIZE]u8, n_str: *usize, ) !void { var buf: [input.IO_BUF_SIZE]windows.INPUT_RECORD = undefined; var n_buf: usize = 0; const success: bool = windows.ReadConsoleInputW( stdin, &buf, input.IO_BUF_SIZE, &n_buf, ); if (!success) return PlatformError.ReadInputCall; n_out.* = 0; for (buf, out_buf) |rec, *out_rec| {} } fn dispatch(win_rec: windows.INPUT_RECORD) bool { switch (win_rec.EventType) { windows.KEY_EVENT => blk: { out_rec.* = input.Record{ .scancode = rec.Event.KeyEvent.wVirtualScanCode, .data = rec.Event.KeyEvent.bKeyDown, .time = now, .is_down = rec.Event.KeyEvent.bKeyDown, }; if (rec.Event.KeyEvent.bKeyDown) n_str.* += ucs2ToUtf8(str_buf + n_out, rec.Event.KeyEvent.uChar.UnicodeChar); break :blk true; }, windows.WINDOW_BUFFER_SIZE_EVENT => false, else => false, } }