Gesture Layer: Add API to set the finger size for taps.

The default value is the one stored in elm_config.
This commit is contained in:
Daniel Zaoui 2013-06-25 10:31:58 +03:00
parent dcab3545cf
commit aea9b1d262
4 changed files with 159 additions and 29 deletions

View File

@ -384,6 +384,7 @@ struct _Elm_Gesture_Layer_Smart_Data
Eina_List *touched; /* Information of touched devices */
/* Taps Gestures */
Evas_Coord tap_finger_size; /* Default from Config */
Ecore_Timer *gest_taps_timeout; /* When this expires, dbl
* click/taps ABORTed */
@ -1385,9 +1386,12 @@ static Eina_Bool
_inside(Evas_Coord xx1,
Evas_Coord yy1,
Evas_Coord xx2,
Evas_Coord yy2)
Evas_Coord yy2,
Evas_Coord w)
{
int w = elm_config_finger_size_get() >> 1; /* Finger size devided by 2 */
w >>= 1; /* Use half the distance, from center to all directions */
if (!w) /* use system default instead */
w = elm_config_finger_size_get() >> 1; /* Finger size devided by 2 */
if (xx1 < (xx2 - w))
return EINA_FALSE;
@ -1524,25 +1528,24 @@ _rotate_test_reset(Gesture_Info *gesture)
st->rotate_angular_tolerance = sd->rotate_angular_tolerance;
}
static int
_match_fingers_compare(const void *data1,
const void *data2)
static Eina_List *
_match_fingers_compare(Eina_List *list,
Pointer_Event *pe1,
Evas_Coord w)
{
/* Compare coords of first item in list to cur coords */
const Pointer_Event *pe1 = eina_list_data_get(data1);
const Pointer_Event *pe2 = data2;
/* Compare coords of first item in list to cur coords */
Eina_List *pe_list;
Eina_List *l;
if (_inside(pe1->x, pe1->y, pe2->x, pe2->y))
return 0;
else if (pe1->x < pe2->x)
return -1;
else
EINA_LIST_FOREACH(list, l, pe_list)
{
if (pe1->x == pe2->x)
return pe1->y - pe2->y;
else
return 1;
Pointer_Event *pe2 = eina_list_data_get(pe_list);
if (_inside(pe1->x, pe1->y, pe2->x, pe2->y, w))
return pe_list;
}
return NULL;
}
static int
@ -1651,7 +1654,7 @@ _taps_rect_get(Eina_List *taps, int idx, Evas_Coord_Rectangle *r)
* @ingroup Elm_Gesture_Layer
*/
static Eina_Bool
_tap_gesture_check_finish(Gesture_Info *gesture)
_tap_gesture_check_finish(Gesture_Info *gesture, Evas_Coord tap_finger_size)
{
/* Here we check if taps-gesture was completed successfuly */
/* Count how many taps were recieved on each device then */
@ -1662,7 +1665,9 @@ _tap_gesture_check_finish(Gesture_Info *gesture)
Eina_List *pe_list;
Evas_Coord_Rectangle base;
Evas_Coord_Rectangle tmp;
Evas_Coord tap_finger_size = elm_config_finger_size_get();
if (!tap_finger_size) /* Use system default if not set by user */
tap_finger_size = elm_config_finger_size_get();
if (!st->l) return EINA_FALSE;
EINA_LIST_FOREACH(st->l, l, pe_list)
@ -1710,14 +1715,14 @@ _tap_gesture_check_finish(Gesture_Info *gesture)
* @ingroup Elm_Gesture_Layer
*/
static void
_tap_gesture_finish(void *data)
_tap_gesture_finish(void *data, Evas_Coord tap_finger_size)
{
/* 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))
if (_tap_gesture_check_finish(gesture, tap_finger_size))
{
s = ELM_GESTURE_STATE_END;
}
@ -1743,13 +1748,16 @@ _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]);
_tap_gesture_finish(sd->gesture[ELM_GESTURE_N_TAPS],
sd->tap_finger_size);
if (IS_TESTED(ELM_GESTURE_N_DOUBLE_TAPS))
_tap_gesture_finish(sd->gesture[ELM_GESTURE_N_DOUBLE_TAPS]);
_tap_gesture_finish(sd->gesture[ELM_GESTURE_N_DOUBLE_TAPS],
sd->tap_finger_size);
if (IS_TESTED(ELM_GESTURE_N_TRIPLE_TAPS))
_tap_gesture_finish(sd->gesture[ELM_GESTURE_N_TRIPLE_TAPS]);
_tap_gesture_finish(sd->gesture[ELM_GESTURE_N_TRIPLE_TAPS],
sd->tap_finger_size);
_clear_if_finished(data);
sd->gest_taps_timeout = NULL;
@ -1852,7 +1860,7 @@ _tap_gesture_test(Evas_Object *obj,
if (pe_list)
{ /* This device touched before, verify that this tap is on */
/* top of a previous tap (including a tap of other device) */
if (!eina_list_search_unsorted(st->l, _match_fingers_compare, pe))
if (!_match_fingers_compare(st->l, pe, sd->tap_finger_size))
{ /* New DOWN event is not on top of any prev touch */
ev_flag = _state_set(gesture, ELM_GESTURE_STATE_ABORT,
&st->info, EINA_FALSE);
@ -1910,9 +1918,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 immidiatly, not waiting for timeout */
if (_tap_gesture_check_finish(gesture))
if (_tap_gesture_check_finish(gesture, sd->tap_finger_size))
{
_tap_gesture_finish(gesture);
_tap_gesture_finish(gesture, sd->tap_finger_size);
return;
}
}
@ -1933,7 +1941,8 @@ _tap_gesture_test(Evas_Object *obj,
if ((pe_last->event_type == EVAS_CALLBACK_MOUSE_DOWN) ||
(pe_last->event_type == EVAS_CALLBACK_MULTI_DOWN))
{ /* Test only MOVE events that come after DOWN event */
if (!_inside(pe_last->x, pe_last->y, pe->x, pe->y))
if (!_inside(pe_last->x, pe_last->y, pe->x, pe->y,
sd->tap_finger_size))
{
ev_flag = _state_set(gesture, ELM_GESTURE_STATE_ABORT,
&st->info, EINA_FALSE);
@ -2096,7 +2105,8 @@ _n_long_tap_test(Evas_Object *obj,
_compute_taps_center(st, &x, &y, pe);
/* ABORT if user moved fingers out of tap area */
if (!_inside(x, y, st->center_x, st->center_y))
if (!_inside(x, y, st->center_x, st->center_y,
sd->tap_finger_size))
{
ELM_SAFE_FREE(st->timeout, ecore_timer_del);
@ -4090,6 +4100,43 @@ elm_gesture_layer_double_tap_timeout_get(const Evas_Object *obj)
return sd->double_tap_timeout;
}
EAPI void
elm_gesture_layer_tap_finger_size_set(Evas_Object *obj,
Evas_Coord sz)
{
ELM_GESTURE_LAYER_CHECK(obj);
eo_do(obj, elm_obj_gesture_layer_tap_finger_size_set(sz));
}
static void
_tap_finger_size_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
{
Evas_Coord sz = va_arg(*list, Evas_Coord);
Elm_Gesture_Layer_Smart_Data *sd = _pd;
if (sz < 0)
sz = 0; /* Should not be negative, will reset to system value */
sd->tap_finger_size = sz;
}
EAPI Evas_Coord
elm_gesture_layer_tap_finger_size_get(const Evas_Object *obj)
{
ELM_GESTURE_LAYER_CHECK(obj) elm_config_finger_size_get();
Evas_Coord ret = 0;
eo_do((Eo *) obj, elm_obj_gesture_layer_tap_finger_size_get(&ret));
return ret;
}
static void
_tap_finger_size_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
{
Evas_Coord *ret = va_arg(*list, Evas_Coord *);
Elm_Gesture_Layer_Smart_Data *sd = _pd;
*ret = sd->tap_finger_size;
}
static void
_class_constructor(Eo_Class *klass)
{
@ -4109,6 +4156,8 @@ _class_constructor(Eo_Class *klass)
EO_OP_FUNC(ELM_OBJ_GESTURE_LAYER_ID(ELM_OBJ_GESTURE_LAYER_SUB_ID_ROTATE_STEP_SET), _rotate_step_set),
EO_OP_FUNC(ELM_OBJ_GESTURE_LAYER_ID(ELM_OBJ_GESTURE_LAYER_SUB_ID_ATTACH), _attach),
EO_OP_FUNC(ELM_OBJ_GESTURE_LAYER_ID(ELM_OBJ_GESTURE_LAYER_SUB_ID_CB_SET), _cb_set),
EO_OP_FUNC(ELM_OBJ_GESTURE_LAYER_ID(ELM_OBJ_GESTURE_LAYER_TAP_FINGER_SIZE_SET), _tap_finger_size_set),
EO_OP_FUNC(ELM_OBJ_GESTURE_LAYER_ID(ELM_OBJ_GESTURE_LAYER_TAP_FINGER_SIZE_GET), _tap_finger_size_get),
EO_OP_FUNC_SENTINEL
};
eo_class_funcs_set(klass, func_desc);
@ -4125,6 +4174,8 @@ static const Eo_Op_Description op_desc[] = {
EO_OP_DESCRIPTION(ELM_OBJ_GESTURE_LAYER_SUB_ID_ROTATE_STEP_SET, "This function sets step-value for rotate action."),
EO_OP_DESCRIPTION(ELM_OBJ_GESTURE_LAYER_SUB_ID_ATTACH, "Attach a given gesture layer widget to an Evas object, thus setting the widget's target."),
EO_OP_DESCRIPTION(ELM_OBJ_GESTURE_LAYER_SUB_ID_CB_SET, "Use function to set callbacks to be notified about change of state of gesture."),
EO_OP_DESCRIPTION(ELM_OBJ_GESTURE_LAYER_TAP_FINGER_SIZE_SET, "Use function to set valid touch-area size for finger."),
EO_OP_DESCRIPTION(ELM_OBJ_GESTURE_LAYER_TAP_FINGER_SIZE_GET, "This function returns the valid touch-area size for finger."),
EO_OP_DESCRIPTION_SENTINEL
};

View File

@ -377,3 +377,24 @@ EAPI void elm_gesture_layer_double_tap_timeout_set(Evas_Object *obj, double doub
*/
EAPI double elm_gesture_layer_double_tap_timeout_get(const Evas_Object *obj);
/**
* @since 1.8
* This function sets the gesture layer finger-size for taps
* If not set, this size taken from elm_config.
* Set to ZERO if you want GLayer to use system finger size value (default)
*
* @param obj gesture-layer.
* @param fsize Finger size
*
*/
EAPI void elm_gesture_layer_tap_finger_size_set(Evas_Object *obj, Evas_Coord sz);
/**
* @since 1.8
* This function returns the gesture layer finger-size for taps
*
* @param obj gesture-layer.
* @return Finger size that is currently used by Gesture Layer for taps.
*
*/
EAPI Evas_Coord elm_gesture_layer_tap_finger_size_get(const Evas_Object *obj);

View File

@ -14,6 +14,8 @@ enum
ELM_OBJ_GESTURE_LAYER_SUB_ID_ROTATE_STEP_SET,
ELM_OBJ_GESTURE_LAYER_SUB_ID_ATTACH,
ELM_OBJ_GESTURE_LAYER_SUB_ID_CB_SET,
ELM_OBJ_GESTURE_LAYER_TAP_FINGER_SIZE_SET,
ELM_OBJ_GESTURE_LAYER_TAP_FINGER_SIZE_GET,
ELM_OBJ_GESTURE_LAYER_SUB_ID_LAST
};
@ -137,3 +139,37 @@ enum
* @ingroup Elm_Gesture_Layer
*/
#define elm_obj_gesture_layer_cb_set(idx, cb_type, cb, data) ELM_OBJ_GESTURE_LAYER_ID(ELM_OBJ_GESTURE_LAYER_SUB_ID_CB_SET), EO_TYPECHECK(Elm_Gesture_Type, idx), EO_TYPECHECK(Elm_Gesture_State, cb_type), EO_TYPECHECK(Elm_Gesture_Event_Cb, cb), EO_TYPECHECK(void *, data)
/**
* @def elm_obj_gesture_layer_tap_finger_size_set
* @since 1.8
*
* This function sets the gesture layer finger-size for taps
* If not set, this size is taken from elm_config.
* Set to ZERO if you want GLayer to use system finger size value (default)
* It is recommended to not set a too much big or little value to avoid weird
* behaviors.
*
* @param[in] obj gesture-layer.
* @param[in] fsize Finger size
*
* @see elm_gesture_layer_tap_finger_size_get
*
* @ingroup Elm_Gesture_Layer
*/
#define elm_obj_gesture_layer_tap_finger_size_set(sz) ELM_OBJ_GESTURE_LAYER_ID(ELM_OBJ_GESTURE_LAYER_TAP_FINGER_SIZE_SET), EO_TYPECHECK(Evas_Coord, sz)
/**
* @def elm_obj_gesture_layer_tap_finger_size_get
* @since 1.8
*
* This function returns the gesture layer finger-size for taps
*
* @param[out] ret
* @return Finger size that is currently used by Gesture Layer for taps.
*
* @see elm_gesture_layer_tap_finger_size_set
*
* @ingroup Elm_Gesture_Layer
*/
#define elm_obj_gesture_layer_tap_finger_size_get(ret) ELM_OBJ_GESTURE_LAYER_ID(ELM_OBJ_GESTURE_LAYER_TAP_FINGER_SIZE_GET), EO_TYPECHECK(Evas_Coord *, ret)

View File

@ -109,3 +109,25 @@ EAPI Eina_Bool elm_gesture_layer_attach(Evas_Object *obj, Evas_Object *target
*
*/
EAPI void elm_gesture_layer_cb_set(Evas_Object *obj, Elm_Gesture_Type idx, Elm_Gesture_State cb_type, Elm_Gesture_Event_Cb cb, void *data);
/**
* @since 1.8
* This function sets the gesture layer finger-size for taps
* If not set, this size taken from elm_config.
* Set to ZERO if you want GLayer to use system finger size value (default)
*
* @param obj gesture-layer.
* @param fsize Finger size
*
*/
EAPI void elm_gesture_layer_tap_finger_size_set(Evas_Object *obj, Evas_Coord sz);
/**
* @since 1.8
* This function returns the gesture layer finger-size for taps
*
* @param obj gesture-layer.
* @return Finger size that is currently used by Gesture Layer for taps.
*
*/
EAPI Evas_Coord elm_gesture_layer_tap_finger_size_get(const Evas_Object *obj);