Add keymap support for alt/shift/ctrl on Windows.

WM_KEYDOWN only gets VK_SHIFT, not L or R.  We could detect which on
press, but not on release.  It's simpler to just resend both.
This commit is contained in:
Unknown W. Brackets 2013-07-06 19:12:06 -07:00
parent cb249c469b
commit 39fc7931bb
2 changed files with 55 additions and 14 deletions

View file

@ -90,6 +90,10 @@ std::map<int, int> windowsTransTable = InitConstMap<int, int>
(VK_OEM_PLUS, KEYCODE_PLUS) (VK_OEM_PLUS, KEYCODE_PLUS)
(VK_LCONTROL, KEYCODE_CTRL_LEFT) (VK_LCONTROL, KEYCODE_CTRL_LEFT)
(VK_RCONTROL, KEYCODE_CTRL_RIGHT) (VK_RCONTROL, KEYCODE_CTRL_RIGHT)
(VK_LSHIFT, KEYCODE_SHIFT_LEFT)
(VK_RSHIFT, KEYCODE_SHIFT_RIGHT)
(VK_LMENU, KEYCODE_ALT_LEFT)
(VK_RMENU, KEYCODE_ALT_RIGHT)
(VK_BACK, KEYCODE_BACK) (VK_BACK, KEYCODE_BACK)
(VK_SPACE, KEYCODE_SPACE) (VK_SPACE, KEYCODE_SPACE)
(VK_ESCAPE, KEYCODE_ESCAPE) (VK_ESCAPE, KEYCODE_ESCAPE)
@ -105,7 +109,6 @@ std::map<int, int> windowsTransTable = InitConstMap<int, int>
(VK_LEFT, KEYCODE_DPAD_LEFT) (VK_LEFT, KEYCODE_DPAD_LEFT)
(VK_RIGHT, KEYCODE_DPAD_RIGHT) (VK_RIGHT, KEYCODE_DPAD_RIGHT)
(VK_CAPITAL, KEYCODE_CAPS_LOCK) (VK_CAPITAL, KEYCODE_CAPS_LOCK)
(VK_TAB, KEYCODE_TAB)
(VK_CLEAR, KEYCODE_CLEAR) (VK_CLEAR, KEYCODE_CLEAR)
(VK_PRINT, KEYCODE_SYSRQ) (VK_PRINT, KEYCODE_SYSRQ)
(VK_SCROLL, KEYCODE_SCROLL_LOCK) (VK_SCROLL, KEYCODE_SCROLL_LOCK)

View file

@ -85,18 +85,23 @@ namespace MainWindow
LRESULT CALLBACK DisplayProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK DisplayProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
HWND GetHWND() HWND GetHWND() {
{
return hwndMain; return hwndMain;
} }
HWND GetDisplayHWND() HWND GetDisplayHWND() {
{
return hwndDisplay; return hwndDisplay;
} }
void Init(HINSTANCE hInstance) void SendCheckedNativeKey(KeyInput &key, int vKey) {
{ key.keyCode = windowsTransTable[(int)vKey];
if (key.keyCode) {
key.flags = GetAsyncKeyState(vKey) ? KEY_DOWN : KEY_UP;
NativeKey(key);
}
}
void Init(HINSTANCE hInstance) {
#ifdef THEMES #ifdef THEMES
WTL::CTheme::IsThemingSupported(); WTL::CTheme::IsThemingSupported();
#endif #endif
@ -785,7 +790,7 @@ namespace MainWindow
ShellExecute(NULL, "open", "http://forums.ppsspp.org/", NULL, NULL, SW_SHOWNORMAL); ShellExecute(NULL, "open", "http://forums.ppsspp.org/", NULL, NULL, SW_SHOWNORMAL);
break; break;
case ID_HELP_ABOUT: case ID_HELP_ABOUT:
DialogManager::EnableAll(FALSE); DialogManager::EnableAll(FALSE);
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
DialogManager::EnableAll(TRUE); DialogManager::EnableAll(TRUE);
@ -806,9 +811,25 @@ namespace MainWindow
KeyInput key; KeyInput key;
key.deviceId = DEVICE_ID_KEYBOARD; key.deviceId = DEVICE_ID_KEYBOARD;
key.flags = KEY_DOWN; key.flags = KEY_DOWN;
key.keyCode = windowsTransTable[(int)wParam]; switch ((int)wParam) {
if (key.keyCode) case VK_SHIFT:
NativeKey(key); SendCheckedNativeKey(key, VK_LSHIFT);
SendCheckedNativeKey(key, VK_RSHIFT);
break;
case VK_CONTROL:
SendCheckedNativeKey(key, VK_LCONTROL);
SendCheckedNativeKey(key, VK_RCONTROL);
break;
case VK_MENU:
SendCheckedNativeKey(key, VK_LMENU);
SendCheckedNativeKey(key, VK_RMENU);
break;
default:
key.keyCode = windowsTransTable[(int)wParam];
if (key.keyCode)
NativeKey(key);
break;
}
} }
return 0; return 0;
@ -817,9 +838,26 @@ namespace MainWindow
KeyInput key; KeyInput key;
key.deviceId = DEVICE_ID_KEYBOARD; key.deviceId = DEVICE_ID_KEYBOARD;
key.flags = KEY_UP; key.flags = KEY_UP;
key.keyCode = windowsTransTable[(int)wParam]; switch ((int)wParam) {
if (key.keyCode) case VK_SHIFT:
NativeKey(key); // We have no idea which was released, so just resend both.
SendCheckedNativeKey(key, VK_LSHIFT);
SendCheckedNativeKey(key, VK_RSHIFT);
break;
case VK_CONTROL:
SendCheckedNativeKey(key, VK_LCONTROL);
SendCheckedNativeKey(key, VK_RCONTROL);
break;
case VK_MENU:
SendCheckedNativeKey(key, VK_LMENU);
SendCheckedNativeKey(key, VK_RMENU);
break;
default:
key.keyCode = windowsTransTable[(int)wParam];
if (key.keyCode)
NativeKey(key);
break;
}
} }
return 0; return 0;