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)
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)
{
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
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
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++;
+}
#ifdef E_TYPEDEFS
typedef struct _E_Pointer E_Pointer;
+typedef struct _E_Pointer_Hook E_Pointer_Hook;
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
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);
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