diff --git a/src/win32/gui.zig b/src/win32/gui.zig index 21e32c5..e031626 100644 --- a/src/win32/gui.zig +++ b/src/win32/gui.zig @@ -675,17 +675,16 @@ fn sendKey( // // TODO: Fn? // tn::ModifierFlags mod_flags = (tn::ModifierFlags)mod_flags_u32; - const winkey = WinKey{ - .vk = @intCast(0xffff & wparam), - .extended = 0 != (lparam & 0x1000000), - }; - const event = switch (kind) { .press => input.event.press, .release => input.event.release, }; - if (translateVirtualKeyCode(winkey.vk)) |key| { + const winkey = WinKey{ + .vk = @intCast(0xffff & wparam), + .extended = 0 != (lparam & 0x1000000), + }; + if (winkey.toFlow(mods.shift)) |key| { state.pid.send(.{ "RDR", "I", @@ -735,99 +734,116 @@ fn sendKey( } } -fn translateVirtualKeyCode(vk: u16) ?u16 { - return switch (vk) { - 0x08 => input.key.backspace, - 0x09 => input.key.tab, - 0x0D => input.key.enter, - 0x13 => input.key.pause, - 0x14 => input.key.caps_lock, - 0x1B => input.key.escape, - 0x20 => input.key.space, - 0x21 => input.key.page_up, - 0x22 => input.key.page_down, - 0x23 => input.key.end, - 0x24 => input.key.home, - 0x25 => input.key.left, - 0x26 => input.key.up, - 0x27 => input.key.right, - 0x28 => input.key.down, - 0x2c => input.key.print_screen, - 0x2d => input.key.insert, - 0x2e => input.key.delete, - 0x5b => input.key.left_meta, - 0x5c => input.key.right_meta, - 0x60 => input.key.kp_0, - 0x61 => input.key.kp_1, - 0x62 => input.key.kp_2, - 0x63 => input.key.kp_3, - 0x64 => input.key.kp_4, - 0x65 => input.key.kp_5, - 0x66 => input.key.kp_6, - 0x67 => input.key.kp_7, - 0x68 => input.key.kp_8, - 0x69 => input.key.kp_9, - 0x6a => input.key.kp_multiply, - 0x6b => input.key.kp_add, - 0x6c => input.key.kp_separator, - 0x6d => input.key.kp_subtract, - 0x6e => input.key.kp_decimal, - 0x6f => input.key.kp_divide, - 0x70 => input.key.f1, - 0x71 => input.key.f2, - 0x72 => input.key.f3, - 0x73 => input.key.f4, - 0x74 => input.key.f5, - 0x75 => input.key.f6, - 0x76 => input.key.f8, - 0x77 => input.key.f8, - 0x78 => input.key.f9, - 0x79 => input.key.f10, - 0x7a => input.key.f11, - 0x7b => input.key.f12, - 0x7c => input.key.f13, - 0x7d => input.key.f14, - 0x7e => input.key.f15, - 0x7f => input.key.f16, - 0x80 => input.key.f17, - 0x81 => input.key.f18, - 0x82 => input.key.f19, - 0x83 => input.key.f20, - 0x84 => input.key.f21, - 0x85 => input.key.f22, - 0x86 => input.key.f23, - 0x87 => input.key.f24, - 0x90 => input.key.num_lock, - 0x91 => input.key.scroll_lock, - 0xa0 => input.key.left_shift, - 0x10 => input.key.left_shift, - 0xa1 => input.key.right_shift, - 0xa2 => input.key.left_control, - 0x11 => input.key.left_control, - 0xa3 => input.key.right_control, - 0xa4 => input.key.left_alt, - 0x12 => input.key.left_alt, - 0xa5 => input.key.right_alt, - 0xad => input.key.mute_volume, - 0xae => input.key.lower_volume, - 0xaf => input.key.raise_volume, - 0xb0 => input.key.media_track_next, - 0xb1 => input.key.media_track_previous, - 0xb2 => input.key.media_stop, - 0xb3 => input.key.media_play_pause, - else => null, - }; -} - const WinKey = struct { vk: u16, extended: bool, pub fn eql(self: WinKey, other: WinKey) bool { return self.vk == other.vk and self.extended == other.extended; } - pub fn toFlow(self: WinKey) u32 { - _ = self; - @panic("todo"); + pub fn toFlow(self: WinKey, shift_down: bool) ?u16 { + if (self.extended) return switch (self.vk) { + @intFromEnum(win32.VK_RETURN) => input.key.kp_enter, + @intFromEnum(win32.VK_PRIOR) => input.key.page_up, + @intFromEnum(win32.VK_NEXT) => input.key.page_down, + @intFromEnum(win32.VK_END) => input.key.end, + @intFromEnum(win32.VK_HOME) => input.key.home, + @intFromEnum(win32.VK_LEFT) => input.key.left, + @intFromEnum(win32.VK_UP) => input.key.up, + @intFromEnum(win32.VK_RIGHT) => input.key.right, + @intFromEnum(win32.VK_DOWN) => input.key.down, + @intFromEnum(win32.VK_INSERT) => input.key.insert, + @intFromEnum(win32.VK_DELETE) => input.key.delete, + + @intFromEnum(win32.VK_DIVIDE) => input.key.kp_divide, + + else => null, + }; + return switch (self.vk) { + @intFromEnum(win32.VK_BACK) => input.key.backspace, + @intFromEnum(win32.VK_TAB) => input.key.tab, + @intFromEnum(win32.VK_RETURN) => input.key.enter, + @intFromEnum(win32.VK_PAUSE) => input.key.pause, + @intFromEnum(win32.VK_CAPITAL) => input.key.caps_lock, + @intFromEnum(win32.VK_ESCAPE) => input.key.escape, + @intFromEnum(win32.VK_SPACE) => input.key.space, + @intFromEnum(win32.VK_PRIOR) => input.key.kp_page_up, + @intFromEnum(win32.VK_NEXT) => input.key.kp_page_down, + @intFromEnum(win32.VK_END) => input.key.kp_end, + @intFromEnum(win32.VK_HOME) => input.key.kp_home, + @intFromEnum(win32.VK_LEFT) => input.key.kp_left, + @intFromEnum(win32.VK_UP) => input.key.kp_up, + @intFromEnum(win32.VK_RIGHT) => input.key.kp_right, + @intFromEnum(win32.VK_DOWN) => input.key.kp_down, + @intFromEnum(win32.VK_SNAPSHOT) => input.key.print_screen, + @intFromEnum(win32.VK_INSERT) => input.key.kp_insert, + @intFromEnum(win32.VK_DELETE) => input.key.kp_delete, + + '0'...'9' => |ascii| ascii, + 'A'...'Z' => |ascii| if (shift_down) ascii else ascii + ('a' - 'A'), + + @intFromEnum(win32.VK_LWIN) => input.key.left_meta, + @intFromEnum(win32.VK_RWIN) => input.key.right_meta, + @intFromEnum(win32.VK_NUMPAD0) => input.key.kp_0, + @intFromEnum(win32.VK_NUMPAD1) => input.key.kp_1, + @intFromEnum(win32.VK_NUMPAD2) => input.key.kp_2, + @intFromEnum(win32.VK_NUMPAD3) => input.key.kp_3, + @intFromEnum(win32.VK_NUMPAD4) => input.key.kp_4, + @intFromEnum(win32.VK_NUMPAD5) => input.key.kp_5, + @intFromEnum(win32.VK_NUMPAD6) => input.key.kp_6, + @intFromEnum(win32.VK_NUMPAD7) => input.key.kp_7, + @intFromEnum(win32.VK_NUMPAD8) => input.key.kp_8, + @intFromEnum(win32.VK_NUMPAD9) => input.key.kp_9, + @intFromEnum(win32.VK_MULTIPLY) => input.key.kp_multiply, + @intFromEnum(win32.VK_ADD) => input.key.kp_add, + @intFromEnum(win32.VK_SEPARATOR) => input.key.kp_separator, + @intFromEnum(win32.VK_SUBTRACT) => input.key.kp_subtract, + @intFromEnum(win32.VK_DECIMAL) => input.key.kp_decimal, + // odd, for some reason the divide key is considered extended? + //@intFromEnum(win32.VK_DIVIDE) => input.key.kp_divide, + @intFromEnum(win32.VK_F1) => input.key.f1, + @intFromEnum(win32.VK_F2) => input.key.f2, + @intFromEnum(win32.VK_F3) => input.key.f3, + @intFromEnum(win32.VK_F4) => input.key.f4, + @intFromEnum(win32.VK_F5) => input.key.f5, + @intFromEnum(win32.VK_F6) => input.key.f6, + @intFromEnum(win32.VK_F7) => input.key.f8, + @intFromEnum(win32.VK_F8) => input.key.f8, + @intFromEnum(win32.VK_F9) => input.key.f9, + @intFromEnum(win32.VK_F10) => input.key.f10, + @intFromEnum(win32.VK_F11) => input.key.f11, + @intFromEnum(win32.VK_F12) => input.key.f12, + @intFromEnum(win32.VK_F13) => input.key.f13, + @intFromEnum(win32.VK_F14) => input.key.f14, + @intFromEnum(win32.VK_F15) => input.key.f15, + @intFromEnum(win32.VK_F16) => input.key.f16, + @intFromEnum(win32.VK_F17) => input.key.f17, + @intFromEnum(win32.VK_F18) => input.key.f18, + @intFromEnum(win32.VK_F19) => input.key.f19, + @intFromEnum(win32.VK_F20) => input.key.f20, + @intFromEnum(win32.VK_F21) => input.key.f21, + @intFromEnum(win32.VK_F22) => input.key.f22, + @intFromEnum(win32.VK_F23) => input.key.f23, + @intFromEnum(win32.VK_F24) => input.key.f24, + @intFromEnum(win32.VK_NUMLOCK) => input.key.num_lock, + @intFromEnum(win32.VK_SCROLL) => input.key.scroll_lock, + @intFromEnum(win32.VK_LSHIFT) => input.key.left_shift, + //@intFromEnum(win32.VK_10) => input.key.left_shift, + @intFromEnum(win32.VK_RSHIFT) => input.key.right_shift, + @intFromEnum(win32.VK_LCONTROL) => input.key.left_control, + //@intFromEnum(win32.VK_11) => input.key.left_control, + @intFromEnum(win32.VK_RCONTROL) => input.key.right_control, + @intFromEnum(win32.VK_LMENU) => input.key.left_alt, + //@intFromEnum(win32.VK_12) => input.key.left_alt, + @intFromEnum(win32.VK_RMENU) => input.key.right_alt, + @intFromEnum(win32.VK_VOLUME_MUTE) => input.key.mute_volume, + @intFromEnum(win32.VK_VOLUME_DOWN) => input.key.lower_volume, + @intFromEnum(win32.VK_VOLUME_UP) => input.key.raise_volume, + @intFromEnum(win32.VK_MEDIA_NEXT_TRACK) => input.key.media_track_next, + @intFromEnum(win32.VK_MEDIA_PREV_TRACK) => input.key.media_track_previous, + @intFromEnum(win32.VK_MEDIA_STOP) => input.key.media_stop, + @intFromEnum(win32.VK_MEDIA_PLAY_PAUSE) => input.key.media_play_pause, + else => null, + }; } }; @@ -877,11 +893,11 @@ fn WndProc( sendMouseWheel(hwnd, wparam, lparam); return 0; }, - win32.WM_KEYDOWN => { + win32.WM_KEYDOWN, win32.WM_SYSKEYDOWN => { sendKey(hwnd, .press, wparam, lparam); return 0; }, - win32.WM_KEYUP => { + win32.WM_KEYUP, win32.WM_SYSKEYUP => { sendKey(hwnd, .release, wparam, lparam); return 0; },