RawInput: fix double keyboard input and incorrect mouse wheel input

This commit is contained in:
2022-03-26 12:57:19 +02:00
parent 210dd603b0
commit 57ab58608e

View File

@@ -109,7 +109,7 @@ namespace WindowsInputImpl
bool XInputGamepads[XUSER_MAX_COUNT] = { false }; bool XInputGamepads[XUSER_MAX_COUNT] = { false };
WindowsMouse* Mouse = nullptr; WindowsMouse* Mouse = nullptr;
WindowsKeyboard* Keyboard = nullptr; WindowsKeyboard* Keyboard = nullptr;
bool RawInput = true; bool RawInputEnabled = true;
} }
#include <hidusage.h> #include <hidusage.h>
@@ -118,7 +118,7 @@ void WindowsInput::Init()
Input::Mouse = WindowsInputImpl::Mouse = New<WindowsMouse>(); Input::Mouse = WindowsInputImpl::Mouse = New<WindowsMouse>();
Input::Keyboard = WindowsInputImpl::Keyboard = New<WindowsKeyboard>(); Input::Keyboard = WindowsInputImpl::Keyboard = New<WindowsKeyboard>();
if (WindowsInputImpl::RawInput) if (WindowsInputImpl::RawInputEnabled)
{ {
RAWINPUTDEVICE rid[2] = {}; RAWINPUTDEVICE rid[2] = {};
@@ -132,7 +132,6 @@ void WindowsInput::Init()
rid[1].usUsagePage = HID_USAGE_PAGE_GENERIC; rid[1].usUsagePage = HID_USAGE_PAGE_GENERIC;
rid[1].usUsage = HID_USAGE_GENERIC_KEYBOARD; rid[1].usUsage = HID_USAGE_GENERIC_KEYBOARD;
rid[1].hwndTarget = nullptr; rid[1].hwndTarget = nullptr;
//rid[1].dwFlags = RIDEV_NOLEGACY; // Should not be enabled, WM_CHAR events would need to be emulated in raw input and that's not really feasible...
if (!RegisterRawInputDevices(rid, 2, sizeof(rid[0]))) if (!RegisterRawInputDevices(rid, 2, sizeof(rid[0])))
LOG(Error, "Failed to register RawInput devices. Error: {0}", GetLastError()); LOG(Error, "Failed to register RawInput devices. Error: {0}", GetLastError());
@@ -162,8 +161,6 @@ void WindowsInput::Update()
} }
} }
} }
// TODO: handle raw input device detection here
} }
bool WindowsInput::WndProc(Window* window, Windows::UINT msg, Windows::WPARAM wParam, Windows::LPARAM lParam) bool WindowsInput::WndProc(Window* window, Windows::UINT msg, Windows::WPARAM wParam, Windows::LPARAM lParam)
@@ -256,7 +253,8 @@ bool OnRawInput(Vector2 mousePosition, Window* window, HRAWINPUT input)
Input::Mouse->OnMouseUp(mousePos, MouseButton::Extended2, window); Input::Mouse->OnMouseUp(mousePos, MouseButton::Extended2, window);
if ((rawMouse.usButtonFlags & RI_MOUSE_WHEEL) != 0) if ((rawMouse.usButtonFlags & RI_MOUSE_WHEEL) != 0)
{ {
const float deltaNormalized = static_cast<float>(rawMouse.usButtonData) / WHEEL_DELTA; const int16 delta = static_cast<int16>(rawMouse.usButtonData);
const float deltaNormalized = static_cast<float>(delta) / WHEEL_DELTA;
Input::Mouse->OnMouseWheel(mousePos, deltaNormalized, window); Input::Mouse->OnMouseWheel(mousePos, deltaNormalized, window);
} }
@@ -282,14 +280,16 @@ bool WindowsKeyboard::WndProc(Window* window, const Windows::UINT msg, Windows::
case WM_KEYDOWN: case WM_KEYDOWN:
case WM_SYSKEYDOWN: case WM_SYSKEYDOWN:
{ {
OnKeyDown(static_cast<KeyboardKeys>(wParam), window); if (!WindowsInputImpl::RawInputEnabled)
OnKeyDown(static_cast<KeyboardKeys>(wParam), window);
result = true; result = true;
break; break;
} }
case WM_KEYUP: case WM_KEYUP:
case WM_SYSKEYUP: case WM_SYSKEYUP:
{ {
OnKeyUp(static_cast<KeyboardKeys>(wParam), window); if (!WindowsInputImpl::RawInputEnabled)
OnKeyUp(static_cast<KeyboardKeys>(wParam), window);
result = true; result = true;
break; break;
} }
@@ -314,7 +314,7 @@ bool WindowsMouse::WndProc(Window* window, const UINT msg, WPARAM wParam, LPARAM
{ {
case WM_MOUSEMOVE: case WM_MOUSEMOVE:
{ {
if (!WindowsInputImpl::RawInput) if (!WindowsInputImpl::RawInputEnabled)
{ {
static Vector2 lastPos = mousePos; static Vector2 lastPos = mousePos;
if (_state.MouseWasReset) if (_state.MouseWasReset)
@@ -347,28 +347,28 @@ bool WindowsMouse::WndProc(Window* window, const UINT msg, WPARAM wParam, LPARAM
} }
case WM_LBUTTONDOWN: case WM_LBUTTONDOWN:
{ {
if (!WindowsInputImpl::RawInput) if (!WindowsInputImpl::RawInputEnabled)
OnMouseDown(mousePos, MouseButton::Left, window); OnMouseDown(mousePos, MouseButton::Left, window);
result = true; result = true;
break; break;
} }
case WM_RBUTTONDOWN: case WM_RBUTTONDOWN:
{ {
if (!WindowsInputImpl::RawInput) if (!WindowsInputImpl::RawInputEnabled)
OnMouseDown(mousePos, MouseButton::Right, window); OnMouseDown(mousePos, MouseButton::Right, window);
result = true; result = true;
break; break;
} }
case WM_MBUTTONDOWN: case WM_MBUTTONDOWN:
{ {
if (!WindowsInputImpl::RawInput) if (!WindowsInputImpl::RawInputEnabled)
OnMouseDown(mousePos, MouseButton::Middle, window); OnMouseDown(mousePos, MouseButton::Middle, window);
result = true; result = true;
break; break;
} }
case WM_XBUTTONDOWN: case WM_XBUTTONDOWN:
{ {
if (!WindowsInputImpl::RawInput) if (!WindowsInputImpl::RawInputEnabled)
{ {
const auto button = (HIWORD(wParam) & XBUTTON1) ? MouseButton::Extended1 : MouseButton::Extended2; const auto button = (HIWORD(wParam) & XBUTTON1) ? MouseButton::Extended1 : MouseButton::Extended2;
OnMouseDown(mousePos, button, window); OnMouseDown(mousePos, button, window);
@@ -378,28 +378,28 @@ bool WindowsMouse::WndProc(Window* window, const UINT msg, WPARAM wParam, LPARAM
} }
case WM_LBUTTONUP: case WM_LBUTTONUP:
{ {
if (!WindowsInputImpl::RawInput) if (!WindowsInputImpl::RawInputEnabled)
OnMouseUp(mousePos, MouseButton::Left, window); OnMouseUp(mousePos, MouseButton::Left, window);
result = true; result = true;
break; break;
} }
case WM_RBUTTONUP: case WM_RBUTTONUP:
{ {
if (!WindowsInputImpl::RawInput) if (!WindowsInputImpl::RawInputEnabled)
OnMouseUp(mousePos, MouseButton::Right, window); OnMouseUp(mousePos, MouseButton::Right, window);
result = true; result = true;
break; break;
} }
case WM_MBUTTONUP: case WM_MBUTTONUP:
{ {
if (!WindowsInputImpl::RawInput) if (!WindowsInputImpl::RawInputEnabled)
OnMouseUp(mousePos, MouseButton::Middle, window); OnMouseUp(mousePos, MouseButton::Middle, window);
result = true; result = true;
break; break;
} }
case WM_XBUTTONUP: case WM_XBUTTONUP:
{ {
if (!WindowsInputImpl::RawInput) if (!WindowsInputImpl::RawInputEnabled)
{ {
const auto button = (HIWORD(wParam) & XBUTTON1) ? MouseButton::Extended1 : MouseButton::Extended2; const auto button = (HIWORD(wParam) & XBUTTON1) ? MouseButton::Extended1 : MouseButton::Extended2;
OnMouseUp(mousePos, button, window); OnMouseUp(mousePos, button, window);
@@ -427,19 +427,23 @@ bool WindowsMouse::WndProc(Window* window, const UINT msg, WPARAM wParam, LPARAM
} }
case WM_MOUSEWHEEL: case WM_MOUSEWHEEL:
{ {
const short delta = GET_WHEEL_DELTA_WPARAM(wParam); if (!WindowsInputImpl::RawInputEnabled)
if (delta != 0)
{ {
const float deltaNormalized = static_cast<float>(delta) / WHEEL_DELTA; const int16 delta = GET_WHEEL_DELTA_WPARAM(wParam);
// Use cached mouse position, the input pos is sometimes wrong in Win32 if (delta != 0)
OnMouseWheel(_state.MousePosition, deltaNormalized, window); {
const float deltaNormalized = static_cast<float>(delta) / WHEEL_DELTA;
// Use cached mouse position, the input pos is sometimes wrong in Win32
OnMouseWheel(_state.MousePosition, deltaNormalized, window);
}
} }
result = true; result = true;
break; break;
} }
case WM_INPUT: case WM_INPUT:
{ {
result = OnRawInput(_state.MousePosition, window, reinterpret_cast<HRAWINPUT>(lParam)); if (WindowsInputImpl::RawInputEnabled)
result = OnRawInput(_state.MousePosition, window, reinterpret_cast<HRAWINPUT>(lParam));
break; break;
} }
} }