From: EunMi Lee <eunmi15.lee@samsung.com>
authorraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Tue, 25 Oct 2011 05:03:50 +0000 (05:03 +0000)
committerraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Tue, 25 Oct 2011 05:03:50 +0000 (05:03 +0000)
Subject: [E-devel] [Patch] [Evas] Patch to provide information of
touched points

Hello,
I made a new patch to get information of current touched point instead
of Touch Event.

I added touch_points (Eina_List) to the Evas structure and it maintains touched points on the evas.
New touched point is added to the touch_points when we get Mouse_Down and Multi_Down,
touched point is updated when we get Mouse_Move and Mult_Move,
and touched point is removed when we get Mouse_Up and Multi_Up.

The each touch point has coordinate, id and state information as follows:
id - identifier. 0 for Mouse Event and device id for Multi Event. coordinate - (x, y) coordinate of point.
state - state of point. type is Evas_Touch_Point_State enum.
(EVAS_TOUCH_POINT_DOWN, EVAS_TOUCH_POINT_UP, EVAS_TOUCH_POINT_MOVE,
EVAS_TOUCH_POINT_STILL, EVAS_TOUCH_POINT_CANCEL)

There are 4 new APIs to get touch point's information as follows:
unsigned int evas_touch_point_list_count(Evas *e);
void evas_touch_point_list_nth_xy_get(Evas *e, unsigned int n, Evas_Coord *x, Evas_Coord *y);
int evas_touch_point_list_nth_id_get(Evas *e, unsigned int n);
Evas_Touch_Point_State evas_touch_point_list_nth_state_get(Evas *e, unsigned int n);

I added APIs to get each information instead of exposing whole
structure to make it easy to expand in the future as you mentioned in
the below e-mail :)

git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/evas@64373 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/Evas.h
src/lib/canvas/Makefile.am
src/lib/canvas/evas_events.c
src/lib/canvas/evas_main.c
src/lib/canvas/evas_touch_point.c [new file with mode: 0644]
src/lib/include/evas_private.h

index e22284a..1e992d7 100644 (file)
@@ -488,6 +488,18 @@ typedef enum _Evas_Event_Flags
 } Evas_Event_Flags; /**< Flags for Events */
 
 /**
+ * State of Evas_Coord_Touch_Point
+ */
+typedef enum _Evas_Touch_Point_State
+{
+   EVAS_TOUCH_POINT_DOWN, /**< Touch point is pressed down */
+   EVAS_TOUCH_POINT_UP, /**< Touch point is released */
+   EVAS_TOUCH_POINT_MOVE, /**< Touch point is moved */
+   EVAS_TOUCH_POINT_STILL, /**< Touch point is not moved after pressed */
+   EVAS_TOUCH_POINT_CANCEL /**< Touch point is calcelled */
+} Evas_Touch_Point_State;
+
+/**
  * Flags for Font Hinting
  * @ingroup Evas_Font_Group
  */
@@ -12039,6 +12051,141 @@ EAPI void                 evas_object_key_ungrab         (Evas_Object *obj, cons
  * @}
  */
 
+/**
+ * @defgroup Evas_Touch_Point_List Touch Point List Functions
+ *
+ * Functions to get information of touched points in the Evas.
+ *
+ * Evas maintains list of touched points on the canvas. Each point has
+ * its co-ordinates, id and state. You can get the number of touched
+ * points and information of each point using evas_touch_point_list
+ * functions.
+ *
+ * @ingroup Evas_Canvas
+ */
+
+/**
+ * @addtogroup Evas_Touch_Point_List
+ * @{
+ */
+
+/**
+ * Get the number of touched point in the evas.
+ *
+ * @param e The pointer to the Evas canvas.
+ * @return The number of touched point on the evas.
+ *
+ * New touched point is added to the list whenever touching the evas
+ * and point is removed whenever removing touched point from the evas.
+ *
+ * Example:
+ * @code
+ * extern Evas *evas;
+ * int count;
+ *
+ * count = evas_touch_point_list_count(evas);
+ * printf("The count of touch points: %i\n", count);
+ * @endcode
+ *
+ * @see evas_touch_point_list_nth_xy_get()
+ * @see evas_touch_point_list_nth_id_get()
+ * @see evas_touch_point_list_nth_state_get()
+ */
+EAPI unsigned int           evas_touch_point_list_count(Evas *e) EINA_ARG_NONNULL(1);
+
+/**
+ * This function returns the nth touch point's co-ordinates.
+ *
+ * @param e The pointer to the Evas canvas.
+ * @param n The number of the touched point (0 being the first).
+ * @param x The pointer to a Evas_Coord to be filled in.
+ * @param y The pointer to a Evas_Coord to be filled in.
+ *
+ * Touch point's co-ordinates is updated whenever moving that point
+ * on the canvas.
+ *
+ * Example:
+ * @code
+ * extern Evas *evas;
+ * Evas_Coord x, y;
+ *
+ * if (evas_touch_point_list_count(evas))
+ *   {
+ *      evas_touch_point_nth_xy_get(evas, 0, &x, &y);
+ *      printf("The first touch point's co-ordinate: (%i, %i)\n", x, y);
+ *   }
+ * @endcode
+ *
+ * @see evas_touch_point_list_count()
+ * @see evas_touch_point_list_nth_id_get()
+ * @see evas_touch_point_list_nth_state_get()
+ */
+EAPI void                   evas_touch_point_list_nth_xy_get(Evas *e, unsigned int n, Evas_Coord *x, Evas_Coord *y) EINA_ARG_NONNULL(1);
+
+/**
+ * This function returns the @p id of nth touch point.
+ *
+ * @param e The pointer to the Evas canvas.
+ * @param n The number of the touched point (0 being the first).
+ * @return id of nth touch point, if the call succeeded, -1 otherwise.
+ *
+ * The point which comes from Mouse Event has @p id 0 and The point
+ * which comes from Multi Event has @p id that is same as Multi
+ * Event's device id.
+ *
+ * Example:
+ * @code
+ * extern Evas *evas;
+ * int id;
+ *
+ * if (evas_touch_point_list_count(evas))
+ *   {
+ *      id = evas_touch_point_nth_id_get(evas, 0);
+ *      printf("The first touch point's id: %i\n", id);
+ *   }
+ * @endcode
+ *
+ * @see evas_touch_point_list_count()
+ * @see evas_touch_point_list_nth_xy_get()
+ * @see evas_touch_point_list_nth_state_get()
+ */
+EAPI int                    evas_touch_point_list_nth_id_get(Evas *e, unsigned int n) EINA_ARG_NONNULL(1);
+
+/**
+ * This function returns the @p state of nth touch point.
+ *
+ * @param e The pointer to the Evas canvas.
+ * @param n The number of the touched point (0 being the first).
+ * @return @p state of nth touch point, if the call succeeded,
+ *         EVAS_TOUCH_POINT_CANCEL otherwise.
+ *
+ * The point's @p state is EVAS_TOUCH_POINT_DOWN when pressed,
+ * EVAS_TOUCH_POINT_STILL when the point is not moved after pressed,
+ * EVAS_TOUCH_POINT_MOVE when moved at least once after pressed and
+ * EVAS_TOUCH_POINT_UP when released.
+ *
+ * Example:
+ * @code
+ * extern Evas *evas;
+ * Evas_Touch_Point_State state;
+ *
+ * if (evas_touch_point_list_count(evas))
+ *   {
+ *      state = evas_touch_point_nth_state_get(evas, 0);
+ *      printf("The first touch point's state: %i\n", state);
+ *   }
+ * @endcode
+ *
+ * @see evas_touch_point_list_count()
+ * @see evas_touch_point_list_nth_xy_get()
+ * @see evas_touch_point_list_nth_id_get()
+ */
+EAPI Evas_Touch_Point_State evas_touch_point_list_nth_state_get(Evas *e, unsigned int n) EINA_ARG_NONNULL(1);
+
+/**
+ * @}
+ */
+
 #ifdef __cplusplus
 }
 #endif
index 32dadc3..79544aa 100644 (file)
@@ -51,6 +51,7 @@ evas_smart.c \
 evas_stack.c \
 evas_async_events.c \
 evas_stats.c \
+evas_touch_point.c \
 evas_map.c \
 evas_gl.c
 
index d15913a..fe619da 100644 (file)
@@ -223,6 +223,8 @@ evas_event_feed_mouse_down(Evas *e, int b, Evas_Button_Flags flags, unsigned int
    ev.event_flags = EVAS_EVENT_FLAG_NONE;
 
    _evas_walk(e);
+   /* append new touch point to the touch point list */
+   _evas_touch_point_append(e, 0, e->pointer.x, e->pointer.y);
    /* If this is the first finger down, i.e no other fingers pressed,
     * get a new event list, otherwise, keep the current grabbed list. */
    if (e->pointer.mouse_grabbed == 0)
@@ -258,6 +260,8 @@ evas_event_feed_mouse_down(Evas *e, int b, Evas_Button_Flags flags, unsigned int
    if (copy) eina_list_free(copy);
    e->last_mouse_down_counter++;
    _evas_post_event_callback_call(e);
+   /* update touch point's state to EVAS_TOUCH_POINT_STILL */
+   _evas_touch_point_update(e, 0, e->pointer.x, e->pointer.y, EVAS_TOUCH_POINT_STILL);
    _evas_unwalk(e);
 }
 
@@ -400,6 +404,8 @@ evas_event_feed_mouse_up(Evas *e, int b, Evas_Button_Flags flags, unsigned int t
         ev.event_flags = EVAS_EVENT_FLAG_NONE;
 
         _evas_walk(e);
+        /* update released touch point */
+        _evas_touch_point_update(e, 0, e->pointer.x, e->pointer.y, EVAS_TOUCH_POINT_UP);
         copy = evas_event_list_copy(e->pointer.object.in);
         EINA_LIST_FOREACH(copy, l, obj)
           {
@@ -455,6 +461,8 @@ evas_event_feed_mouse_cancel(Evas *e, unsigned int timestamp, const void *data)
         if ((e->pointer.button & (1 << i)))
           evas_event_feed_mouse_up(e, i + 1, 0, timestamp, data);
      }
+   /* remove released touch point from the touch point list */
+   _evas_touch_point_remove(e, 0);
    _evas_unwalk(e);
 }
 
@@ -530,6 +538,9 @@ evas_event_feed_mouse_move(Evas *e, int x, int y, unsigned int timestamp, const
 ////   e->pointer.canvas_y = evas_coord_screen_y_to_world(e, y);
    if ((!e->pointer.inside) && (e->pointer.mouse_grabbed == 0)) return;
    _evas_walk(e);
+   /* update moved touch point */
+   if ((px != x) || (py != y))
+     _evas_touch_point_update(e, 0, e->pointer.x, e->pointer.y, EVAS_TOUCH_POINT_MOVE);
    /* if our mouse button is grabbed to any objects */
    if (e->pointer.mouse_grabbed > 0)
      {
@@ -914,6 +925,8 @@ evas_event_feed_multi_down(Evas *e,
    ev.event_flags = EVAS_EVENT_FLAG_NONE;
 
    _evas_walk(e);
+   /* append new touch point to the touch point list */
+   _evas_touch_point_append(e, d, x, y);
    copy = evas_event_list_copy(e->pointer.object.in);
    EINA_LIST_FOREACH(copy, l, obj)
      {
@@ -940,6 +953,8 @@ evas_event_feed_multi_down(Evas *e,
      }
    if (copy) eina_list_free(copy);
    _evas_post_event_callback_call(e);
+   /* update touch point's state to EVAS_TOUCH_POINT_STILL */
+   _evas_touch_point_update(e, d, x, y, EVAS_TOUCH_POINT_STILL);
    _evas_unwalk(e);
 }
 
@@ -985,6 +1000,8 @@ evas_event_feed_multi_up(Evas *e,
    ev.event_flags = EVAS_EVENT_FLAG_NONE;
 
    _evas_walk(e);
+   /* update released touch point */
+   _evas_touch_point_update(e, d, x, y, EVAS_TOUCH_POINT_UP);
    copy = evas_event_list_copy(e->pointer.object.in);
    EINA_LIST_FOREACH(copy, l, obj)
      {
@@ -1010,6 +1027,8 @@ evas_event_feed_multi_up(Evas *e,
    if (copy) copy = eina_list_free(copy);
    if ((e->pointer.mouse_grabbed == 0) && !_post_up_handle(e, timestamp, data))
       _evas_post_event_callback_call(e);
+   /* remove released touch point from the touch point list */
+   _evas_touch_point_remove(e, d);
    _evas_unwalk(e);
 }
 
@@ -1031,6 +1050,8 @@ evas_event_feed_multi_move(Evas *e,
    if (!e->pointer.inside) return;
 
    _evas_walk(e);
+   /* update moved touch point */
+   _evas_touch_point_update(e, d, x, y, EVAS_TOUCH_POINT_MOVE);
    /* if our mouse button is grabbed to any objects */
    if (e->pointer.mouse_grabbed > 0)
      {
index 74b3807..c658fb1 100644 (file)
@@ -144,6 +144,7 @@ EAPI void
 evas_free(Evas *e)
 {
    Eina_Rectangle *r;
+   Evas_Coord_Touch_Point *touch_point;
    Evas_Layer *lay;
    int i;
    int del;
@@ -250,6 +251,9 @@ evas_free(Evas *e)
    eina_array_flush(&e->calculate_objects);
    eina_array_flush(&e->clip_changes);
 
+   EINA_LIST_FREE(e->touch_points, touch_point)
+     free(touch_point);
+
    e->magic = 0;
    free(e);
 }
diff --git a/src/lib/canvas/evas_touch_point.c b/src/lib/canvas/evas_touch_point.c
new file mode 100644 (file)
index 0000000..bdea73f
--- /dev/null
@@ -0,0 +1,110 @@
+#include "evas_common.h"
+#include "evas_private.h"
+
+void
+_evas_touch_point_append(Evas *e, int id, Evas_Coord x, Evas_Coord y)
+{
+   Evas_Coord_Touch_Point *point;
+
+   /* create new Evas_Coord_Touch_Point */
+   point = (Evas_Coord_Touch_Point *)calloc(1, sizeof(Evas_Coord_Touch_Point));
+   point->x = x;
+   point->y = y;
+   point->id = id;
+   point->state = EVAS_TOUCH_POINT_DOWN;
+   e->touch_points = eina_list_append(e->touch_points, point);
+}
+
+void
+_evas_touch_point_update(Evas *e, int id, Evas_Coord x, Evas_Coord y, Evas_Touch_Point_State state)
+{
+   Eina_List *l;
+   Evas_Coord_Touch_Point *point = NULL;
+
+   EINA_LIST_FOREACH(e->touch_points, l, point)
+     {
+        if (point->id == id)
+          {
+             point->x = x;
+             point->y = y;
+             point->state = state;
+             break;
+          }
+     }
+}
+
+void
+_evas_touch_point_remove(Evas *e, int id)
+{
+   Eina_List *l;
+   Evas_Coord_Touch_Point *point = NULL;
+
+   EINA_LIST_FOREACH(e->touch_points, l, point)
+     {
+        if (point->id == id)
+          {
+             e->touch_points = eina_list_remove(e->touch_points, point);
+             free(point);
+             break;
+          }
+     }
+}
+
+EAPI unsigned int
+evas_touch_point_list_count(Evas *e)
+{
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return 0;
+   MAGIC_CHECK_END();
+   return eina_list_count(e->touch_points);
+}
+
+EAPI void
+evas_touch_point_list_nth_xy_get(Evas *e, unsigned int n, Evas_Coord *x, Evas_Coord *y)
+{
+   Evas_Coord_Touch_Point *point = NULL;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   if (x) *x = 0;
+   if (y) *y = 0;
+   return;
+   MAGIC_CHECK_END();
+
+   point = (Evas_Coord_Touch_Point *)eina_list_nth(e->touch_points, n);
+   if (!point)
+     {
+        if (x) *x = 0;
+        if (y) *y = 0;
+        return;
+     }
+   if (x) *x = point->x;
+   if (y) *y = point->y;
+}
+
+EAPI int
+evas_touch_point_list_nth_id_get(Evas *e, unsigned int n)
+{
+   Evas_Coord_Touch_Point *point = NULL;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return -1;
+   MAGIC_CHECK_END();
+
+   point = (Evas_Coord_Touch_Point *)eina_list_nth(e->touch_points, n);
+   if (!point) return -1;
+   return point->id;
+}
+
+EAPI Evas_Touch_Point_State
+evas_touch_point_list_nth_state_get(Evas *e, unsigned int n)
+{
+   Evas_Coord_Touch_Point *point = NULL;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return EVAS_TOUCH_POINT_CANCEL;
+   MAGIC_CHECK_END();
+
+   point = (Evas_Coord_Touch_Point *)eina_list_nth(e->touch_points, n);
+   if (!point) return EVAS_TOUCH_POINT_CANCEL;
+   return point->state;
+}
index d0f693d..e205cdb 100644 (file)
@@ -46,6 +46,7 @@ typedef struct _Evas_Format                 Evas_Format;
 typedef struct _Evas_Map_Point              Evas_Map_Point;
 typedef struct _Evas_Smart_Cb_Description_Array Evas_Smart_Cb_Description_Array;
 typedef struct _Evas_Post_Callback          Evas_Post_Callback;
+typedef struct _Evas_Coord_Touch_Point      Evas_Coord_Touch_Point;
 
 enum _Evas_Font_Style
 {
@@ -167,6 +168,13 @@ MAGIC_CHECK_FAILED(o, t, m)
         (o)->prev.key = NULL;                                               \
      }
 
+struct _Evas_Coord_Touch_Point
+{
+   Evas_Coord x, y; // point's x, y position
+   int id; // id in order to distinguish each point
+   Evas_Touch_Point_State state;
+};
+
 struct _Evas_Key_Grab
 {
    char               *keyname;
@@ -377,6 +385,8 @@ struct _Evas
    unsigned char  invalidate : 1;
    unsigned char  cleanup : 1;
    unsigned char  focus : 1;
+
+   Eina_List     *touch_points;
 };
 
 struct _Evas_Layer
@@ -1017,6 +1027,11 @@ Eina_Bool evas_map_coords_get(const Evas_Map *m, Evas_Coord x, Evas_Coord y, Eva
 
 Eina_List *evas_module_engine_list(void);
 
+/* for updating touch point list */
+void _evas_touch_point_append(Evas *e, int id, Evas_Coord x, Evas_Coord y);
+void _evas_touch_point_update(Evas *e, int id, Evas_Coord x, Evas_Coord y, Evas_Touch_Point_State state);
+void _evas_touch_point_remove(Evas *e, int id);
+
 /****************************************************************************/
 /*****************************************/
 /********************/