From 8af9f62f6b7f3d8c36a659b60e7e9e271064b972 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 19 Jan 2014 11:59:11 -0800 Subject: [PATCH] windows: Move rawinput stuff into its own file. --- Windows/KeyboardDevice.cpp | 2 - Windows/KeyboardDevice.h | 2 + Windows/PPSSPP.vcxproj | 2 + Windows/PPSSPP.vcxproj.filters | 6 ++ Windows/RawInput.cpp | 166 +++++++++++++++++++++++++++++++++ Windows/RawInput.h | 24 +++++ Windows/WindowsFileSystem.h | 0 Windows/WndMainWindow.cpp | 116 +---------------------- 8 files changed, 204 insertions(+), 114 deletions(-) create mode 100644 Windows/RawInput.cpp create mode 100644 Windows/RawInput.h delete mode 100644 Windows/WindowsFileSystem.h diff --git a/Windows/KeyboardDevice.cpp b/Windows/KeyboardDevice.cpp index 01fb2174e9..26c287d2f7 100644 --- a/Windows/KeyboardDevice.cpp +++ b/Windows/KeyboardDevice.cpp @@ -4,10 +4,8 @@ #include "util/const_map.h" #include "KeyMap.h" #include "ControlMapping.h" -#include "Windows/WndMainWindow.h" #include "KeyboardDevice.h" #include "../Common/CommonTypes.h" -#include "../Core/HLE/sceCtrl.h" #include "WinUser.h" diff --git a/Windows/KeyboardDevice.h b/Windows/KeyboardDevice.h index 831351457b..895b411595 100644 --- a/Windows/KeyboardDevice.h +++ b/Windows/KeyboardDevice.h @@ -4,6 +4,8 @@ #include "base/mutex.h" #include "InputDevice.h" +extern std::map windowsTransTable; + class KeyboardDevice : public InputDevice { public: virtual int UpdateState(InputState &input_state); diff --git a/Windows/PPSSPP.vcxproj b/Windows/PPSSPP.vcxproj index 089843547f..7723dc5e8c 100644 --- a/Windows/PPSSPP.vcxproj +++ b/Windows/PPSSPP.vcxproj @@ -293,6 +293,7 @@ + $(IntDir)%(Filename)2.obj @@ -342,6 +343,7 @@ + diff --git a/Windows/PPSSPP.vcxproj.filters b/Windows/PPSSPP.vcxproj.filters index 3868bfdaa9..e9e999decb 100644 --- a/Windows/PPSSPP.vcxproj.filters +++ b/Windows/PPSSPP.vcxproj.filters @@ -137,6 +137,9 @@ Windows\GE Debugger + + Windows\Input + @@ -248,6 +251,9 @@ Other Platforms + + Windows\Input + diff --git a/Windows/RawInput.cpp b/Windows/RawInput.cpp new file mode 100644 index 0000000000..0fc9041a1b --- /dev/null +++ b/Windows/RawInput.cpp @@ -0,0 +1,166 @@ +// Copyright (c) 2014- PPSSPP Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0 or later versions. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official git repository and contact information can be found at +// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. + +#include +#include +#include "base/NativeApp.h" +#include "input/input_state.h" +#include "Windows/RawInput.h" +#include "Windows/KeyboardDevice.h" +#include "Windows/WindowsHost.h" +#include "Core/Config.h" + +#ifndef HID_USAGE_PAGE_GENERIC +#define HID_USAGE_PAGE_GENERIC ((USHORT) 0x01) +#endif +#ifndef HID_USAGE_GENERIC_POINTER +#define HID_USAGE_GENERIC_POINTER ((USHORT) 0x01) +#endif +#ifndef HID_USAGE_GENERIC_MOUSE +#define HID_USAGE_GENERIC_MOUSE ((USHORT) 0x02) +#endif +#ifndef HID_USAGE_GENERIC_JOYSTICK +#define HID_USAGE_GENERIC_JOYSTICK ((USHORT) 0x04) +#endif +#ifndef HID_USAGE_GENERIC_GAMEPAD +#define HID_USAGE_GENERIC_GAMEPAD ((USHORT) 0x05) +#endif +#ifndef HID_USAGE_GENERIC_KEYBOARD +#define HID_USAGE_GENERIC_KEYBOARD ((USHORT) 0x06) +#endif +#ifndef HID_USAGE_GENERIC_KEYPAD +#define HID_USAGE_GENERIC_KEYPAD ((USHORT) 0x07) +#endif +#ifndef HID_USAGE_GENERIC_MULTIAXIS +#define HID_USAGE_GENERIC_MULTIAXIS ((USHORT) 0x07) +#endif + +namespace WindowsRawInput { + static std::set keyboardKeysDown; + static void *rawInputBuffer; + static size_t rawInputBufferSize; + + void Init() { + RAWINPUTDEVICE dev[2]; + memset(dev, 0, sizeof(dev)); + + dev[0].usUsagePage = HID_USAGE_PAGE_GENERIC; + dev[0].usUsage = HID_USAGE_GENERIC_KEYBOARD; + dev[0].dwFlags = g_Config.bIgnoreWindowsKey ? RIDEV_NOHOTKEYS : 0; + + dev[1].usUsagePage = HID_USAGE_PAGE_GENERIC; + dev[1].usUsage = HID_USAGE_GENERIC_MOUSE; + dev[1].dwFlags = 0; + RegisterRawInputDevices(dev, 2, sizeof(RAWINPUTDEVICE)); + } + + static int GetTrueVKey(const RAWKEYBOARD &kb) { + switch (kb.VKey) { + case VK_SHIFT: + return MapVirtualKey(kb.MakeCode, MAPVK_VSC_TO_VK_EX); + + case VK_CONTROL: + if (kb.Flags & RI_KEY_E0) + return VK_RCONTROL; + else + return VK_LCONTROL; + + case VK_MENU: + if (kb.Flags & RI_KEY_E0) + return VK_RMENU; // Right Alt / AltGr + else + return VK_LMENU; // Left Alt + + default: + return kb.VKey; + } + } + + LRESULT Process(WPARAM wParam, LPARAM lParam) { + UINT dwSize; + GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER)); + if (!rawInputBuffer) { + rawInputBuffer = malloc(dwSize); + rawInputBufferSize = dwSize; + } + if (dwSize > rawInputBufferSize) { + rawInputBuffer = realloc(rawInputBuffer, dwSize); + } + GetRawInputData((HRAWINPUT)lParam, RID_INPUT, rawInputBuffer, &dwSize, sizeof(RAWINPUTHEADER)); + RAWINPUT* raw = (RAWINPUT*)rawInputBuffer; + if (raw->header.dwType == RIM_TYPEKEYBOARD) { + KeyInput key; + key.deviceId = DEVICE_ID_KEYBOARD; + if (raw->data.keyboard.Message == WM_KEYDOWN || raw->data.keyboard.Message == WM_SYSKEYDOWN) { + key.flags = KEY_DOWN; + key.keyCode = windowsTransTable[GetTrueVKey(raw->data.keyboard)]; + + if (key.keyCode) { + NativeKey(key); + keyboardKeysDown.insert(key.keyCode); + } + } else if (raw->data.keyboard.Message == WM_KEYUP) { + key.flags = KEY_UP; + key.keyCode = windowsTransTable[GetTrueVKey(raw->data.keyboard)]; + + if (key.keyCode) { + NativeKey(key); + + auto keyDown = std::find(keyboardKeysDown.begin(), keyboardKeysDown.end(), key.keyCode); + if (keyDown != keyboardKeysDown.end()) + keyboardKeysDown.erase(keyDown); + } + } + } else if (raw->header.dwType == RIM_TYPEMOUSE) { + mouseDeltaX += raw->data.mouse.lLastX; + mouseDeltaY += raw->data.mouse.lLastY; + + KeyInput key; + key.deviceId = DEVICE_ID_MOUSE; + + int mouseRightBtnPressed = raw->data.mouse.usButtonFlags & RI_MOUSE_RIGHT_BUTTON_DOWN; + int mouseRightBtnReleased = raw->data.mouse.usButtonFlags & RI_MOUSE_RIGHT_BUTTON_UP; + + if(mouseRightBtnPressed) { + key.flags = KEY_DOWN; + key.keyCode = windowsTransTable[VK_RBUTTON]; + NativeKey(key); + } + else if(mouseRightBtnReleased) { + key.flags = KEY_UP; + key.keyCode = windowsTransTable[VK_RBUTTON]; + NativeKey(key); + } + + // TODO : Smooth and translate to an axis every frame. + // NativeAxis() + } + + return 0; + } + + void LoseFocus() { + // Force-release all held keys on the keyboard to prevent annoying stray inputs. + KeyInput key; + key.deviceId = DEVICE_ID_KEYBOARD; + key.flags = KEY_UP; + for (auto i = keyboardKeysDown.begin(); i != keyboardKeysDown.end(); ++i) { + key.keyCode = *i; + NativeKey(key); + } + } +}; \ No newline at end of file diff --git a/Windows/RawInput.h b/Windows/RawInput.h new file mode 100644 index 0000000000..f14b9689cb --- /dev/null +++ b/Windows/RawInput.h @@ -0,0 +1,24 @@ +// Copyright (c) 2014- PPSSPP Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0 or later versions. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official git repository and contact information can be found at +// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. + +#include "Common/CommonWindows.h" + +namespace WindowsRawInput { + void Init(); + LRESULT Process(WPARAM wParam, LPARAM lParam); + void LoseFocus(); +}; \ No newline at end of file diff --git a/Windows/WindowsFileSystem.h b/Windows/WindowsFileSystem.h deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/Windows/WndMainWindow.cpp b/Windows/WndMainWindow.cpp index 6b67af001d..74922deb9d 100644 --- a/Windows/WndMainWindow.cpp +++ b/Windows/WndMainWindow.cpp @@ -61,6 +61,7 @@ #include "Windows/W32Util/DialogManager.h" #include "Windows/W32Util/ShellUtil.h" #include "Windows/W32Util/Misc.h" +#include "Windows/RawInput.h" #include "GPU/GPUInterface.h" #include "GPU/GPUState.h" #include "GPU/GLES/TextureScaler.h" @@ -103,20 +104,12 @@ static RECT g_normalRC = {0}; static std::wstring windowTitle; extern bool g_TakeScreenshot; extern InputState input_state; -static std::set keyboardKeysDown; #define TIMER_CURSORUPDATE 1 #define TIMER_CURSORMOVEUPDATE 2 #define CURSORUPDATE_INTERVAL_MS 1000 #define CURSORUPDATE_MOVE_TIMESPAN_MS 500 -#ifndef HID_USAGE_PAGE_GENERIC -#define HID_USAGE_PAGE_GENERIC ((USHORT) 0x01) -#endif -#ifndef HID_USAGE_GENERIC_MOUSE -#define HID_USAGE_GENERIC_MOUSE ((USHORT) 0x02) -#endif - namespace MainWindow { HWND hwndMain; @@ -130,8 +123,6 @@ namespace MainWindow static int prevCursorY = -1; static bool mouseButtonDown = false; static bool hideCursor = false; - static void *rawInputBuffer; - static size_t rawInputBufferSize; static std::map initialMenuKeys; static std::vector countryCodes; static std::vector availableShaders; @@ -799,17 +790,7 @@ namespace MainWindow RegisterTouchWindow(hwndDisplay, TWF_WANTPALM); #endif - RAWINPUTDEVICE dev[2]; - memset(dev, 0, sizeof(dev)); - - dev[0].usUsagePage = 1; - dev[0].usUsage = 6; - dev[0].dwFlags = g_Config.bIgnoreWindowsKey ? RIDEV_NOHOTKEYS : 0; - - dev[1].usUsagePage = HID_USAGE_PAGE_GENERIC; - dev[1].usUsage = HID_USAGE_GENERIC_MOUSE; - dev[1].dwFlags = 0; - RegisterRawInputDevices(dev, 2, sizeof(RAWINPUTDEVICE)); + WindowsRawInput::Init(); SetFocus(hwndMain); return TRUE; @@ -1036,28 +1017,6 @@ namespace MainWindow } return 0; } - - static int GetTrueVKey(const RAWKEYBOARD &kb) { - switch (kb.VKey) { - case VK_SHIFT: - return MapVirtualKey(kb.MakeCode, MAPVK_VSC_TO_VK_EX); - - case VK_CONTROL: - if (kb.Flags & RI_KEY_E0) - return VK_RCONTROL; - else - return VK_LCONTROL; - - case VK_MENU: - if (kb.Flags & RI_KEY_E0) - 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; @@ -1085,14 +1044,7 @@ namespace MainWindow } if (wParam == WA_INACTIVE) { - // Force-release all held keys on the keyboard to prevent annoying stray inputs. - KeyInput key; - key.deviceId = DEVICE_ID_KEYBOARD; - key.flags = KEY_UP; - for (auto i = keyboardKeysDown.begin(); i != keyboardKeysDown.end(); ++i) { - key.keyCode = *i; - NativeKey(key); - } + WindowsRawInput::LoseFocus(); } } break; @@ -1529,67 +1481,7 @@ namespace MainWindow break; case WM_INPUT: - { - UINT dwSize; - GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER)); - if (!rawInputBuffer) { - rawInputBuffer = malloc(dwSize); - rawInputBufferSize = dwSize; - } - if (dwSize > rawInputBufferSize) { - rawInputBuffer = realloc(rawInputBuffer, dwSize); - } - GetRawInputData((HRAWINPUT)lParam, RID_INPUT, rawInputBuffer, &dwSize, sizeof(RAWINPUTHEADER)); - RAWINPUT* raw = (RAWINPUT*)rawInputBuffer; - if (raw->header.dwType == RIM_TYPEKEYBOARD) { - KeyInput key; - key.deviceId = DEVICE_ID_KEYBOARD; - if (raw->data.keyboard.Message == WM_KEYDOWN || raw->data.keyboard.Message == WM_SYSKEYDOWN) { - key.flags = KEY_DOWN; - key.keyCode = windowsTransTable[GetTrueVKey(raw->data.keyboard)]; - - if (key.keyCode) { - NativeKey(key); - keyboardKeysDown.insert(key.keyCode); - } - } else if (raw->data.keyboard.Message == WM_KEYUP) { - key.flags = KEY_UP; - key.keyCode = windowsTransTable[GetTrueVKey(raw->data.keyboard)]; - - if (key.keyCode) { - NativeKey(key); - - auto keyDown = std::find(keyboardKeysDown.begin(), keyboardKeysDown.end(), key.keyCode); - if (keyDown != keyboardKeysDown.end()) - keyboardKeysDown.erase(keyDown); - } - } - } else if (raw->header.dwType == RIM_TYPEMOUSE) { - mouseDeltaX += raw->data.mouse.lLastX; - mouseDeltaY += raw->data.mouse.lLastY; - - KeyInput key; - key.deviceId = DEVICE_ID_MOUSE; - - int mouseRightBtnPressed = raw->data.mouse.usButtonFlags & RI_MOUSE_RIGHT_BUTTON_DOWN; - int mouseRightBtnReleased = raw->data.mouse.usButtonFlags & RI_MOUSE_RIGHT_BUTTON_UP; - - if(mouseRightBtnPressed) { - key.flags = KEY_DOWN; - key.keyCode = windowsTransTable[VK_RBUTTON]; - NativeKey(key); - } - else if(mouseRightBtnReleased) { - key.flags = KEY_UP; - key.keyCode = windowsTransTable[VK_RBUTTON]; - NativeKey(key); - } - - // TODO : Smooth and translate to an axis every frame. - // NativeAxis() - } - } - return 0; + return WindowsRawInput::Process(wParam, lParam); case WM_VERYSLEEPY_MSG: switch (wParam) {