From: tasn Date: Thu, 8 Sep 2011 10:10:30 +0000 (+0000) Subject: Elm glayer: Cleaned elm_gesture_layer.c. X-Git-Tag: REL_F_I9200_20111025_1~10^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b8a08e364d479904924c5f5784a83799cf67b9b1;p=framework%2Fuifw%2Felementary.git Elm glayer: Cleaned elm_gesture_layer.c. Signed-off-by: Aharon Hillel git-svn-id: https://svn.enlightenment.org/svn/e/trunk/elementary@63286 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- diff --git a/config/default/base.src b/config/default/base.src index f144a9c..a0de3a2 100644 --- a/config/default/base.src +++ b/config/default/base.src @@ -49,4 +49,5 @@ group "Elm_Config" struct { value "glayer_line_angular_tolerance" double: 0.34906585; /* Represents 20 DEG */ value "glayer_flick_time_limit_ms" uint: 60; /* 60 ms to finish flick */ value "glayer_long_tap_start_timeout" double: 1.2; /* 1.2 sec to start long-tap */ + value "glayer_continues_enable" uchar: 1; /* Continues gesture enabled */ } diff --git a/config/standard/base.src b/config/standard/base.src index c967fbc..78c7d75 100644 --- a/config/standard/base.src +++ b/config/standard/base.src @@ -53,4 +53,5 @@ group "Elm_Config" struct { value "glayer_line_angular_tolerance" double: 0.34906585; /* Represents 20 DEG */ value "glayer_flick_time_limit_ms" uint: 60; /* 60 ms to finish flick */ value "glayer_long_tap_start_timeout" double: 1.2; /* 1.2 sec to start long-tap */ + value "glayer_continues_enable" uchar: 1; /* Continues gesture enabled */ } diff --git a/src/lib/elm_config.c b/src/lib/elm_config.c index 4a3edc3..2c3cc14 100644 --- a/src/lib/elm_config.c +++ b/src/lib/elm_config.c @@ -626,6 +626,8 @@ _desc_init(void) ELM_CONFIG_VAL(D, T, glayer_line_angular_tolerance, T_DOUBLE); 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, access_mode, T_INT); + ELM_CONFIG_VAL(D, T, glayer_continues_enable, T_UCHAR); #undef T #undef D #undef T_INT @@ -1194,6 +1196,7 @@ _config_load(void) _elm_config->glayer_line_angular_tolerance = 0.34906585; /* Represents 20 DEG */ _elm_config->glayer_flick_time_limit_ms = 60; /* 60 ms to finish flick */ _elm_config->glayer_long_tap_start_timeout = 1.2; /* 1.2 second to start long-tap */ + _elm_config->glayer_continues_enable = EINA_TRUE; /* Continue gestures default */ } static const char * diff --git a/src/lib/elm_gesture_layer.c b/src/lib/elm_gesture_layer.c index e37ba7e..8ef568f 100644 --- a/src/lib/elm_gesture_layer.c +++ b/src/lib/elm_gesture_layer.c @@ -171,7 +171,7 @@ struct _Momentum_Type Evas_Coord_Point line_end; unsigned int t_st_x; /* Time start on X */ unsigned int t_st_y; /* Time start on Y */ - unsigned int t_end; /* Time end */ + unsigned int t_end; /* Time end */ int xdir, ydir; }; typedef struct _Momentum_Type Momentum_Type; @@ -205,8 +205,8 @@ struct _Zoom_Type Evas_Event_Mouse_Wheel *zoom_wheel; Evas_Coord zoom_base; /* Holds gap between fingers on zoom-start */ Evas_Coord zoom_distance_tolerance; - Elm_Gesture_Momentum_Info momentum1; /* For continues gesture */ - Elm_Gesture_Momentum_Info momentum2; /* For continues gesture */ + Elm_Gesture_Momentum_Info momentum1; /* For continues gesture */ + Elm_Gesture_Momentum_Info momentum2; /* For continues gesture */ double next_step; }; typedef struct _Zoom_Type Zoom_Type; @@ -220,8 +220,8 @@ struct _Rotate_Type Pointer_Event rotate_mv1; double rotate_angular_tolerance; double next_step; - Elm_Gesture_Momentum_Info momentum1; /* For continues gesture */ - Elm_Gesture_Momentum_Info momentum2; /* For continues gesture */ + Elm_Gesture_Momentum_Info momentum1; /* For continues gesture */ + Elm_Gesture_Momentum_Info momentum2; /* For continues gesture */ }; typedef struct _Rotate_Type Rotate_Type; @@ -239,6 +239,7 @@ struct _Widget_Data double rotate_angular_tolerance; unsigned int flick_time_limit_ms; double long_tap_start_timeout; + Eina_Bool glayer_continues_enable; double zoom_step; double rotate_step; @@ -616,7 +617,7 @@ _clear_if_finished(Evas_Object *obj) // if ((!wd->touched) || (reset_s && !all_undefined)) /* (!wd->touched && reset_s) - don't stop zoom with mouse-wheel */ - if (reset_s && (/* !eina_list_count(wd->touched) || */ !all_undefined)) /* Aharon */ + if (reset_s && (!all_undefined)) return _event_history_clear(obj); return EINA_FALSE; @@ -1055,7 +1056,6 @@ _event_history_clear(Evas_Object *obj) free(t); } _register_callbacks(obj); - printf("%s\n", __func__); return EINA_TRUE; } @@ -2027,15 +2027,16 @@ _n_line_test(Evas_Object *obj, Pointer_Event *pe, void *event_info, return; } - /* We may finish line if momentum is zero */ - /* This is for continues-gesture */ - if ((!st->info.momentum.mx) && (!st->info.momentum.my)) - { /* Finish line on zero momentum for continues gesture */ - line->line_end.x = pe->x; - line->line_end.y = pe->y; - line->t_end = pe->timestamp; + if (wd->glayer_continues_enable) + { /* We may finish line if momentum is zero */ + /* This is for continues-gesture */ + if ((!st->info.momentum.mx) && (!st->info.momentum.my)) + { /* Finish line on zero momentum for continues gesture */ + line->line_end.x = pe->x; + line->line_end.y = pe->y; + line->t_end = pe->timestamp; + } } - } else { /* Record the line angle as it broke minimum length for line */ @@ -2170,7 +2171,7 @@ _n_line_test(Evas_Object *obj, Pointer_Event *pe, void *event_info, case EVAS_CALLBACK_MULTI_MOVE: if (started) { - if (started == ended) + if (wd->glayer_continues_enable && started == ended) { /* For continues gesture */ ev_flag = _set_state(gesture, ELM_GESTURE_STATE_END, &st->info, EINA_FALSE); @@ -2183,14 +2184,6 @@ _n_line_test(Evas_Object *obj, Pointer_Event *pe, void *event_info, consume_event(wd, event_info, event_type, ev_flag); } } -/* old code - if (started) - { - ev_flag = _set_state(gesture, ELM_GESTURE_STATE_MOVE, - &st->info, EINA_TRUE); - consume_event(wd, event_info, event_type, ev_flag); - } -*/ break; default: @@ -2670,22 +2663,23 @@ _zoom_test(Evas_Object *obj, Pointer_Event *pe, void *event_info, if (d < 0.0) d = (-d); - /* START For contiunues gesture: compute momentum */ - _set_momentum(&st->momentum1, st->zoom_st.x, st->zoom_st.y, - st->zoom_mv.x, st->zoom_mv.y,st->zoom_st.timestamp, st->zoom_st.timestamp, - st->zoom_mv.timestamp); + if (wd->glayer_continues_enable) + { /* START For contiunues gesture: compute momentum */ + _set_momentum(&st->momentum1, st->zoom_st.x, st->zoom_st.y, + st->zoom_mv.x, st->zoom_mv.y,st->zoom_st.timestamp, st->zoom_st.timestamp, + st->zoom_mv.timestamp); - _set_momentum(&st->momentum2, st->zoom_st1.x, st->zoom_st1.y, - st->zoom_mv1.x, st->zoom_mv1.y,st->zoom_st1.timestamp, st->zoom_st1.timestamp, - st->zoom_mv1.timestamp); + _set_momentum(&st->momentum2, st->zoom_st1.x, st->zoom_st1.y, + st->zoom_mv1.x, st->zoom_mv1.y,st->zoom_st1.timestamp, st->zoom_st1.timestamp, + st->zoom_mv1.timestamp); - if (!(st->momentum1.mx + st->momentum1.my + st->momentum2.mx + st->momentum2.my)) - { - ev_flag = _set_state(gesture_zoom, ELM_GESTURE_STATE_END, - &st->info, EINA_FALSE); - return; - } - /* END For contiunues gesture: compute momentum */ + if (!(st->momentum1.mx + st->momentum1.my + st->momentum2.mx + st->momentum2.my)) + { + ev_flag = _set_state(gesture_zoom, ELM_GESTURE_STATE_END, + &st->info, EINA_FALSE); + return; + } + } /* END For contiunues gesture: compute momentum */ if (d >= wd->zoom_step) @@ -2916,22 +2910,23 @@ _rotate_test(Evas_Object *obj, Pointer_Event *pe, void *event_info, if (d < 0.0) d = (-d); - /* START For contiunues gesture: compute momentum */ - _set_momentum(&st->momentum1, st->rotate_st.x, st->rotate_st.y, - st->rotate_mv.x, st->rotate_mv.y,st->rotate_st.timestamp, st->rotate_st.timestamp, - st->rotate_mv.timestamp); + if (wd->glayer_continues_enable) + { /* START For contiunues gesture: compute momentum */ + _set_momentum(&st->momentum1, st->rotate_st.x, st->rotate_st.y, + st->rotate_mv.x, st->rotate_mv.y,st->rotate_st.timestamp, st->rotate_st.timestamp, + st->rotate_mv.timestamp); - _set_momentum(&st->momentum2, st->rotate_st1.x, st->rotate_st1.y, - st->rotate_mv1.x, st->rotate_mv1.y,st->rotate_st1.timestamp, st->rotate_st1.timestamp, - st->rotate_mv1.timestamp); + _set_momentum(&st->momentum2, st->rotate_st1.x, st->rotate_st1.y, + st->rotate_mv1.x, st->rotate_mv1.y,st->rotate_st1.timestamp, st->rotate_st1.timestamp, + st->rotate_mv1.timestamp); - if (!(st->momentum1.mx + st->momentum1.my + st->momentum2.mx + st->momentum2.my)) - { - ev_flag = _set_state(gesture, ELM_GESTURE_STATE_END, - &st->info, EINA_FALSE); - return; - } - /* END For contiunues gesture: compute momentum */ + if (!(st->momentum1.mx + st->momentum1.my + st->momentum2.mx + st->momentum2.my)) + { + ev_flag = _set_state(gesture, ELM_GESTURE_STATE_END, + &st->info, EINA_FALSE); + return; + } + } /* END For contiunues gesture: compute momentum */ if (d >= wd->rotate_step) { /* Report move in steps */ @@ -3041,6 +3036,110 @@ _make_pointer_event(void *data, void *event_info, /** * @internal * + * This function restartes line, flick, zoom and rotate gestures + * when gesture-layer continues-gestures enabled. + * Example of continues-gesture: + * When doing a line, user stops moving finger but keeps fingers on touch. + * This will cause line-end, then as user continues moving his finger + * it re-starts line gesture. + * When continue mode is disabled, user has to lift finger from touch + * to end a gesture. Them touch-again to start a new one. + * + * @param data The gesture-layer object. + * @param wd gesture layer widget data. + * @param states_reset flag that marks gestures were reset in history clear. + * + * @ingroup Elm_Gesture_Layer + */ +void continues_gestures_restart(void *data, Eina_Bool states_reset) +{ + Widget_Data *wd = elm_widget_data_get(data); + if (!wd) return; + + /* Run through events to restart gestures */ + Gesture_Info *g; + Eina_Bool n_lines, n_flicks, zoom, rotate; +#if defined(DEBUG_GESTURE_LAYER) + int i; + printf("Gesture | State | is tested\n"); + for(i = ELM_GESTURE_N_TAPS; i < ELM_GESTURE_LAST; i++) + { + g = wd->gesture[i]; + if(g) + printf(" %d %d %d\n", i, g->state, g->test); + } +#endif + /* We turn-on flag for finished, aborted, not-started gestures */ + g = wd->gesture[ELM_GESTURE_N_LINES]; + n_lines = (g) ? ((states_reset) | ((g->state != ELM_GESTURE_STATE_START) + && (g->state != ELM_GESTURE_STATE_MOVE))) : EINA_FALSE; + if (n_lines) + { + _line_test_reset(wd->gesture[ELM_GESTURE_N_LINES]); + _set_state(g, ELM_GESTURE_STATE_UNDEFINED, NULL, EINA_FALSE); + SET_TEST_BIT(g); + } + + g = wd->gesture[ELM_GESTURE_N_FLICKS]; + n_flicks = (g) ? ((states_reset) | ((g->state != ELM_GESTURE_STATE_START) + && (g->state != ELM_GESTURE_STATE_MOVE))) : EINA_FALSE; + if (n_flicks) + { + _line_test_reset(wd->gesture[ELM_GESTURE_N_FLICKS]); + _set_state(g, ELM_GESTURE_STATE_UNDEFINED, NULL, EINA_FALSE); + SET_TEST_BIT(g); + } + + g = wd->gesture[ELM_GESTURE_ZOOM]; + zoom = (g) ? ((states_reset) | ((g->state != ELM_GESTURE_STATE_START) + && (g->state != ELM_GESTURE_STATE_MOVE))) : EINA_FALSE; + if (zoom) + { + _zoom_test_reset(wd->gesture[ELM_GESTURE_ZOOM]); + _set_state(g, ELM_GESTURE_STATE_UNDEFINED, NULL, EINA_FALSE); + SET_TEST_BIT(g); + } + + + g = wd->gesture[ELM_GESTURE_ROTATE]; + rotate = (g) ? ((states_reset) | ((g->state != ELM_GESTURE_STATE_START) + && (g->state != ELM_GESTURE_STATE_MOVE))) : EINA_FALSE; + if (rotate) + { + _rotate_test_reset(wd->gesture[ELM_GESTURE_ROTATE]); + _set_state(g, ELM_GESTURE_STATE_UNDEFINED, NULL, EINA_FALSE); + SET_TEST_BIT(g); + } + + Eina_List *l; + Pointer_Event *p; + EINA_LIST_FOREACH(wd->recent_device_event, l, p) + { /* Generate a DOWN event */ + Evas_Callback_Type e_type = p->event_type; + if(p->event_type == EVAS_CALLBACK_MULTI_MOVE) + e_type = EVAS_CALLBACK_MULTI_DOWN; + else + if(p->event_type == EVAS_CALLBACK_MOUSE_MOVE) + e_type = EVAS_CALLBACK_MOUSE_DOWN; + + + if (n_lines && (IS_TESTED(ELM_GESTURE_N_LINES))) + _n_line_test(data, p, NULL, e_type, ELM_GESTURE_N_LINES); + + if (n_flicks && (IS_TESTED(ELM_GESTURE_N_FLICKS))) + _n_line_test(data, p, NULL, e_type, ELM_GESTURE_N_FLICKS); + + if (zoom && (IS_TESTED(ELM_GESTURE_ZOOM))) + _zoom_test(data, p, NULL, e_type, ELM_GESTURE_ZOOM); + + if (rotate && (IS_TESTED(ELM_GESTURE_ROTATE))) + _rotate_test(data, p, NULL, e_type, ELM_GESTURE_ROTATE); + } +} + +/** + * @internal + * * This function the core-function where input handling is done. * Here we get user input and stream it to gesture testing. * We notify user about any gestures with new state: @@ -3139,87 +3238,8 @@ _event_process(void *data, Evas_Object *obj __UNUSED__, /* Report current states and clear history if needed */ Eina_Bool states_reset = _clear_if_finished(data); - - - /* Run through events to restart gestures */ - Gesture_Info *g; - Eina_Bool n_lines, n_flicks, zoom, rotate; -/* - int i; - printf("Gesture | State | tested\n"); - for(i = ELM_GESTURE_N_TAPS; i < ELM_GESTURE_LAST; i++) - { - g = wd->gesture[i]; - if(g) - printf(" %d %d %d\n", i, g->state, g->test); - } -*/ - /* We turn-on flag for finished, aborted, not-started gestures */ - g = wd->gesture[ELM_GESTURE_N_LINES]; - n_lines = (g) ? ((states_reset) | ((g->state != ELM_GESTURE_STATE_START) - && (g->state != ELM_GESTURE_STATE_MOVE))) : EINA_FALSE; - if (n_lines) - { - _line_test_reset(wd->gesture[ELM_GESTURE_N_LINES]); - _set_state(g, ELM_GESTURE_STATE_UNDEFINED, NULL, EINA_FALSE); - SET_TEST_BIT(g); - } - - g = wd->gesture[ELM_GESTURE_N_FLICKS]; - n_flicks = (g) ? ((states_reset) | ((g->state != ELM_GESTURE_STATE_START) - && (g->state != ELM_GESTURE_STATE_MOVE))) : EINA_FALSE; - if (n_flicks) - { - _line_test_reset(wd->gesture[ELM_GESTURE_N_FLICKS]); - _set_state(g, ELM_GESTURE_STATE_UNDEFINED, NULL, EINA_FALSE); - SET_TEST_BIT(g); - } - - g = wd->gesture[ELM_GESTURE_ZOOM]; - zoom = (g) ? ((states_reset) | ((g->state != ELM_GESTURE_STATE_START) - && (g->state != ELM_GESTURE_STATE_MOVE))) : EINA_FALSE; - if (zoom) - { - _zoom_test_reset(wd->gesture[ELM_GESTURE_ZOOM]); - _set_state(g, ELM_GESTURE_STATE_UNDEFINED, NULL, EINA_FALSE); - SET_TEST_BIT(g); - } - - - g = wd->gesture[ELM_GESTURE_ROTATE]; - rotate = (g) ? ((states_reset) | ((g->state != ELM_GESTURE_STATE_START) - && (g->state != ELM_GESTURE_STATE_MOVE))) : EINA_FALSE; - if (rotate) - { - _rotate_test_reset(wd->gesture[ELM_GESTURE_ROTATE]); - _set_state(g, ELM_GESTURE_STATE_UNDEFINED, NULL, EINA_FALSE); - SET_TEST_BIT(g); - } - - Eina_List *l; - Pointer_Event *p; - EINA_LIST_FOREACH(wd->recent_device_event, l, p) - { /* Generate a DOWN event */ - Evas_Callback_Type e_type = p->event_type; - if(p->event_type == EVAS_CALLBACK_MULTI_MOVE) - e_type = EVAS_CALLBACK_MULTI_DOWN; - else - if(p->event_type == EVAS_CALLBACK_MOUSE_MOVE) - e_type = EVAS_CALLBACK_MOUSE_DOWN; - - - if (n_lines && (IS_TESTED(ELM_GESTURE_N_LINES))) - _n_line_test(data, p, NULL, e_type, ELM_GESTURE_N_LINES); - - if (n_flicks && (IS_TESTED(ELM_GESTURE_N_FLICKS))) - _n_line_test(data, p, NULL, e_type, ELM_GESTURE_N_FLICKS); - - if (zoom && (IS_TESTED(ELM_GESTURE_ZOOM))) - _zoom_test(data, p, NULL, e_type, ELM_GESTURE_ZOOM); - - if (rotate && (IS_TESTED(ELM_GESTURE_ROTATE))) - _rotate_test(data, p, NULL, e_type, ELM_GESTURE_ROTATE); - } + if (wd->glayer_continues_enable) + continues_gestures_restart(data, states_reset); } @@ -3449,10 +3469,11 @@ elm_gesture_layer_add(Evas_Object *parent) wd->flick_time_limit_ms = _elm_config->glayer_flick_time_limit_ms; wd->long_tap_start_timeout = _elm_config->glayer_long_tap_start_timeout; wd->repeat_events = EINA_TRUE; + wd->glayer_continues_enable = _elm_config->glayer_continues_enable; #if defined(DEBUG_GESTURE_LAYER) printf("size of Gestures = <%d>\n", sizeof(wd->gesture)); - printf("initial values:\n\tzoom_finger_factor=<%f>\n\tzoom_distance_tolerance=<%d>\n\tline_min_length=<%d>\n\tline_distance_tolerance=<%d>\n\tzoom_wheel_factor=<%f>\n\trotate_angular_tolerance=<%f>\n\twd->line_angular_tolerance=<%f>\n\twd->flick_time_limit_ms=<%d>\n\twd->long_tap_start_timeout=<%f>\n\twd->zoom_step=<%f>\n\twd->rotate_step=<%f>\n", wd->zoom_finger_factor, wd->zoom_distance_tolerance, wd->line_min_length, wd->line_distance_tolerance, wd->zoom_wheel_factor, wd->rotate_angular_tolerance, wd->line_angular_tolerance, wd->flick_time_limit_ms, wd->long_tap_start_timeout, wd->zoom_step, wd->rotate_step); + printf("initial values:\n\tzoom_finger_factor=<%f>\n\tzoom_distance_tolerance=<%d>\n\tline_min_length=<%d>\n\tline_distance_tolerance=<%d>\n\tzoom_wheel_factor=<%f>\n\trotate_angular_tolerance=<%f>\n\twd->line_angular_tolerance=<%f>\n\twd->flick_time_limit_ms=<%d>\n\twd->long_tap_start_timeout=<%f>\n\twd->zoom_step=<%f>\n\twd->rotate_step=<%f>\n\twd->glayer_continues_enable=<%d>\n ", wd->zoom_finger_factor, wd->zoom_distance_tolerance, wd->line_min_length, wd->line_distance_tolerance, wd->zoom_wheel_factor, wd->rotate_angular_tolerance, wd->line_angular_tolerance, wd->flick_time_limit_ms, wd->long_tap_start_timeout, wd->zoom_step, wd->rotate_step, wd->glayer_continues_enable); #endif memset(wd->gesture, 0, sizeof(wd->gesture)); diff --git a/src/lib/elm_priv.h b/src/lib/elm_priv.h index 438d153..c91f2b4 100644 --- a/src/lib/elm_priv.h +++ b/src/lib/elm_priv.h @@ -229,6 +229,8 @@ struct _Elm_Config double glayer_line_angular_tolerance; unsigned int glayer_flick_time_limit_ms; double glayer_long_tap_start_timeout; + int access_mode; + Eina_Bool glayer_continues_enable; }; struct _Elm_Module