From: Junkyeong, Kim Date: Thu, 27 Jan 2022 00:22:29 +0000 (+0900) Subject: e_pointer: add e_pointer hook X-Git-Tag: submit/tizen_6.5/20220127.065618~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b7bc51a13b821ca8f7d6236b7f2d76353fec0c20;p=platform%2Fupstream%2Fenlightenment.git e_pointer: add e_pointer hook Add two default e_pointer hook point below. E_POINTER_HOOK_TOUCH_MOVE E_POINTER_HOOK_MOUSE_MOVE Change-Id: I768435732f01b15c20125bd1a99a59ecc8392061 Signed-off-by: Junkyeong, Kim --- diff --git a/src/bin/e_pointer.c b/src/bin/e_pointer.c index 3f88e9b6e6..da08f9b663 100644 --- a/src/bin/e_pointer.c +++ b/src/bin/e_pointer.c @@ -4,6 +4,14 @@ static Eina_List *_ptrs = NULL; static Eina_Bool _initted = EINA_FALSE; +static int _e_pointer_hooks_delete = 0; +static int _e_pointer_hooks_walking = 0; +static Eina_Inlist *_e_pointer_hooks[] = +{ + [E_POINTER_HOOK_TOUCH_MOVE] = NULL, + [E_POINTER_HOOK_MOUSE_MOVE] = NULL, +}; + /* move the cursor image with the calcaultion of the hot spot */ static void _e_pointer_position_update(E_Pointer *ptr) @@ -114,6 +122,44 @@ _e_pointer_cb_free(E_Pointer *ptr) free(ptr); } +static void +_e_pointer_hooks_clean(void) +{ + Eina_Inlist *l; + E_Pointer_Hook *ph; + unsigned int x; + + for (x = 0; x < E_POINTER_HOOK_LAST; x++) + EINA_INLIST_FOREACH_SAFE(_e_pointer_hooks[x], l, ph) + { + if (!ph->delete_me) continue; + _e_pointer_hooks[x] = eina_inlist_remove(_e_pointer_hooks[x], EINA_INLIST_GET(ph)); + free(ph); + } + + _e_pointer_hooks_delete = 0; +} + +static Eina_Bool +_e_pointer_hook_call(E_Pointer_Hook_Point hookpoint, E_Pointer *ptr) +{ + E_Pointer_Hook *ph; + + e_object_ref(E_OBJECT(ptr)); + _e_pointer_hooks_walking++; + EINA_INLIST_FOREACH(_e_pointer_hooks[hookpoint], ph) + { + if (ph->delete_me) continue; + ph->func(ph->data, ptr); + if (e_object_is_del(E_OBJECT(ptr))) + break; + } + _e_pointer_hooks_walking--; + if ((_e_pointer_hooks_walking == 0) && (_e_pointer_hooks_delete > 0)) + _e_pointer_hooks_clean(); + return !!e_object_unref(E_OBJECT(ptr)); +} + EINTERN int e_pointer_init(void) { @@ -240,6 +286,8 @@ e_pointer_touch_move(E_Pointer *ptr, int x, int y) if (ptr->device != E_POINTER_TOUCH) ptr->device = E_POINTER_TOUCH; _e_pointer_position_update(ptr); + + _e_pointer_hook_call(E_POINTER_HOOK_TOUCH_MOVE, ptr); } E_API void @@ -256,6 +304,8 @@ e_pointer_mouse_move(E_Pointer *ptr, int x, int y) if (ptr->device != E_POINTER_MOUSE) ptr->device = E_POINTER_MOUSE; _e_pointer_position_update(ptr); + + _e_pointer_hook_call(E_POINTER_HOOK_MOUSE_MOVE, ptr); } E_API void @@ -353,3 +403,31 @@ e_pointer_get(E_Client *ec) return NULL; } + +E_API E_Pointer_Hook * +e_pointer_hook_add(E_Pointer_Hook_Point hookpoint, E_Pointer_Hook_Cb func, const void *data) +{ + E_Pointer_Hook *ph; + + EINA_SAFETY_ON_TRUE_RETURN_VAL(hookpoint >= E_POINTER_HOOK_LAST, NULL); + ph = E_NEW(E_Pointer_Hook, 1); + if (!ph) return NULL; + ph->hookpoint = hookpoint; + ph->func = func; + ph->data = (void*)data; + _e_pointer_hooks[hookpoint] = eina_inlist_append(_e_pointer_hooks[hookpoint], EINA_INLIST_GET(ph)); + return ph; +} + +E_API void +e_pointer_hook_del(E_Pointer_Hook *ph) +{ + ph->delete_me = 1; + if (_e_pointer_hooks_walking == 0) + { + _e_pointer_hooks[ph->hookpoint] = eina_inlist_remove(_e_pointer_hooks[ph->hookpoint], EINA_INLIST_GET(ph)); + free(ph); + } + else + _e_pointer_hooks_delete++; +} diff --git a/src/bin/e_pointer.h b/src/bin/e_pointer.h index 887c2a8917..d125629a34 100644 --- a/src/bin/e_pointer.h +++ b/src/bin/e_pointer.h @@ -1,6 +1,7 @@ #ifdef E_TYPEDEFS typedef struct _E_Pointer E_Pointer; +typedef struct _E_Pointer_Hook E_Pointer_Hook; typedef enum { @@ -24,6 +25,15 @@ typedef enum E_POINTER_TOUCH = 2 } E_Pointer_Device; +typedef enum _E_Pointer_Hook_Point +{ + E_POINTER_HOOK_TOUCH_MOVE, + E_POINTER_HOOK_MOUSE_MOVE, + E_POINTER_HOOK_LAST, +} E_Pointer_Hook_Point; + +typedef void (*E_Pointer_Hook_Cb)(void *data, E_Pointer *ptr); + #else # ifndef E_POINTER_H # define E_POINTER_H @@ -54,6 +64,15 @@ struct _E_Pointer Eina_Bool hwc; }; +struct _E_Pointer_Hook +{ + EINA_INLIST; + E_Pointer_Hook_Point hookpoint; + E_Pointer_Hook_Cb func; + void *data; + unsigned char delete_me : 1; +}; + EINTERN int e_pointer_init(void); EINTERN int e_pointer_shutdown(void); EINTERN E_Pointer *e_pointer_canvas_new(Ecore_Evas *ee, Eina_Bool filled); @@ -68,5 +87,9 @@ E_API void e_pointer_hide(E_Pointer *ptr); E_API Eina_Bool e_pointer_is_hidden(E_Pointer *ptr); E_API void e_pointer_rotation_set(E_Pointer *ptr, int rotation); E_API void e_pointer_position_get(E_Pointer *ptr, int *x, int *y); + +E_API E_Pointer_Hook *e_pointer_hook_add(E_Pointer_Hook_Point hookpoint, E_Pointer_Hook_Cb func, const void *data); +E_API void e_pointer_hook_del(E_Pointer_Hook *ch); + # endif #endif