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_LCONTROL, KEYCODE_CTRL_LEFT)
(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_SPACE, KEYCODE_SPACE)
(VK_ESCAPE, KEYCODE_ESCAPE)
@ -105,7 +109,6 @@ std::map<int, int> windowsTransTable = InitConstMap<int, int>
(VK_LEFT, KEYCODE_DPAD_LEFT)
(VK_RIGHT, KEYCODE_DPAD_RIGHT)
(VK_CAPITAL, KEYCODE_CAPS_LOCK)
(VK_TAB, KEYCODE_TAB)
(VK_CLEAR, KEYCODE_CLEAR)
(VK_PRINT, KEYCODE_SYSRQ)
(VK_SCROLL, KEYCODE_SCROLL_LOCK)

View file

@ -85,18 +85,23 @@ namespace MainWindow
LRESULT CALLBACK DisplayProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
HWND GetHWND()
{
HWND GetHWND() {
return hwndMain;
}
HWND GetDisplayHWND()
{
HWND GetDisplayHWND() {
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
WTL::CTheme::IsThemingSupported();
#endif
@ -785,7 +790,7 @@ namespace MainWindow
ShellExecute(NULL, "open", "http://forums.ppsspp.org/", NULL, NULL, SW_SHOWNORMAL);
break;
case ID_HELP_ABOUT:
case ID_HELP_ABOUT:
DialogManager::EnableAll(FALSE);
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
DialogManager::EnableAll(TRUE);
@ -806,9 +811,25 @@ namespace MainWindow
KeyInput key;
key.deviceId = DEVICE_ID_KEYBOARD;
key.flags = KEY_DOWN;
key.keyCode = windowsTransTable[(int)wParam];
if (key.keyCode)
NativeKey(key);
switch ((int)wParam) {
case VK_SHIFT:
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;
@ -817,9 +838,26 @@ namespace MainWindow
KeyInput key;
key.deviceId = DEVICE_ID_KEYBOARD;
key.flags = KEY_UP;
key.keyCode = windowsTransTable[(int)wParam];
if (key.keyCode)
NativeKey(key);
switch ((int)wParam) {
case VK_SHIFT:
// 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;