diff --git a/gfx/common/win32_common.c b/gfx/common/win32_common.c index 3f375a85cb..2208fd8118 100644 --- a/gfx/common/win32_common.c +++ b/gfx/common/win32_common.c @@ -965,10 +965,22 @@ static LRESULT CALLBACK wnd_proc_common_internal(HWND hwnd, * DirectInput is not available */ switch (keysym) { - /* Mod handling done in winraw_callback */ + /* Mod & Keypad handling done in winraw_callback */ case VK_SHIFT: case VK_CONTROL: case VK_MENU: + case VK_INSERT: + case VK_DELETE: + case VK_HOME: + case VK_END: + case VK_PRIOR: + case VK_NEXT: + case VK_UP: + case VK_DOWN: + case VK_LEFT: + case VK_RIGHT: + case VK_CLEAR: + case VK_RETURN: return 0; } diff --git a/input/drivers/winraw_input.c b/input/drivers/winraw_input.c index 34502711ea..8c8da7c216 100644 --- a/input/drivers/winraw_input.c +++ b/input/drivers/winraw_input.c @@ -413,47 +413,87 @@ static void winraw_update_mouse_state(winraw_input_t *wr, static void winraw_keyboard_mods(RAWINPUT *ri) { - unsigned keycode = 0; - unsigned flags = ri->data.keyboard.Flags; + unsigned flags = ri->data.keyboard.Flags; switch (ri->data.keyboard.MakeCode) { /* Left Control + Right Control */ case 29: - keycode = input_keymaps_translate_keysym_to_rk( - (flags & RI_KEY_E0) ? VK_RCONTROL : VK_LCONTROL); - input_keyboard_event(flags & RI_KEY_BREAK ? 0 : 1, keycode, + input_keyboard_event( + (flags & RI_KEY_BREAK) ? 0 : 1, + input_keymaps_translate_keysym_to_rk( + (flags & RI_KEY_E0) ? VK_RCONTROL : VK_LCONTROL), 0, RETROKMOD_CTRL, RETRO_DEVICE_KEYBOARD); break; /* Left Shift */ case 42: - keycode = input_keymaps_translate_keysym_to_rk(VK_LSHIFT); - input_keyboard_event(flags & RI_KEY_BREAK ? 0 : 1, keycode, + input_keyboard_event( + (flags & RI_KEY_BREAK) ? 0 : 1, + input_keymaps_translate_keysym_to_rk(VK_LSHIFT), 0, RETROKMOD_SHIFT, RETRO_DEVICE_KEYBOARD); break; /* Right Shift */ case 54: - keycode = input_keymaps_translate_keysym_to_rk(VK_RSHIFT); - input_keyboard_event(flags & RI_KEY_BREAK ? 0 : 1, keycode, + input_keyboard_event( + (flags & RI_KEY_BREAK) ? 0 : 1, + input_keymaps_translate_keysym_to_rk(VK_RSHIFT), 0, RETROKMOD_SHIFT, RETRO_DEVICE_KEYBOARD); break; /* Left Alt + Right Alt */ case 56: - keycode = input_keymaps_translate_keysym_to_rk( - (flags & RI_KEY_E0) ? VK_RMENU : VK_LMENU); - input_keyboard_event(flags & RI_KEY_BREAK ? 0 : 1, keycode, + input_keyboard_event( + (flags & RI_KEY_BREAK) ? 0 : 1, + input_keymaps_translate_keysym_to_rk( + (flags & RI_KEY_E0) ? VK_RMENU : VK_LMENU), 0, RETROKMOD_ALT, RETRO_DEVICE_KEYBOARD); break; } } +static void winraw_keyboard_keypad(unsigned *vkey, unsigned flags) +{ + bool event = true; + + /* Keypad key positions regardless of NumLock */ + switch (*vkey) + { + case VK_INSERT: *vkey = (flags & RI_KEY_E0) ? VK_INSERT : VK_NUMPAD0; break; + case VK_DELETE: *vkey = (flags & RI_KEY_E0) ? VK_DELETE : VK_DECIMAL; break; + + case VK_HOME: *vkey = (flags & RI_KEY_E0) ? VK_HOME : VK_NUMPAD7; break; + case VK_END: *vkey = (flags & RI_KEY_E0) ? VK_END : VK_NUMPAD1; break; + + case VK_PRIOR: *vkey = (flags & RI_KEY_E0) ? VK_PRIOR : VK_NUMPAD9; break; + case VK_NEXT: *vkey = (flags & RI_KEY_E0) ? VK_NEXT : VK_NUMPAD3; break; + + case VK_UP: *vkey = (flags & RI_KEY_E0) ? VK_UP : VK_NUMPAD8; break; + case VK_DOWN: *vkey = (flags & RI_KEY_E0) ? VK_DOWN : VK_NUMPAD2; break; + + case VK_LEFT: *vkey = (flags & RI_KEY_E0) ? VK_LEFT : VK_NUMPAD4; break; + case VK_RIGHT: *vkey = (flags & RI_KEY_E0) ? VK_RIGHT : VK_NUMPAD6; break; + + case VK_CLEAR: *vkey = (flags & RI_KEY_E0) ? VK_CLEAR : VK_NUMPAD5; break; + case VK_RETURN: *vkey = (flags & RI_KEY_E0) ? 0xE0 : VK_RETURN; break; + + default: + event = false; + break; + } + + if (event) + input_keyboard_event(flags & RI_KEY_BREAK ? 0 : 1, + input_keymaps_translate_keysym_to_rk(*vkey), + 0, 0, RETRO_DEVICE_KEYBOARD); +} + static LRESULT CALLBACK winraw_callback( HWND wnd, UINT msg, WPARAM wpar, LPARAM lpar) { unsigned i; + unsigned vkey, flags; static uint8_t data[1024]; RAWINPUT *ri = (RAWINPUT*)data; UINT size = sizeof(data); @@ -475,6 +515,14 @@ static LRESULT CALLBACK winraw_callback( switch (ri->header.dwType) { case RIM_TYPEKEYBOARD: + vkey = ri->data.keyboard.VKey; + flags = ri->data.keyboard.Flags; + + /* Stop sending forced Left Shift when NumLock is enabled + * (VKey 0xFF does not actually exist) */ + if (vkey == 0xFF) + break; + /* following keys are not handled by windows raw input api */ wr->keyboard.keys[VK_LCONTROL] = GetAsyncKeyState(VK_LCONTROL) >> 1 ? 1 : 0; wr->keyboard.keys[VK_RCONTROL] = GetAsyncKeyState(VK_RCONTROL) >> 1 ? 1 : 0; @@ -484,11 +532,19 @@ static LRESULT CALLBACK winraw_callback( wr->keyboard.keys[VK_RSHIFT] = GetAsyncKeyState(VK_RSHIFT) >> 1 ? 1 : 0; winraw_keyboard_mods(ri); + winraw_keyboard_keypad(&vkey, flags); - if (ri->data.keyboard.Message == WM_KEYDOWN) - wr->keyboard.keys[ri->data.keyboard.VKey] = 1; - else if (ri->data.keyboard.Message == WM_KEYUP) - wr->keyboard.keys[ri->data.keyboard.VKey] = 0; + switch (ri->data.keyboard.Message) + { + case WM_KEYDOWN: + case WM_SYSKEYDOWN: + wr->keyboard.keys[vkey] = 1; + break; + case WM_KEYUP: + case WM_SYSKEYUP: + wr->keyboard.keys[vkey] = 0; + break; + } break; case RIM_TYPEMOUSE: for (i = 0; i < wr->mouse_cnt; ++i) diff --git a/input/input_keymaps.c b/input/input_keymaps.c index 82677f34f5..26d50b9f0d 100644 --- a/input/input_keymaps.c +++ b/input/input_keymaps.c @@ -1795,7 +1795,7 @@ const struct rarch_key_map rarch_key_map_winraw[] = { { VK_RCONTROL, RETROK_RCTRL }, { VK_LMENU, RETROK_LALT }, { VK_RMENU, RETROK_RALT }, - { VK_RETURN, RETROK_KP_ENTER }, + { 0xE0, RETROK_KP_ENTER }, { VK_CAPITAL, RETROK_CAPSLOCK }, { VK_OEM_1, RETROK_SEMICOLON }, { VK_OEM_PLUS, RETROK_EQUALS }, @@ -1808,6 +1808,7 @@ const struct rarch_key_map rarch_key_map_winraw[] = { { VK_OEM_5, RETROK_BACKSLASH }, { VK_OEM_6, RETROK_RIGHTBRACKET }, { VK_OEM_7, RETROK_QUOTE }, + { VK_OEM_102, RETROK_OEM_102 }, { 0, RETROK_UNKNOWN } }; #endif