e_pointer: add e_pointer hook 22/270222/1
authorJunkyeong, Kim <jk0430.kim@samsung.com>
Thu, 27 Jan 2022 00:22:29 +0000 (09:22 +0900)
committerJunkyeong, Kim <jk0430.kim@samsung.com>
Thu, 27 Jan 2022 00:22:33 +0000 (09:22 +0900)
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 <jk0430.kim@samsung.com>
src/bin/e_pointer.c
src/bin/e_pointer.h

index 3f88e9b6e6e79d2d6b23a8db5be0aa2d35b33418..da08f9b6630e1bb8b95f8e4a4d81916b4657bdd5 100644 (file)
@@ -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++;
+}
index 887c2a8917eb1edefb4320945fc135b6dc822963..d125629a34eab7397e945f49757544a4016ba64b 100644 (file)
@@ -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