diff --git a/legacy/evas/src/lib/Evas.h b/legacy/evas/src/lib/Evas.h index e22284ab0e..1e992d7491 100644 --- a/legacy/evas/src/lib/Evas.h +++ b/legacy/evas/src/lib/Evas.h @@ -487,6 +487,18 @@ typedef enum _Evas_Event_Flags EVAS_EVENT_FLAG_ON_SCROLL = (1 << 1) /**< This event flag indicates the event occurs while scrolling; for exameple, DOWN event occurs during scrolling; the event should be used for informational purposes and maybe some indications visually, but not actually perform anything */ } 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 @@ -12035,6 +12047,141 @@ EAPI Eina_Bool evas_object_key_grab (Evas_Object *obj, cons */ EAPI void evas_object_key_ungrab (Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers) EINA_ARG_NONNULL(1, 2); +/** + * @} + */ + +/** + * @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); + /** * @} */ diff --git a/legacy/evas/src/lib/canvas/Makefile.am b/legacy/evas/src/lib/canvas/Makefile.am index 32dadc3219..79544aa46c 100644 --- a/legacy/evas/src/lib/canvas/Makefile.am +++ b/legacy/evas/src/lib/canvas/Makefile.am @@ -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 diff --git a/legacy/evas/src/lib/canvas/evas_events.c b/legacy/evas/src/lib/canvas/evas_events.c index d15913a347..fe619daacf 100644 --- a/legacy/evas/src/lib/canvas/evas_events.c +++ b/legacy/evas/src/lib/canvas/evas_events.c @@ -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) { diff --git a/legacy/evas/src/lib/canvas/evas_main.c b/legacy/evas/src/lib/canvas/evas_main.c index 74b380792a..c658fb1088 100644 --- a/legacy/evas/src/lib/canvas/evas_main.c +++ b/legacy/evas/src/lib/canvas/evas_main.c @@ -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/legacy/evas/src/lib/canvas/evas_touch_point.c b/legacy/evas/src/lib/canvas/evas_touch_point.c new file mode 100644 index 0000000000..bdea73fe31 --- /dev/null +++ b/legacy/evas/src/lib/canvas/evas_touch_point.c @@ -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; +} diff --git a/legacy/evas/src/lib/include/evas_private.h b/legacy/evas/src/lib/include/evas_private.h index d0f693d12b..e205cdbd89 100644 --- a/legacy/evas/src/lib/include/evas_private.h +++ b/legacy/evas/src/lib/include/evas_private.h @@ -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); + /****************************************************************************/ /*****************************************/ /********************/