diff options
| author | Denis Pobedrya <[email protected]> | 2022-09-19 00:01:10 +0300 |
|---|---|---|
| committer | GitHub <[email protected]> | 2022-09-18 23:01:10 +0200 |
| commit | 27781a4767afdb60a9bea452a910fa4d53d85461 (patch) | |
| tree | aa69984004087ff6735884dc3afd85eb3cc71be8 | |
| parent | 7e3a50b4acea0bbedbf121aad4f36431c2e09907 (diff) | |
| download | raylib-27781a4767afdb60a9bea452a910fa4d53d85461.tar.gz raylib-27781a4767afdb60a9bea452a910fa4d53d85461.zip | |
Remove touch points on touch up events on Android (#2711)
Fixes #2683
Remove elements from touch point related arrays when touch up and
similar events are processed. This makes GetTouchPointCount() always
report the actual count of touch points, and all positions returned by
GetTouchPosition() correspond to positions of currently happening
touches.
| -rw-r--r-- | src/rcore.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/src/rcore.c b/src/rcore.c index 5605a75f..1b00b14f 100644 --- a/src/rcore.c +++ b/src/rcore.c @@ -5755,9 +5755,6 @@ static int32_t AndroidInputCallback(struct android_app *app, AInputEvent *event) int32_t action = AMotionEvent_getAction(event); unsigned int flags = action & AMOTION_EVENT_ACTION_MASK; - if (flags == AMOTION_EVENT_ACTION_DOWN || flags == AMOTION_EVENT_ACTION_MOVE) CORE.Input.Touch.currentTouchState[MOUSE_BUTTON_LEFT] = 1; - else if (flags == AMOTION_EVENT_ACTION_UP) CORE.Input.Touch.currentTouchState[MOUSE_BUTTON_LEFT] = 0; - #if defined(SUPPORT_GESTURES_SYSTEM) // PLATFORM_ANDROID GestureEvent gestureEvent = { 0 }; @@ -5779,6 +5776,25 @@ static int32_t AndroidInputCallback(struct android_app *app, AInputEvent *event) ProcessGestureEvent(gestureEvent); #endif + int32_t pointerIndex = (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT; + + if (flags == AMOTION_EVENT_ACTION_POINTER_UP || flags == AMOTION_EVENT_ACTION_UP) + { + // One of the touchpoints is released, remove it from touch point arrays + for (int i = pointerIndex; (i < CORE.Input.Touch.pointCount-1) && (i < MAX_TOUCH_POINTS); i++) + { + CORE.Input.Touch.pointId[i] = CORE.Input.Touch.pointId[i+1]; + CORE.Input.Touch.position[i] = CORE.Input.Touch.position[i+1]; + } + CORE.Input.Touch.pointCount--; + } + + // When all touchpoints are tapped and released really quickly, this event is generated + if (flags == AMOTION_EVENT_ACTION_CANCEL) CORE.Input.Touch.pointCount = 0; + + if (CORE.Input.Touch.pointCount > 0) CORE.Input.Touch.currentTouchState[MOUSE_BUTTON_LEFT] = 1; + else CORE.Input.Touch.currentTouchState[MOUSE_BUTTON_LEFT] = 0; + return 0; } #endif |
