summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Blumenkrantz <zmike@samsung.com>2020-01-13 15:08:16 -0500
committerMike Blumenkrantz <zmike@samsung.com>2020-01-23 15:24:42 -0500
commit8870ca45e2de71328a3e4c66f82f6c3a12031ed7 (patch)
tree091396cdaa843f6810ed6e2841c0eeab51e88fbc
parent5741ed6d0a3b905eeb9b2fa253a568ea6239a3fa (diff)
downloadefl-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
-rw-r--r--src/lib/evas/gesture/efl_canvas_gesture_private.h2
-rw-r--r--src/lib/evas/gesture/efl_canvas_gesture_recognizer_flick.c12
-rw-r--r--src/lib/evas/gesture/efl_canvas_gesture_recognizer_momentum.c15
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;
}