bu5hm4n pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=89b35b3f790b4359cf97b67cd8b4bb429a083c97

commit 89b35b3f790b4359cf97b67cd8b4bb429a083c97
Author: Mike Blumenkrantz <[email protected]>
Date:   Mon Jan 13 15:08:16 2020 -0500

    efl/gesture: restrict flick and momentum gestures to original touch point
    
    if multiple fingers are pressed down, filter and use only the first finger
    to make gesture recognizing more accurate
    
    this may change later once tests develop
    
    Reviewed-by: woochan lee <[email protected]>
    Differential Revision: https://phab.enlightenment.org/D11087
---
 src/lib/evas/gesture/efl_canvas_gesture_private.h    |  2 ++
 .../gesture/efl_canvas_gesture_recognizer_flick.c    | 20 +++++++++++++++++++-
 .../gesture/efl_canvas_gesture_recognizer_momentum.c | 15 +++++++++++++++
 3 files changed, 36 insertions(+), 1 deletion(-)

diff --git a/src/lib/evas/gesture/efl_canvas_gesture_private.h 
b/src/lib/evas/gesture/efl_canvas_gesture_private.h
index 973a6d224e..45c13a7776 100644
--- a/src/lib/evas/gesture/efl_canvas_gesture_private.h
+++ b/src/lib/evas/gesture/efl_canvas_gesture_private.h
@@ -134,11 +134,13 @@ struct _Efl_Canvas_Gesture_Data
 
 struct _Efl_Canvas_Gesture_Momentum_Data
 {
+   int id;
    Eina_Vector2                    momentum;
 };
 
 struct _Efl_Canvas_Gesture_Flick_Data
 {
+   int id;
    Eina_Vector2                    momentum;
    double                          angle;
 };
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_flick.c 
b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_flick.c
index 3529381df6..80454164f9 100644
--- a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_flick.c
+++ b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_flick.c
@@ -180,6 +180,7 @@ 
_efl_canvas_gesture_recognizer_flick_efl_canvas_gesture_recognizer_recognize(Eo
    Eina_Bool touch_up = EINA_FALSE;
    Efl_Canvas_Gesture_Flick_Data *fd = efl_data_scope_get(gesture, 
EFL_CANVAS_GESTURE_FLICK_CLASS);
    Efl_Canvas_Gesture_Recognizer_Data *rd = efl_data_scope_get(obj, 
EFL_CANVAS_GESTURE_RECOGNIZER_CLASS);
+   Eina_Bool dead = EINA_FALSE;
 
    val = efl_gesture_recognizer_config_get(obj, "glayer_continues_enable");
    if (val) eina_value_get(val, &glayer_continues_enable);
@@ -197,16 +198,30 @@ 
_efl_canvas_gesture_recognizer_flick_efl_canvas_gesture_recognizer_recognize(Eo
 
    //This is to handle a case with a mouse click on the target object.
    if (efl_gesture_touch_state_get(event) == EFL_GESTURE_TOUCH_STATE_END && 
!pd->touched)
-     efl_gesture_manager_gesture_clean_up(rd->manager, watched, 
EFL_EVENT_GESTURE_FLICK);
+     {
+        efl_gesture_manager_gesture_clean_up(rd->manager, watched, 
EFL_EVENT_GESTURE_FLICK);
+        dead = EINA_TRUE;
+     }
 
    if (glayer_continues_enable && !pd->touched)
      {
         pd->touched = EINA_TRUE;
         pd->line_angle = -1.0;
         rd->continues = EINA_TRUE;
+        /* this has been deleted */
+        if (!dead)
+          fd->id = -1;
 
         return EFL_GESTURE_RECOGNIZER_RESULT_IGNORE;
      }
+   if (pd->touched && (efl_gesture_touch_cur_data_get(event)->action == 
EFL_POINTER_ACTION_DOWN))
+     {
+        /* a second finger was pressed at the same time-ish as the first: 
combine into same event */
+        if (efl_gesture_touch_cur_timestamp_get(event) - 
efl_gesture_timestamp_get(gesture) < TAP_TOUCH_TIME_THRESHOLD)
+          return EFL_GESTURE_RECOGNIZER_RESULT_IGNORE;
+     }
+   if (pd->t_st && (fd->id != efl_gesture_touch_cur_data_get(event)->id))
+     return EFL_GESTURE_RECOGNIZER_RESULT_IGNORE;
 
    _single_line_process(obj, pd, gesture, fd, event);
    _vector_get(pd->st_line, efl_gesture_touch_cur_point_get(event),
@@ -300,6 +315,9 @@ 
_efl_canvas_gesture_recognizer_flick_efl_canvas_gesture_recognizer_recognize(Eo
    switch (efl_gesture_touch_state_get(event))
      {
       case EFL_GESTURE_TOUCH_STATE_BEGIN:
+        if (!glayer_continues_enable)
+          fd->id = efl_gesture_touch_cur_data_get(event)->id;
+        EINA_FALLTHROUGH;
       case EFL_GESTURE_TOUCH_STATE_UPDATE:
       {
          if (pd->t_st)
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_momentum.c 
b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_momentum.c
index 77f433e264..f2041df8f2 100644
--- a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_momentum.c
+++ b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_momentum.c
@@ -91,6 +91,14 @@ 
_efl_canvas_gesture_recognizer_momentum_efl_canvas_gesture_recognizer_recognize(
 
         return EFL_GESTURE_RECOGNIZER_RESULT_IGNORE;
      }
+   if (pd->touched && (efl_gesture_touch_cur_data_get(event)->action == 
EFL_POINTER_ACTION_DOWN))
+     {
+        /* a second finger was pressed at the same time-ish as the first: 
combine into same event */
+        if (efl_gesture_touch_cur_timestamp_get(event) - 
efl_gesture_timestamp_get(gesture) < TAP_TOUCH_TIME_THRESHOLD)
+          return EFL_GESTURE_RECOGNIZER_RESULT_IGNORE;
+     }
+   if (pd->t_st && (md->id != efl_gesture_touch_cur_data_get(event)->id))
+     return EFL_GESTURE_RECOGNIZER_RESULT_IGNORE;
 
    switch (efl_gesture_touch_state_get(event))
      {
@@ -102,12 +110,19 @@ 
_efl_canvas_gesture_recognizer_momentum_efl_canvas_gesture_recognizer_recognize(
               if (efl_gesture_touch_state_get(event) == 
EFL_GESTURE_TOUCH_STATE_BEGIN ||
                   glayer_continues_enable)
                 {
+                   if (efl_gesture_touch_prev_data_get(event))
+                     {
+                        if (efl_gesture_touch_prev_data_get(event)->action == 
efl_gesture_touch_cur_data_get(event)->action)
+                          return EFL_GESTURE_RECOGNIZER_RESULT_IGNORE;
+                     }
                    pd->t_st = pd->t_end = 
efl_gesture_touch_cur_timestamp_get(event);
 
                    pd->st_line = pd->end_line =
                        efl_gesture_touch_start_point_get(event);
 
                    efl_gesture_hotspot_set(gesture, pd->st_line);
+                   if (!glayer_continues_enable)
+                     md->id = efl_gesture_touch_cur_data_get(event)->id;
 
                    return EFL_GESTURE_RECOGNIZER_RESULT_TRIGGER;
                 }

-- 


Reply via email to