diff --git a/Windows/TouchInputHandler.cpp b/Windows/TouchInputHandler.cpp index 4aa412f41d..456f8792a6 100644 --- a/Windows/TouchInputHandler.cpp +++ b/Windows/TouchInputHandler.cpp @@ -44,15 +44,20 @@ void TouchInputHandler::handleTouchEvent(HWND hWnd, UINT message, WPARAM wParam, sizeof(TOUCHINPUT))) { for (UINT i = 0; i < inputCount; i++) { - int id = 0; + int id = -1; - // Find or allocate an id for the touch. - auto it = touchTranslate.find(inputs[i].dwID); - if (it != touchTranslate.end()) { - id = it->second; - } else { - id = (int)touchTranslate.size(); - touchTranslate[inputs[i].dwID] = id; + // Find or allocate an id for the touch. Avoid 0 (mouse.) + for (int localId = 1; localId < (int)ARRAY_SIZE(touchIds); ++localId) { + if (touchIds[localId] == inputs[i].dwID || touchIds[localId] == 0) { + touchIds[localId] = inputs[i].dwID; + id = localId; + break; + } + } + if (id == -1) { + id = 0; + // TODO: Better to just ignore this touch instead? + touchUp(id, 0, 0); } POINT point; @@ -71,7 +76,7 @@ void TouchInputHandler::handleTouchEvent(HWND hWnd, UINT message, WPARAM wParam, if (inputs[i].dwFlags & TOUCHEVENTF_UP) { touchUp(id, point.x, point.y); - touchTranslate.erase(touchTranslate.find(inputs[i].dwID)); + touchIds[id] = 0; } } } diff --git a/Windows/TouchInputHandler.h b/Windows/TouchInputHandler.h index bb19664092..3e404b3646 100644 --- a/Windows/TouchInputHandler.h +++ b/Windows/TouchInputHandler.h @@ -1,7 +1,5 @@ #pragma once -#include - typedef BOOL(WINAPI *getTouchInputProc)( HTOUCHINPUT hTouchInput, UINT cInputs, @@ -20,22 +18,22 @@ typedef BOOL(WINAPI *registerTouchProc)( class TouchInputHandler { -private: - std::map touchTranslate; - getTouchInputProc touchInfo; - closeTouchInputProc closeTouch; - registerTouchProc registerTouch; - public: TouchInputHandler(); ~TouchInputHandler(); void handleTouchEvent(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); void registerTouchWindow(HWND wnd); bool hasTouch(); + private: void disablePressAndHold(HWND hWnd); void touchUp(int id, float x, float y); void touchDown(int id, float x, float y); void touchMove(int id, float x, float y); + + int touchIds[10]; + getTouchInputProc touchInfo; + closeTouchInputProc closeTouch; + registerTouchProc registerTouch; }; diff --git a/ext/native/input/input_state.h b/ext/native/input/input_state.h index 38738dbff0..c648612e34 100644 --- a/ext/native/input/input_state.h +++ b/ext/native/input/input_state.h @@ -122,7 +122,7 @@ enum { struct TouchInput { float x; float y; - int id; + int id; // Needs to be <= GestureDetector::MAX_PTRS (10.) int flags; double timestamp; };