diff options
author | Mike Blumenkrantz <zmike@samsung.com> | 2020-01-13 15:08:16 -0500 |
---|---|---|
committer | Mike Blumenkrantz <zmike@samsung.com> | 2020-01-23 15:24:42 -0500 |
commit | 8870ca45e2de71328a3e4c66f82f6c3a12031ed7 (patch) | |
tree | 091396cdaa843f6810ed6e2841c0eeab51e88fbc | |
parent | 5741ed6d0a3b905eeb9b2fa253a568ea6239a3fa (diff) | |
download | efl-8870ca45e2de71328a3e4c66f82f6c3a12031ed7.tar.gz |
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
Differential Revision: https://phab.enlightenment.org/D11087
3 files changed, 29 insertions, 0 deletions
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..047b363029 100644 --- a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_flick.c +++ b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_flick.c @@ -204,9 +204,18 @@ _efl_canvas_gesture_recognizer_flick_efl_canvas_gesture_recognizer_recognize(Eo pd->touched = EINA_TRUE; pd->line_angle = -1.0; rd->continues = EINA_TRUE; + 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 +309,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; } |