From 0088189eee8baf87070f1924a1e657164f9b2962 Mon Sep 17 00:00:00 2001 From: Woochan Lee Date: Mon, 9 Apr 2018 10:27:57 -0700 Subject: [PATCH] elementary: add new config value to handle tap finger size. Summary: The tap_finger_size value of the concept is different from the finger_size value used in the past. We need a minimum value for recognize the gesture as a tap or not. Since the actual screen has different screen sizes, there is a problem that the recognition rate of tap is lowered when using the existing value(finger_size) Test Plan: elementary_test -> gesture sample. Reviewers: cedric, woohyun, Jaehyun_Cho, herb, id213sin Subscribers: cedric Differential Revision: https://phab.enlightenment.org/D5842 Reviewed-by: Cedric BAIL Signed-off-by: Cedric BAIL --- config/default/base.src.in | 1 + config/mobile/base.src.in | 1 + config/standard/base.src.in | 1 + src/lib/elementary/elm_config.c | 6 +++++ src/lib/elementary/elm_gesture_layer.c | 32 ++++++++++++-------------- src/lib/elementary/elm_priv.h | 2 ++ 6 files changed, 26 insertions(+), 17 deletions(-) diff --git a/config/default/base.src.in b/config/default/base.src.in index 7e9444c10c..853625d3b4 100644 --- a/config/default/base.src.in +++ b/config/default/base.src.in @@ -72,6 +72,7 @@ group "Elm_Config" struct { value "glayer_long_tap_start_timeout" double: 1.2; /* sec to start long-tap */ value "glayer_double_tap_timeout" double: 0.25; /* Timeout between two mouse dows when doing double click (and more). */ value "glayer_continues_enable" uchar: 1; /* Continues gesture enabled */ + value "glayer_tap_finger_size" int: 10; value "week_start" int: 1; value "weekend_start" int: 6; value "weekend_len" int: 2; diff --git a/config/mobile/base.src.in b/config/mobile/base.src.in index 18d3612548..0fdb4f47ad 100644 --- a/config/mobile/base.src.in +++ b/config/mobile/base.src.in @@ -72,6 +72,7 @@ group "Elm_Config" struct { value "glayer_long_tap_start_timeout" double: 1.2; /* sec to start long-tap */ value "glayer_double_tap_timeout" double: 0.25; /* Timeout between two mouse dows when doing double click (and more). */ value "glayer_continues_enable" uchar: 1; /* Continues gesture enabled */ + value "glayer_tap_finger_size" int: 10; value "week_start" int: 1; value "weekend_start" int: 6; value "weekend_len" int: 2; diff --git a/config/standard/base.src.in b/config/standard/base.src.in index 9781512539..a79b07ba04 100644 --- a/config/standard/base.src.in +++ b/config/standard/base.src.in @@ -73,6 +73,7 @@ group "Elm_Config" struct { value "glayer_long_tap_start_timeout" double: 1.2; /* sec to start long-tap */ value "glayer_double_tap_timeout" double: 0.25; /* Timeout between two mouse dows when doing double click (and more). */ value "glayer_continues_enable" uchar: 1; /* Continues gesture enabled */ + value "glayer_tap_finger_size" int: 10; value "week_start" int: 1; value "weekend_start" int: 6; value "weekend_len" int: 2; diff --git a/src/lib/elementary/elm_config.c b/src/lib/elementary/elm_config.c index b2cbf99601..da29ddf0e7 100644 --- a/src/lib/elementary/elm_config.c +++ b/src/lib/elementary/elm_config.c @@ -461,6 +461,7 @@ _desc_init(void) ELM_CONFIG_VAL(D, T, glayer_flick_time_limit_ms, T_INT); ELM_CONFIG_VAL(D, T, glayer_long_tap_start_timeout, T_DOUBLE); ELM_CONFIG_VAL(D, T, glayer_double_tap_timeout, T_DOUBLE); + ELM_CONFIG_VAL(D, T, glayer_tap_finger_size, T_INT); ELM_CONFIG_VAL(D, T, access_mode, T_UCHAR); ELM_CONFIG_VAL(D, T, selection_clear_enable, T_UCHAR); ELM_CONFIG_VAL(D, T, glayer_continues_enable, T_UCHAR); @@ -1796,6 +1797,7 @@ _config_load(void) _elm_config->glayer_long_tap_start_timeout = 1.2; /* 1.2 second to start long-tap */ _elm_config->glayer_double_tap_timeout = 0.25; /* 0.25 seconds between 2 mouse downs of a tap. */ _elm_config->glayer_continues_enable = EINA_TRUE; /* Continue gestures default */ + _elm_config->glayer_tap_finger_size = 10; _elm_config->access_mode = ELM_ACCESS_MODE_OFF; _elm_config->selection_clear_enable = EINA_FALSE; _elm_config->week_start = 1; /* monday */ @@ -1955,6 +1957,7 @@ _elm_config_reload_do(void) KEEP_VAL(glayer_flick_time_limit_ms); KEEP_VAL(glayer_long_tap_start_timeout); KEEP_VAL(glayer_double_tap_timeout); + KEEP_VAL(glayer_tap_finger_size); KEEP_VAL(access_mode); KEEP_VAL(glayer_continues_enable); KEEP_VAL(week_start); @@ -2813,6 +2816,9 @@ _env_get(void) s = getenv("ELM_POPUP_SCROLLABLE"); if (s) _elm_config->popup_scrollable = atoi(s); + s = getenv("ELM_GLAYER_TAP_FINGER_SIZE"); + if (s) _elm_config->glayer_tap_finger_size = atoi(s); + s = getenv("EFL_UI_DND_DRAG_ANIM_DURATION"); if (s) _elm_config->drag_anim_duration = _elm_atof(s); } diff --git a/src/lib/elementary/elm_gesture_layer.c b/src/lib/elementary/elm_gesture_layer.c index 0dec106de9..143ae645ca 100644 --- a/src/lib/elementary/elm_gesture_layer.c +++ b/src/lib/elementary/elm_gesture_layer.c @@ -1657,7 +1657,7 @@ _taps_rect_get(Eina_List *taps, int idx, Eina_Rectangle *r) * @ingroup Elm_Gesture_Layer */ static Eina_Bool -_tap_gesture_check_finish(Gesture_Info *gesture, Evas_Coord tap_finger_size) +_tap_gesture_check_finish(Gesture_Info *gesture) { /* Here we check if taps-gesture was completed successfully */ /* Count how many taps were received on each device then */ @@ -1668,8 +1668,8 @@ _tap_gesture_check_finish(Gesture_Info *gesture, Evas_Coord tap_finger_size) Eina_List *pe_list; Eina_Rectangle base = {0, 0, 0, 0}; Eina_Rectangle tmp = {0, 0, 0, 0}; - if (!tap_finger_size) /* Use system default if not set by user */ - tap_finger_size = elm_config_finger_size_get(); + + ELM_GESTURE_LAYER_DATA_GET(gesture->obj, sd); if (!st->l) return EINA_FALSE; EINA_LIST_FOREACH(st->l, l, pe_list) @@ -1690,16 +1690,16 @@ _tap_gesture_check_finish(Gesture_Info *gesture, Evas_Coord tap_finger_size) { /* Compare all other rects to base, tolerance is finger size */ if (_taps_rect_get(st->l, i, &tmp)) { - if (abs(tmp.x - base.x) > tap_finger_size) + if (abs(tmp.x - base.x) > sd->tap_finger_size) return EINA_FALSE; - if (abs(tmp.y - base.y) > tap_finger_size) + if (abs(tmp.y - base.y) > sd->tap_finger_size) return EINA_FALSE; - if (abs((tmp.x + tmp.w) - (base.x + base.w)) > tap_finger_size) + if (abs((tmp.x + tmp.w) - (base.x + base.w)) > sd->tap_finger_size) return EINA_FALSE; - if (abs((tmp.y + tmp.h) - (base.y + base.h)) > tap_finger_size) + if (abs((tmp.y + tmp.h) - (base.y + base.h)) > sd->tap_finger_size) return EINA_FALSE; } } @@ -1717,14 +1717,14 @@ _tap_gesture_check_finish(Gesture_Info *gesture, Evas_Coord tap_finger_size) * @ingroup Elm_Gesture_Layer */ static void -_tap_gesture_finish(void *data, Evas_Coord tap_finger_size) +_tap_gesture_finish(void *data) { /* This function will test each tap gesture when timer expires */ Elm_Gesture_State s = ELM_GESTURE_STATE_ABORT; Gesture_Info *gesture = data; Taps_Type *st = gesture->data; - if (_tap_gesture_check_finish(gesture, tap_finger_size)) + if (_tap_gesture_check_finish(gesture)) { s = ELM_GESTURE_STATE_END; } @@ -1750,16 +1750,13 @@ _multi_tap_timeout(void *data) ELM_GESTURE_LAYER_DATA_GET(data, sd); if (IS_TESTED(ELM_GESTURE_N_TAPS)) - _tap_gesture_finish(sd->gesture[ELM_GESTURE_N_TAPS], - sd->tap_finger_size); + _tap_gesture_finish(sd->gesture[ELM_GESTURE_N_TAPS]); if (IS_TESTED(ELM_GESTURE_N_DOUBLE_TAPS)) - _tap_gesture_finish(sd->gesture[ELM_GESTURE_N_DOUBLE_TAPS], - sd->tap_finger_size); + _tap_gesture_finish(sd->gesture[ELM_GESTURE_N_DOUBLE_TAPS]); if (IS_TESTED(ELM_GESTURE_N_TRIPLE_TAPS)) - _tap_gesture_finish(sd->gesture[ELM_GESTURE_N_TRIPLE_TAPS], - sd->tap_finger_size); + _tap_gesture_finish(sd->gesture[ELM_GESTURE_N_TRIPLE_TAPS]); _clear_if_finished(data); sd->gest_taps_timeout = NULL; @@ -1950,9 +1947,9 @@ _tap_gesture_test(Evas_Object *obj, ((gesture->g_type == ELM_GESTURE_N_DOUBLE_TAPS) && !IS_TESTED(ELM_GESTURE_N_TRIPLE_TAPS))) { /* Test for finish immediately, not waiting for timeout */ - if (_tap_gesture_check_finish(gesture, sd->tap_finger_size)) + if (_tap_gesture_check_finish(gesture)) { - _tap_gesture_finish(gesture, sd->tap_finger_size); + _tap_gesture_finish(gesture); return; } } @@ -3772,6 +3769,7 @@ _elm_gesture_layer_efl_canvas_group_group_add(Eo *obj, Elm_Gesture_Layer_Data *p priv->long_tap_start_timeout = _elm_config->glayer_long_tap_start_timeout; priv->repeat_events = EINA_TRUE; priv->glayer_continues_enable = _elm_config->glayer_continues_enable; + priv->tap_finger_size = _elm_config->glayer_tap_finger_size; /* FIXME: Hack to get around old configs - if too small, enlarge. */ if (_elm_config->glayer_double_tap_timeout < 0.00001) diff --git a/src/lib/elementary/elm_priv.h b/src/lib/elementary/elm_priv.h index fc67a74fc7..883833a1f6 100644 --- a/src/lib/elementary/elm_priv.h +++ b/src/lib/elementary/elm_priv.h @@ -290,6 +290,7 @@ struct _Elm_Config_Flags Eina_Bool glayer_flick_time_limit_ms : 1; // unused Eina_Bool glayer_long_tap_start_timeout : 1; Eina_Bool glayer_double_tap_timeout : 1; + Eina_Bool glayer_tap_finger_size : 1; Eina_Bool access_mode : 1; Eina_Bool glayer_continues_enable : 1; // unused Eina_Bool week_start : 1; // unused @@ -425,6 +426,7 @@ struct _Elm_Config unsigned int glayer_flick_time_limit_ms; double glayer_long_tap_start_timeout; double glayer_double_tap_timeout; + int glayer_tap_finger_size; Eina_Bool access_mode; unsigned char glayer_continues_enable; int week_start;