win32 gui: key translation fixes

This commit is contained in:
Jonathan Marler 2025-01-04 12:01:41 -07:00
parent 67ca29f2c8
commit 38f7cbcaab

View file

@ -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;
},