From 233f7611da96ea6bc0b7c62f6a06dacef707f9d7 Mon Sep 17 00:00:00 2001
From: victorfisac <victorfisac@gmail.com>
Date: Fri, 22 Jan 2016 17:07:54 +0100
Subject: [PATCH] Fixed hold gesture detection

- Fixed gestures hold detection.
- Improved hold state detection for little touch position increments
(sensitivity).
---
 src/gestures.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/src/gestures.c b/src/gestures.c
index 88cdb528d..ea744555a 100644
--- a/src/gestures.c
+++ b/src/gestures.c
@@ -217,8 +217,13 @@ void ProcessGestureEvent(GestureEvent event)
                     angle = CalculateAngle(initialDragPosition, endDragPosition, magnitude);
                     intensity = magnitude / (float)draggingTimeCounter;
                     
-                    currentGesture = GESTURE_DRAG;
-                    draggingTimeCounter++;
+                    // Check if drag movement is less than minimum to keep it as hold state or switch to drag state
+                    if(magnitude > FORCE_TO_SWIPE)
+                    {
+                        currentGesture = GESTURE_DRAG;
+                        draggingTimeCounter++;
+                    }
+                    else currentGesture = GESTURE_HOLD;
                 }
             }
         } break;
@@ -339,8 +344,13 @@ void UpdateGestures(void)
 {
     // NOTE: Gestures are processed through system callbacks on touch events
     
-    if ((previousGesture == GESTURE_TAP) && (currentGesture == GESTURE_TAP)) currentGesture = GESTURE_HOLD;
-    else if (currentGesture != GESTURE_HOLD) currentGesture = GESTURE_NONE;
+    // When screen is touched, in first frame GESTURE_TAP is called but in next frame touch event callback is not called (if touch position doesn't change),
+    // so we need to store previous frame gesture type manually in this update function to switch to HOLD if current gesture is
+    // GESTURE_TAP two frames in a row. Due to current gesture is set to HOLD, current gesture doesn't need to be reset to NONE every frame.
+    // It will be reset when UP is called.
+    if(currentGesture == GESTURE_TAP) previousGesture = currentGesture;
+    
+    if(previousGesture == GESTURE_TAP && currentGesture == GESTURE_TAP) currentGesture = GESTURE_HOLD;
 }
 
 //----------------------------------------------------------------------------------