From 994e99c94d44b71ef6c9363bac3fc660f400ebc7 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Tue, 11 Apr 2017 18:48:40 -0700 Subject: [PATCH] Windows: Fix mismatch on multitouch finger up. Fixes buttons "sticking". --- Windows/TouchInputHandler.cpp | 61 +++++++++++++++++++++-------------- Windows/TouchInputHandler.h | 2 ++ 2 files changed, 38 insertions(+), 25 deletions(-) diff --git a/Windows/TouchInputHandler.cpp b/Windows/TouchInputHandler.cpp index 766364987c..36b7726b6a 100644 --- a/Windows/TouchInputHandler.cpp +++ b/Windows/TouchInputHandler.cpp @@ -33,32 +33,40 @@ TouchInputHandler::~TouchInputHandler() { } +int TouchInputHandler::ToTouchID(int windowsID, bool allowAllocate) { + // Find the id for the touch. Avoid 0 (mouse.) + for (int localId = 1; localId < (int)ARRAY_SIZE(touchIds); ++localId) { + if (touchIds[localId] == windowsID) { + return localId; + } + } + + // Allocate a new one, perhaps? + if (allowAllocate) { + for (int localId = 1; localId < (int)ARRAY_SIZE(touchIds); ++localId) { + if (touchIds[localId] == 0) { + touchIds[localId] = windowsID; + return localId; + } + } + + // None were free. + // TODO: Better to just ignore this touch instead? + touchUp(0, 0, 0); + return 0; + } + + return -1; +} + void TouchInputHandler::handleTouchEvent(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { - if (hasTouch()){ + if (hasTouch()) { UINT inputCount = LOWORD(wParam); + HTOUCHINPUT touchInputData = (HTOUCHINPUT) lParam; TOUCHINPUT *inputs = new TOUCHINPUT[inputCount]; - if (touchInfo((HTOUCHINPUT) lParam, - inputCount, - inputs, - sizeof(TOUCHINPUT))) { + if (touchInfo(touchInputData, inputCount, inputs, sizeof(TOUCHINPUT))) { for (UINT i = 0; i < inputCount; i++) { - int id = -1; - - // 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; point.x = (float)(TOUCH_COORD_TO_PIXEL(inputs[i].x)); point.y = (float)(TOUCH_COORD_TO_PIXEL(inputs[i].y)); @@ -66,14 +74,17 @@ void TouchInputHandler::handleTouchEvent(HWND hWnd, UINT message, WPARAM wParam, point.x *= g_dpi_scale; point.y *= g_dpi_scale; if (inputs[i].dwFlags & TOUCHEVENTF_DOWN) { - touchDown(id, point.x, point.y); + touchDown(ToTouchID(inputs[i].dwID), point.x, point.y); } if (inputs[i].dwFlags & TOUCHEVENTF_MOVE) { - touchMove(id, point.x, point.y); + touchMove(ToTouchID(inputs[i].dwID), point.x, point.y); } if (inputs[i].dwFlags & TOUCHEVENTF_UP) { - touchUp(id, point.x, point.y); - touchIds[id] = 0; + int id = ToTouchID(inputs[i].dwID, false); + if (id >= 0) { + touchUp(id, point.x, point.y); + touchIds[id] = 0; + } } } } diff --git a/Windows/TouchInputHandler.h b/Windows/TouchInputHandler.h index 3e404b3646..429641d752 100644 --- a/Windows/TouchInputHandler.h +++ b/Windows/TouchInputHandler.h @@ -26,6 +26,8 @@ public: bool hasTouch(); private: + int ToTouchID(int windowsID, bool allowAllocate = true); + void disablePressAndHold(HWND hWnd); void touchUp(int id, float x, float y); void touchDown(int id, float x, float y);