From 15527dbecb4b8f889e4f74cd60f835ea1a71b625 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 13 Jan 2020 15:07:17 -0500 Subject: [PATCH] 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 Differential Revision: https://phab.enlightenment.org/D11086 --- .../evas/gesture/efl_canvas_gesture_private.h | 3 +++ ...efl_canvas_gesture_recognizer_double_tap.c | 24 +++++++++++++++++++ .../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 +/* 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);