summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorDenis Pobedrya <[email protected]>2022-09-19 00:01:10 +0300
committerGitHub <[email protected]>2022-09-18 23:01:10 +0200
commit27781a4767afdb60a9bea452a910fa4d53d85461 (patch)
treeaa69984004087ff6735884dc3afd85eb3cc71be8 /src
parent7e3a50b4acea0bbedbf121aad4f36431c2e09907 (diff)
downloadraylib-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.
Diffstat (limited to 'src')
-rw-r--r--src/rcore.c22
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