bu5hm4n pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=15527dbecb4b8f889e4f74cd60f835ea1a71b625

commit 15527dbecb4b8f889e4f74cd60f835ea1a71b625
Author: Mike Blumenkrantz <[email protected]>
Date:   Mon Jan 13 15:07:17 2020 -0500

    efl/gesture: handle multi-touch press for tap gestures
    
    any time multiple fingers are pressed down at the same time, we should
    treat this as a single gesture like if only one finger was pressed
    
    Reviewed-by: woochan lee <[email protected]>
    Differential Revision: https://phab.enlightenment.org/D11086
---
 src/lib/evas/gesture/efl_canvas_gesture_private.h  |  3 +++
 .../efl_canvas_gesture_recognizer_double_tap.c     | 24 ++++++++++++++++++++++
 .../gesture/efl_canvas_gesture_recognizer_tap.c    | 14 +++++++++++++
 .../efl_canvas_gesture_recognizer_triple_tap.c     | 24 ++++++++++++++++++++++
 4 files changed, 65 insertions(+)

diff --git a/src/lib/evas/gesture/efl_canvas_gesture_private.h 
b/src/lib/evas/gesture/efl_canvas_gesture_private.h
index e24dea8307..973a6d224e 100644
--- a/src/lib/evas/gesture/efl_canvas_gesture_private.h
+++ b/src/lib/evas/gesture/efl_canvas_gesture_private.h
@@ -8,6 +8,9 @@
 
 #include <Ecore.h>
 
+/* milliseconds */
+#define TAP_TOUCH_TIME_THRESHOLD (0.1 * 1000)
+
 const Efl_Event_Description * _efl_gesture_type_get(const Eo *obj);
 void efl_gesture_manager_gesture_clean_up(Eo *obj, Eo *target, const 
Efl_Event_Description *type);
 
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_double_tap.c 
b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_double_tap.c
index c676e0e515..cee5d88fa0 100644
--- a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_double_tap.c
+++ b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_double_tap.c
@@ -89,6 +89,16 @@ 
_efl_canvas_gesture_recognizer_double_tap_efl_canvas_gesture_recognizer_recogniz
 
       case EFL_GESTURE_TOUCH_STATE_UPDATE:
       {
+        /* multi-touch */
+        if (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)
+               {
+                  result = EFL_GESTURE_RECOGNIZER_RESULT_IGNORE;
+                  break;
+               }
+          }
          result = EFL_GESTURE_RECOGNIZER_RESULT_IGNORE;
 
          if (efl_gesture_state_get(gesture) != EFL_GESTURE_STATE_NONE &&
@@ -119,6 +129,20 @@ 
_efl_canvas_gesture_recognizer_double_tap_efl_canvas_gesture_recognizer_recogniz
          if (efl_gesture_state_get(gesture) != EFL_GESTURE_STATE_NONE &&
              !efl_gesture_touch_multi_touch_get(event))
            {
+              if (efl_gesture_touch_prev_data_get(event))
+                {
+                   Efl_Pointer_Action prev_act = 
efl_gesture_touch_prev_data_get(event)->action;
+                   /* multi-touch */
+                   if ((prev_act == EFL_POINTER_ACTION_UP) || (prev_act == 
EFL_POINTER_ACTION_CANCEL))
+                     {
+                        /* 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)
+                          {
+                             result = EFL_GESTURE_RECOGNIZER_RESULT_IGNORE;
+                             break;
+                          }
+                     }
+                }
               dist = efl_gesture_touch_distance(event, 0);
               length = fabs(dist.x) + fabs(dist.y);
 
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_tap.c 
b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_tap.c
index 582c2f47b0..0deb30f607 100644
--- a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_tap.c
+++ b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_tap.c
@@ -46,6 +46,7 @@ 
_efl_canvas_gesture_recognizer_tap_efl_canvas_gesture_recognizer_recognize(Eo *o
      {
       case EFL_GESTURE_TOUCH_STATE_BEGIN:
       {
+new_tap:
          pos = efl_gesture_touch_start_point_get(event);
          efl_gesture_hotspot_set(gesture, pos);
 
@@ -59,6 +60,19 @@ 
_efl_canvas_gesture_recognizer_tap_efl_canvas_gesture_recognizer_recognize(Eo *o
       }
 
       case EFL_GESTURE_TOUCH_STATE_UPDATE:
+        /* multi-touch */
+        if (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)
+               {
+                  result = EFL_GESTURE_RECOGNIZER_RESULT_IGNORE;
+                  break;
+               }
+             /* another distinct touch occurred, treat this as a new touch */
+             goto new_tap;
+          }
+        EINA_FALLTHROUGH;
       case EFL_GESTURE_TOUCH_STATE_END:
       {
          if (pd->timeout)
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_triple_tap.c 
b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_triple_tap.c
index 99d651aa6a..009742c1b6 100644
--- a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_triple_tap.c
+++ b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_triple_tap.c
@@ -89,6 +89,16 @@ 
_efl_canvas_gesture_recognizer_triple_tap_efl_canvas_gesture_recognizer_recogniz
 
       case EFL_GESTURE_TOUCH_STATE_UPDATE:
       {
+        /* multi-touch */
+        if (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)
+               {
+                  result = EFL_GESTURE_RECOGNIZER_RESULT_IGNORE;
+                  break;
+               }
+          }
          result = EFL_GESTURE_RECOGNIZER_RESULT_IGNORE;
 
          if (efl_gesture_state_get(gesture) != EFL_GESTURE_STATE_NONE &&
@@ -119,6 +129,20 @@ 
_efl_canvas_gesture_recognizer_triple_tap_efl_canvas_gesture_recognizer_recogniz
          if (efl_gesture_state_get(gesture) != EFL_GESTURE_STATE_NONE &&
              !efl_gesture_touch_multi_touch_get(event))
            {
+              if (efl_gesture_touch_prev_data_get(event))
+                {
+                   Efl_Pointer_Action prev_act = 
efl_gesture_touch_prev_data_get(event)->action;
+                   /* multi-touch */
+                   if ((prev_act == EFL_POINTER_ACTION_UP) || (prev_act == 
EFL_POINTER_ACTION_CANCEL))
+                     {
+                        /* 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)
+                          {
+                             result = EFL_GESTURE_RECOGNIZER_RESULT_IGNORE;
+                             break;
+                          }
+                     }
+                }
               dist = efl_gesture_touch_distance(event, 0);
               length = fabs(dist.x) + fabs(dist.y);
 

-- 


Reply via email to