From 639d367773609d4e44764243e3652b5193495ebe Mon Sep 17 00:00:00 2001 From: sonninnos <45124675+sonninnos@users.noreply.github.com> Date: Sat, 14 Jan 2023 07:46:24 +0200 Subject: [PATCH] (WIN32) Fix keyboard event characters (#14844) --- gfx/common/win32_common.c | 38 +++++++++++++++++++----------------- input/drivers/winraw_input.c | 24 ++++++++++++++++++----- 2 files changed, 39 insertions(+), 23 deletions(-) diff --git a/gfx/common/win32_common.c b/gfx/common/win32_common.c index 164e0302d5..e5d8ad4106 100644 --- a/gfx/common/win32_common.c +++ b/gfx/common/win32_common.c @@ -920,8 +920,8 @@ static LRESULT CALLBACK wnd_proc_common( /* Seems to be hard to synchronize * WM_CHAR and WM_KEYDOWN properly. */ - input_keyboard_event(true, RETROK_UNKNOWN, wparam, mod, - RETRO_DEVICE_KEYBOARD); + input_keyboard_event(true, RETROK_UNKNOWN, + wparam, mod, RETRO_DEVICE_KEYBOARD); } return TRUE; case WM_CLOSE: @@ -1002,15 +1002,15 @@ static LRESULT CALLBACK wnd_proc_common_internal(HWND hwnd, mod |= RETROKMOD_META; input_keyboard_event(keydown, keycode, - 0, mod, RETRO_DEVICE_KEYBOARD); + wparam, mod, RETRO_DEVICE_KEYBOARD); if (message != WM_SYSKEYDOWN) return 0; if ( - wparam == VK_F10 || - wparam == VK_MENU || - wparam == VK_RSHIFT + wparam == VK_F10 + || wparam == VK_MENU + || wparam == VK_RSHIFT ) return 0; } @@ -1047,11 +1047,11 @@ static LRESULT CALLBACK wnd_proc_common_internal(HWND hwnd, break; #ifdef HAVE_CLIP_WINDOW case WM_SETFOCUS: - if (input_state_get_ptr()->flags & INP_FLAG_GRAB_MOUSE_STATE) + if (input_state_get_ptr()->flags & INP_FLAG_GRAB_MOUSE_STATE) win32_clip_window(true); break; case WM_KILLFOCUS: - if (input_state_get_ptr()->flags & INP_FLAG_GRAB_MOUSE_STATE) + if (input_state_get_ptr()->flags & INP_FLAG_GRAB_MOUSE_STATE) win32_clip_window(false); break; #endif @@ -1086,8 +1086,10 @@ static LRESULT CALLBACK wnd_proc_winraw_common_internal(HWND hwnd, if (message != WM_SYSKEYDOWN) return 0; + /* keyboard_event in winraw_callback */ + if ( - wparam == VK_F10 + wparam == VK_F10 || wparam == VK_MENU || wparam == VK_RSHIFT ) @@ -1124,7 +1126,7 @@ static LRESULT CALLBACK wnd_proc_winraw_common_internal(HWND hwnd, break; case WM_SETFOCUS: #ifdef HAVE_CLIP_WINDOW - if (input_state_get_ptr()->flags & INP_FLAG_GRAB_MOUSE_STATE) + if (input_state_get_ptr()->flags & INP_FLAG_GRAB_MOUSE_STATE) win32_clip_window(true); #endif #if !defined(_XBOX) @@ -1134,7 +1136,7 @@ static LRESULT CALLBACK wnd_proc_winraw_common_internal(HWND hwnd, break; case WM_KILLFOCUS: #ifdef HAVE_CLIP_WINDOW - if (input_state_get_ptr()->flags & INP_FLAG_GRAB_MOUSE_STATE) + if (input_state_get_ptr()->flags & INP_FLAG_GRAB_MOUSE_STATE) win32_clip_window(false); #endif #if !defined(_XBOX) @@ -1177,17 +1179,17 @@ static LRESULT CALLBACK wnd_proc_common_dinput_internal(HWND hwnd, switch (message) { case WM_IME_ENDCOMPOSITION: - input_keyboard_event(true, 1, 0x80000000, 0, RETRO_DEVICE_KEYBOARD); + input_keyboard_event(true, 1, 0x80000000, 0, RETRO_DEVICE_KEYBOARD); break; case WM_IME_COMPOSITION: - { + { HIMC hIMC = ImmGetContext(hwnd); - unsigned gcs = lparam & (GCS_COMPSTR|GCS_RESULTSTR); + unsigned gcs = lparam & (GCS_COMPSTR|GCS_RESULTSTR); if (gcs) { int i; wchar_t wstr[4]={0,}; - int len1 = ImmGetCompositionStringW(hIMC, gcs, wstr, 4); + int len1 = ImmGetCompositionStringW(hIMC, gcs, wstr, 4); wstr[2] = wstr[1]; wstr[1] = 0; if ((len1 <= 0) || (len1 > 4)) @@ -1202,8 +1204,8 @@ static LRESULT CALLBACK wnd_proc_common_dinput_internal(HWND hwnd, if (len2 >= 1 && len2 <= 3) { if (len2 >= 2) - utf8[3] = (gcs) | (gcs >> 4); - input_keyboard_event(true, 1, *((int*)utf8), 0, RETRO_DEVICE_KEYBOARD); + utf8[3] = (gcs) | (gcs >> 4); + input_keyboard_event(true, 1, *((int*)utf8), 0, RETRO_DEVICE_KEYBOARD); } free(utf8); } @@ -1251,7 +1253,7 @@ static LRESULT CALLBACK wnd_proc_common_dinput_internal(HWND hwnd, mod |= RETROKMOD_META; input_keyboard_event(keydown, keycode, - 0, mod, RETRO_DEVICE_KEYBOARD); + wparam, mod, RETRO_DEVICE_KEYBOARD); if (message != WM_SYSKEYDOWN) return 0; diff --git a/input/drivers/winraw_input.c b/input/drivers/winraw_input.c index c1cce3edf8..a4724ebcb3 100644 --- a/input/drivers/winraw_input.c +++ b/input/drivers/winraw_input.c @@ -503,7 +503,7 @@ static LRESULT CALLBACK winraw_callback( HWND wnd, UINT msg, WPARAM wpar, LPARAM lpar) { unsigned i; - unsigned mcode, flags, kdown; + unsigned mcode, flags, down, mod; static uint8_t data[1024]; RAWINPUT *ri = (RAWINPUT*)data; UINT size = sizeof(data); @@ -527,7 +527,8 @@ static LRESULT CALLBACK winraw_callback( case RIM_TYPEKEYBOARD: mcode = ri->data.keyboard.MakeCode; flags = ri->data.keyboard.Flags; - kdown = (flags & RI_KEY_BREAK) ? 0 : 1; + down = (flags & RI_KEY_BREAK) ? 0 : 1; + mod = 0; /* Extended scancodes */ if (flags & RI_KEY_E0) @@ -558,10 +559,23 @@ static LRESULT CALLBACK winraw_callback( return 0; } - wr->keyboard.keys[mcode] = kdown; - input_keyboard_event(kdown, + if (GetKeyState(VK_SHIFT) & 0x80) + mod |= RETROKMOD_SHIFT; + if (GetKeyState(VK_CONTROL) & 0x80) + mod |= RETROKMOD_CTRL; + if (GetKeyState(VK_MENU) & 0x80) + mod |= RETROKMOD_ALT; + if (GetKeyState(VK_CAPITAL) & 0x81) + mod |= RETROKMOD_CAPSLOCK; + if (GetKeyState(VK_SCROLL) & 0x81) + mod |= RETROKMOD_SCROLLOCK; + if ((GetKeyState(VK_LWIN) | GetKeyState(VK_RWIN)) & 0x80) + mod |= RETROKMOD_META; + + wr->keyboard.keys[mcode] = down; + input_keyboard_event(down, input_keymaps_translate_keysym_to_rk(mcode), - 0, 0, RETRO_DEVICE_KEYBOARD); + ri->data.keyboard.VKey, mod, RETRO_DEVICE_KEYBOARD); break; case RIM_TYPEMOUSE: for (i = 0; i < wr->mouse_cnt; ++i)