Elm glayer: Workaround a bug causing a delay with N_TAPS events.

SVN revision: 71147
This commit is contained in:
Tom Hacohen 2012-05-16 08:44:17 +00:00
parent c69b7f2b60
commit f51e04c0f5
1 changed files with 51 additions and 12 deletions

View File

@ -617,10 +617,15 @@ _tap_gestures_test_reset(Gesture_Info *gesture)
return;
Widget_Data *wd = elm_widget_data_get(gesture->obj);
wd->dbl_timeout = NULL;
Eina_List *data;
Pointer_Event *pe;
if (wd->dbl_timeout)
{
ecore_timer_del(wd->dbl_timeout);
wd->dbl_timeout = NULL;
}
if (!gesture->data)
return;
@ -1164,17 +1169,16 @@ _record_pointer_event(Taps_Type *st, Eina_List *pe_list, Pointer_Event *pe,
/**
* @internal
*
* This function sets state a tap-gesture to END or ABORT
* This function checks if the tap gesture is done.
*
* @param data gesture info pointer
* @return EINA_TRUE if it is done.
*
* @ingroup Elm_Gesture_Layer
*/
static void
_tap_gesture_finish(void *data)
{ /* This function will test each tap gesture when timer expires */
Gesture_Info *gesture = data;
Elm_Gesture_State s = ELM_GESTURE_STATE_END;
static Eina_Bool
_tap_gesture_check_finish(Gesture_Info *gesture)
{
/* Here we check if taps-gesture was completed successfuly */
/* Count how many taps were recieved on each device then */
/* determine if it matches n_taps_needed defined on START */
@ -1185,11 +1189,32 @@ _tap_gesture_finish(void *data)
{
if (eina_list_count(pe_list) != st->n_taps_needed)
{ /* No match taps number on device, ABORT */
s = ELM_GESTURE_STATE_ABORT;
break;
return EINA_FALSE;
}
}
return EINA_TRUE;
}
/**
* @internal
*
* This function sets state a tap-gesture to END or ABORT
*
* @param data gesture info pointer
*
* @ingroup Elm_Gesture_Layer
*/
static void
_tap_gesture_finish(void *data)
{ /* This function will test each tap gesture when timer expires */
Elm_Gesture_State s = ELM_GESTURE_STATE_END;
Gesture_Info *gesture = data;
Taps_Type *st = gesture->data;
if (!_tap_gesture_check_finish(data))
s = ELM_GESTURE_STATE_ABORT;
st->info.n = eina_list_count(st->l);
_set_state(gesture, s, gesture->info, EINA_FALSE);
_tap_gestures_test_reset(gesture);
@ -1212,13 +1237,13 @@ _multi_tap_timeout(void *data)
if (!wd) return EINA_FALSE;
if (IS_TESTED(ELM_GESTURE_N_TAPS))
_tap_gesture_finish(wd->gesture[ELM_GESTURE_N_TAPS]);
_tap_gesture_finish(wd->gesture[ELM_GESTURE_N_TAPS]);
if (IS_TESTED(ELM_GESTURE_N_DOUBLE_TAPS))
_tap_gesture_finish(wd->gesture[ELM_GESTURE_N_DOUBLE_TAPS]);
_tap_gesture_finish(wd->gesture[ELM_GESTURE_N_DOUBLE_TAPS]);
if (IS_TESTED(ELM_GESTURE_N_TRIPLE_TAPS))
_tap_gesture_finish(wd->gesture[ELM_GESTURE_N_TRIPLE_TAPS]);
_tap_gesture_finish(wd->gesture[ELM_GESTURE_N_TRIPLE_TAPS]);
_clear_if_finished(data);
wd->dbl_timeout = NULL;
@ -1319,6 +1344,20 @@ _tap_gesture_start(Widget_Data *wd, Pointer_Event *pe,
return EINA_FALSE;
pe_list = _record_pointer_event(st, pe_list, pe, wd, event_info, event_type);
if (((gesture->g_type == ELM_GESTURE_N_TAPS) &&
!IS_TESTED(ELM_GESTURE_N_DOUBLE_TAPS) &&
!IS_TESTED(ELM_GESTURE_N_TRIPLE_TAPS)) ||
((gesture->g_type == ELM_GESTURE_N_DOUBLE_TAPS) &&
!IS_TESTED(ELM_GESTURE_N_TRIPLE_TAPS)))
{
if (_tap_gesture_check_finish(gesture))
{
_tap_gesture_finish(gesture);
return EINA_FALSE;
}
}
break;
case EVAS_CALLBACK_MULTI_MOVE: