diff --git a/Common/KeyMap.cpp b/Common/KeyMap.cpp index 223e041c9c..09eb6ed2e7 100644 --- a/Common/KeyMap.cpp +++ b/Common/KeyMap.cpp @@ -48,6 +48,7 @@ struct DefaultKeyMap { m[KeyDef(DEVICE_ID_KEYBOARD, KEYCODE_J)] = VIRTKEY_AXIS_X_MIN; m[KeyDef(DEVICE_ID_KEYBOARD, KEYCODE_L)] = VIRTKEY_AXIS_X_MAX; m[KeyDef(DEVICE_ID_KEYBOARD, KEYCODE_SHIFT_LEFT)] = VIRTKEY_RAPID_FIRE; + m[KeyDef(DEVICE_ID_KEYBOARD, KEYCODE_TAB)] = VIRTKEY_UNTHROTTLE; return m; } @@ -66,6 +67,7 @@ struct DefaultKeyMap { m[KeyDef(DEVICE_ID_X360_0, KEYCODE_BACK)] = CTRL_SELECT; m[KeyDef(DEVICE_ID_X360_0, KEYCODE_BUTTON_L1)] = CTRL_LTRIGGER; m[KeyDef(DEVICE_ID_X360_0, KEYCODE_BUTTON_R1)] = CTRL_RTRIGGER; + m[KeyDef(DEVICE_ID_X360_0, KEYCODE_BUTTON_R2)] = VIRTKEY_UNTHROTTLE; return m; } diff --git a/Common/KeyMap.h b/Common/KeyMap.h index 056d1e667f..45ad19ff40 100644 --- a/Common/KeyMap.h +++ b/Common/KeyMap.h @@ -33,6 +33,7 @@ enum { VIRTKEY_AXIS_X_MAX = 0x10002, VIRTKEY_AXIS_Y_MAX = 0x10003, VIRTKEY_RAPID_FIRE = 0x10004, + VIRTKEY_UNTHROTTLE = 0x10005, VIRTKEY_LAST, VIRTKEY_COUNT = VIRTKEY_LAST - VIRTKEY_FIRST }; diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index 52dc2824a2..775ef7b2c9 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -182,16 +182,37 @@ void EmuScreen::touch(const TouchInput &touch) { } +void EmuScreen::onVKeyDown(int virtualKeyCode) { + switch (virtualKeyCode) { + case VIRTKEY_UNTHROTTLE: + PSP_CoreParameter().unthrottle = true; + break; + } +} + +void EmuScreen::onVKeyUp(int virtualKeyCode) { + switch (virtualKeyCode) { + case VIRTKEY_UNTHROTTLE: + PSP_CoreParameter().unthrottle = false; + break; + } +} + void EmuScreen::key(const KeyInput &key) { int result = KeyMap::KeyToPspButton(key.deviceId, key.keyCode); if (result == KEYMAP_ERROR_UNKNOWN_KEY) return; if (result >= VIRTKEY_FIRST) { - if (key.flags & KEY_DOWN) - virtKeys[result - VIRTKEY_FIRST] = true; - if (key.flags & KEY_UP) - virtKeys[result - VIRTKEY_FIRST] = false; + int vk = result - VIRTKEY_FIRST; + if (key.flags & KEY_DOWN) { + virtKeys[vk] = true; + onVKeyDown(key.keyCode); + } + if (key.flags & KEY_UP) { + virtKeys[vk] = false; + onVKeyUp(key.keyCode); + } } else { if (key.flags & KEY_DOWN) __CtrlButtonDown(result); @@ -313,22 +334,6 @@ void EmuScreen::update(InputState &input) { __CtrlSetAnalogX(clamp1(rightstick_x), CTRL_STICK_RIGHT); __CtrlSetAnalogY(clamp1(rightstick_y), CTRL_STICK_RIGHT); - if (PSP_CoreParameter().fpsLimit != 2) { - // Don't really need to show these, it's pretty obvious what unthrottle does, - // in contrast to the three state toggle - /* - if (input.pad_buttons_down & PAD_BUTTON_UNTHROTTLE) { - osm.Show(s->T("unlimited", "Speed: unlimited!"), 1.0, 0x50E0FF); - } - if (input.pad_buttons_up & PAD_BUTTON_UNTHROTTLE) { - osm.Show(s->T("standard", "Speed: standard"), 1.0); - }*/ - } - if (input.pad_buttons & PAD_BUTTON_UNTHROTTLE) { - PSP_CoreParameter().unthrottle = true; - } else { - PSP_CoreParameter().unthrottle = false; - } // Make sure fpsLimit starts at 0 if (PSP_CoreParameter().fpsLimit != 0 && PSP_CoreParameter().fpsLimit != 1 && PSP_CoreParameter().fpsLimit != 2) { PSP_CoreParameter().fpsLimit = 0; @@ -351,8 +356,7 @@ void EmuScreen::update(InputState &input) { } if (input.pad_buttons_down & (PAD_BUTTON_MENU | PAD_BUTTON_BACK | PAD_BUTTON_RIGHT_THUMB)) { - if (g_Config.bBufferedRendering) - fbo_unbind(); + fbo_unbind(); screenManager()->push(new PauseScreen()); } } diff --git a/UI/EmuScreen.h b/UI/EmuScreen.h index a747cc85ae..5ba91af12e 100644 --- a/UI/EmuScreen.h +++ b/UI/EmuScreen.h @@ -40,6 +40,9 @@ public: virtual void axis(const AxisInput &axis); private: + void onVKeyDown(int virtualKeyCode); + void onVKeyUp(int virtualKeyCode); + // Something invalid was loaded, don't try to emulate bool invalid_; std::string errorMessage_; diff --git a/Windows/KeyboardDevice.cpp b/Windows/KeyboardDevice.cpp index 0c9c2df304..a14c02c33b 100644 --- a/Windows/KeyboardDevice.cpp +++ b/Windows/KeyboardDevice.cpp @@ -57,6 +57,8 @@ std::map windowsTransTable = InitConstMap ('7', KEYCODE_7) ('8', KEYCODE_8) ('9', KEYCODE_9) + (VK_OEM_PERIOD, KEYCODE_PERIOD) + (VK_OEM_COMMA, KEYCODE_COMMA) (VK_NUMPAD0, KEYCODE_NUMPAD_0) (VK_NUMPAD1, KEYCODE_NUMPAD_1) (VK_NUMPAD2, KEYCODE_NUMPAD_2) @@ -102,16 +104,17 @@ std::map windowsTransTable = InitConstMap (VK_OEM_2, KEYCODE_SLASH) (VK_OEM_4, KEYCODE_LEFT_BRACKET) (VK_OEM_6, KEYCODE_RIGHT_BRACKET) - (VK_MENU, KEYCODE_MENU); + (VK_MENU, KEYCODE_MENU) + (VK_LSHIFT, KEYCODE_SHIFT_LEFT) + (VK_RSHIFT, KEYCODE_SHIFT_RIGHT) + (VK_LCONTROL, KEYCODE_CTRL_LEFT) + (VK_RCONTROL, KEYCODE_CTRL_RIGHT) + (VK_LMENU, KEYCODE_ALT_LEFT) + (VK_RMENU, KEYCODE_ALT_RIGHT); int KeyboardDevice::UpdateState(InputState &input_state) { if (MainWindow::GetHWND() != GetForegroundWindow()) return -1; - // This button isn't customizable. Also, if alt is held, we ignore it (alt-tab is common.) - if (GetAsyncKeyState(VK_TAB) && !GetAsyncKeyState(VK_MENU)) { - input_state.pad_buttons |= PAD_BUTTON_UNTHROTTLE; - } - // TODO: remove for (int i = 0; i < sizeof(key_pad_map)/sizeof(key_pad_map[0]); i += 2) { if (!GetAsyncKeyState(key_pad_map[i])) { diff --git a/Windows/WndMainWindow.cpp b/Windows/WndMainWindow.cpp index e97ef8da7a..88a70f565e 100644 --- a/Windows/WndMainWindow.cpp +++ b/Windows/WndMainWindow.cpp @@ -53,6 +53,9 @@ BOOL g_bFullScreen = FALSE; static RECT g_normalRC = {0}; extern bool g_TakeScreenshot; extern InputState input_state; +extern const char * getVirtualKeyName(unsigned char key); +extern const char * getXinputButtonName(unsigned int button); + #define TIMER_CURSORUPDATE 1 #define TIMER_CURSORMOVEUPDATE 2 #define CURSORUPDATE_INTERVAL_MS 50 @@ -71,6 +74,8 @@ namespace MainWindow static int prevCursorY = -1; static bool mouseButtonDown = false; static bool hideCursor = false; + static void *rawInputBuffer; + static size_t rawInputBufferSize; //W32Util::LayeredWindow *layer; #define MAX_LOADSTRING 100 @@ -284,6 +289,13 @@ namespace MainWindow RegisterTouchWindow(hwndDisplay, TWF_WANTPALM); #endif + RAWINPUTDEVICE keyboard; + memset(&keyboard, 0, sizeof(keyboard)); + keyboard.usUsagePage = 1; + keyboard.usUsage = 6; + keyboard.dwFlags = 0; // RIDEV_NOLEGACY | ; + RegisterRawInputDevices(&keyboard, 1, sizeof(RAWINPUTDEVICE)); + SetFocus(hwndDisplay); return TRUE; @@ -444,6 +456,30 @@ namespace MainWindow return 0; } + static int GetTrueVKey(const RAWKEYBOARD &kb) { + switch (kb.VKey) { + case VK_SHIFT: + if (kb.MakeCode == 0x36) // WTF? + return VK_RSHIFT; + else + return VK_LSHIFT; + case VK_CONTROL: + if (kb.Flags == 2) // Seems to contradict some documentation + return VK_RCONTROL; + else + return VK_LCONTROL; + + // For some reason, we don't receive KEYDOWN for Alt keys, only KEYUP. + case VK_MENU: + if (kb.Flags == 3) + return VK_RMENU; // Right Alt / AltGr + else + return VK_LMENU; // Left Alt + default: + return kb.VKey; + } + } + LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; @@ -804,57 +840,34 @@ namespace MainWindow } break; - case WM_KEYDOWN: + case WM_INPUT: { - KeyInput key; - key.deviceId = DEVICE_ID_KEYBOARD; - key.flags = KEY_DOWN; - 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; + UINT dwSize; + GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER)); + if (!rawInputBuffer) { + rawInputBuffer = malloc(dwSize); + rawInputBufferSize = dwSize; } - } - return 0; + if (dwSize > rawInputBufferSize) { + rawInputBuffer = realloc(rawInputBuffer, dwSize); + } + GetRawInputData((HRAWINPUT)lParam, RID_INPUT, rawInputBuffer, &dwSize, sizeof(RAWINPUTHEADER)); + RAWINPUT* raw = (RAWINPUT*)rawInputBuffer; - case WM_KEYUP: - { - KeyInput key; - key.deviceId = DEVICE_ID_KEYBOARD; - key.flags = KEY_UP; - 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; + if (raw->header.dwType == RIM_TYPEKEYBOARD) { + KeyInput key; + key.deviceId = DEVICE_ID_KEYBOARD; + if (raw->data.keyboard.Message == WM_KEYDOWN) { + key.flags = KEY_DOWN; + key.keyCode = windowsTransTable[GetTrueVKey(raw->data.keyboard)]; + if (key.keyCode) + NativeKey(key); + } else if (raw->data.keyboard.Message == WM_KEYUP) { + key.flags = KEY_UP; + key.keyCode = windowsTransTable[GetTrueVKey(raw->data.keyboard)]; + if (key.keyCode) + NativeKey(key); + } } } return 0; diff --git a/native b/native index 35ccbc6df3..127d9d3854 160000 --- a/native +++ b/native @@ -1 +1 @@ -Subproject commit 35ccbc6df3bcde28c30d838dc6f8ef5715d34114 +Subproject commit 127d9d38544ddb02ada012796f1b273f05720666