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; } --
