mirror of
https://github.com/libretro/RetroArch
synced 2025-03-03 04:14:00 +00:00
(WINRAW) Key position fixes
This commit is contained in:
parent
83a1e9170d
commit
1e95683c06
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user