jackdanielz pushed a commit to branch master.

commit 642bdc1296e4fd1bbd0e1d9ac13ee5932c8035b5
Author: Daniel Zaoui <[email protected]>
Date:   Tue Jun 25 10:31:58 2013 +0300

    Gesture Layer: Add API to set the finger size for taps.
    The default value is the one stored in elm_config.
---
 src/lib/elm_gesture_layer.c        | 109 +++++++++++++++++++++++++++----------
 src/lib/elm_gesture_layer_common.h |  21 +++++++
 src/lib/elm_gesture_layer_eo.h     |  36 ++++++++++++
 src/lib/elm_gesture_layer_legacy.h |  22 ++++++++
 4 files changed, 159 insertions(+), 29 deletions(-)

diff --git a/src/lib/elm_gesture_layer.c b/src/lib/elm_gesture_layer.c
index e907571..5e6e9fa 100644
--- a/src/lib/elm_gesture_layer.c
+++ b/src/lib/elm_gesture_layer.c
@@ -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
 };
 
diff --git a/src/lib/elm_gesture_layer_common.h 
b/src/lib/elm_gesture_layer_common.h
index dd66a6b..625fd30 100644
--- a/src/lib/elm_gesture_layer_common.h
+++ b/src/lib/elm_gesture_layer_common.h
@@ -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);
diff --git a/src/lib/elm_gesture_layer_eo.h b/src/lib/elm_gesture_layer_eo.h
index 516f6a6..a3b9603 100644
--- a/src/lib/elm_gesture_layer_eo.h
+++ b/src/lib/elm_gesture_layer_eo.h
@@ -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)
diff --git a/src/lib/elm_gesture_layer_legacy.h 
b/src/lib/elm_gesture_layer_legacy.h
index c0d0ef4..be0cd8c 100644
--- a/src/lib/elm_gesture_layer_legacy.h
+++ b/src/lib/elm_gesture_layer_legacy.h
@@ -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);

-- 

------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:

Build for Windows Store.

http://p.sf.net/sfu/windows-dev2dev

Reply via email to