1 #include "evas_common.h"
2 #include "evas_private.h"
4 static void evas_object_event_callback_clear(Evas_Object *obj);
5 static void evas_event_callback_clear(Evas *e);
6 int _evas_event_counter = 0;
13 _evas_post_event_callback_call(Evas *e)
15 Evas_Post_Callback *pc;
18 if (e->delete_me) return;
20 EINA_LIST_FREE(e->post_events, pc)
22 if ((!skip) && (!e->delete_me) && (!pc->delete_me))
24 if (!pc->func((void*)pc->data, e)) skip = 1;
26 EVAS_MEMPOOL_FREE(_mp_pc, pc);
32 _evas_post_event_callback_free(Evas *e)
34 Evas_Post_Callback *pc;
36 EINA_LIST_FREE(e->post_events, pc)
38 EVAS_MEMPOOL_FREE(_mp_pc, pc);
44 evas_event_callback_list_post_free(Eina_Inlist **list)
53 fn = (Evas_Func_Node *)l;
57 *list = eina_inlist_remove(*list, EINA_INLIST_GET(fn));
58 EVAS_MEMPOOL_FREE(_mp_fn, fn);
64 evas_object_event_callback_clear(Evas_Object *obj)
66 if (!obj->callbacks) return;
67 if (!obj->callbacks->deletions_waiting) return;
68 obj->callbacks->deletions_waiting = 0;
69 evas_event_callback_list_post_free(&obj->callbacks->callbacks);
70 if (!obj->callbacks->callbacks)
72 EVAS_MEMPOOL_FREE(_mp_cb, obj->callbacks);
73 obj->callbacks = NULL;
78 evas_event_callback_clear(Evas *e)
80 if (!e->callbacks) return;
81 if (!e->callbacks->deletions_waiting) return;
82 e->callbacks->deletions_waiting = 0;
83 evas_event_callback_list_post_free(&e->callbacks->callbacks);
84 if (!e->callbacks->callbacks)
86 EVAS_MEMPOOL_FREE(_mp_cb, e->callbacks);
92 evas_object_event_callback_all_del(Evas_Object *obj)
96 if (!obj->callbacks) return;
97 EINA_INLIST_FOREACH(obj->callbacks->callbacks, fn)
102 evas_object_event_callback_cleanup(Evas_Object *obj)
105 if (!obj->callbacks) return;
106 evas_event_callback_list_post_free(&obj->callbacks->callbacks);
107 EVAS_MEMPOOL_FREE(_mp_cb, obj->callbacks);
108 obj->callbacks = NULL;
112 evas_event_callback_all_del(Evas *e)
116 if (!e->callbacks) return;
117 EINA_INLIST_FOREACH(e->callbacks->callbacks, fn)
122 evas_event_callback_cleanup(Evas *e)
125 if (!e->callbacks) return;
126 evas_event_callback_list_post_free(&e->callbacks->callbacks);
127 EVAS_MEMPOOL_FREE(_mp_cb, e->callbacks);
132 evas_event_callback_call(Evas *e, Evas_Callback_Type type, void *event_info)
134 Eina_Inlist **l_mod = NULL, *l;
139 l_mod = &e->callbacks->callbacks;
140 e->callbacks->walking_list++;
141 for (l = *l_mod; l; l = l->next)
145 fn = (Evas_Func_Node *)l;
146 if ((fn->type == type) && (!fn->delete_me))
148 Evas_Event_Cb func = fn->func;
150 func(fn->data, e, event_info);
152 if (e->delete_me) break;
154 e->callbacks->walking_list--;
155 if (!e->callbacks->walking_list)
157 evas_event_callback_clear(e);
165 evas_object_event_callback_call(Evas_Object *obj, Evas_Callback_Type type, void *event_info)
168 Eina_Inlist **l_mod = NULL, *l;
169 Evas_Button_Flags flags = EVAS_BUTTON_NONE;
172 if ((obj->delete_me) || (!obj->layer)) return;
173 if ((obj->last_event == _evas_event_counter) &&
174 (obj->last_event_type == type)) return;
175 obj->last_event = _evas_event_counter;
176 obj->last_event_type = type;
177 if (!(e = obj->layer->evas)) return;
182 l_mod = &obj->callbacks->callbacks;
185 case EVAS_CALLBACK_MOUSE_DOWN:
187 Evas_Event_Mouse_Down *ev = event_info;
190 if (ev->flags & (EVAS_BUTTON_DOUBLE_CLICK | EVAS_BUTTON_TRIPLE_CLICK))
192 if (obj->last_mouse_down_counter < (e->last_mouse_down_counter - 1))
193 ev->flags &= ~(EVAS_BUTTON_DOUBLE_CLICK | EVAS_BUTTON_TRIPLE_CLICK);
195 obj->last_mouse_down_counter = e->last_mouse_down_counter;
198 case EVAS_CALLBACK_MOUSE_UP:
200 Evas_Event_Mouse_Up *ev = event_info;
203 if (ev->flags & (EVAS_BUTTON_DOUBLE_CLICK | EVAS_BUTTON_TRIPLE_CLICK))
205 if (obj->last_mouse_up_counter < (e->last_mouse_up_counter - 1))
206 ev->flags &= ~(EVAS_BUTTON_DOUBLE_CLICK | EVAS_BUTTON_TRIPLE_CLICK);
208 obj->last_mouse_up_counter = e->last_mouse_up_counter;
214 obj->callbacks->walking_list++;
215 for (l = *l_mod; l; l = l->next)
219 fn = (Evas_Func_Node *)l;
220 if ((fn->type == type) && (!fn->delete_me))
222 Evas_Object_Event_Cb func = fn->func;
224 func(fn->data, obj->layer->evas, obj, event_info);
226 if (obj->delete_me) break;
228 obj->callbacks->walking_list--;
229 if (!obj->callbacks->walking_list)
231 evas_object_event_callback_clear(obj);
235 if (type == EVAS_CALLBACK_MOUSE_DOWN)
237 Evas_Event_Mouse_Down *ev = event_info;
240 else if (type == EVAS_CALLBACK_MOUSE_UP)
242 Evas_Event_Mouse_Up *ev = event_info;
247 if (!((obj->no_propagate) && (l_mod) && (*l_mod)))
249 if (!obj->no_propagate)
251 if ((obj->smart.parent) && (type != EVAS_CALLBACK_FREE) &&
252 (type <= EVAS_CALLBACK_KEY_UP))
253 evas_object_event_callback_call(obj->smart.parent, type, event_info);
260 _callback_priority_cmp(const void *_a, const void *_b)
262 const Evas_Func_Node *a, *b;
263 a = EINA_INLIST_CONTAINER_GET(_a, Evas_Func_Node);
264 b = EINA_INLIST_CONTAINER_GET(_b, Evas_Func_Node);
265 if (a->priority < b->priority)
272 evas_object_event_callback_add(Evas_Object *obj, Evas_Callback_Type type, Evas_Object_Event_Cb func, const void *data)
274 evas_object_event_callback_priority_add(obj, type,
275 EVAS_CALLBACK_PRIORITY_DEFAULT, func, data);
279 evas_object_event_callback_priority_add(Evas_Object *obj, Evas_Callback_Type type, Evas_Callback_Priority priority, Evas_Object_Event_Cb func, const void *data)
284 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
292 EVAS_MEMPOOL_INIT(_mp_cb, "evas_callbacks", Evas_Callbacks, 512, );
293 obj->callbacks = EVAS_MEMPOOL_ALLOC(_mp_cb, Evas_Callbacks);
294 if (!obj->callbacks) return;
295 EVAS_MEMPOOL_PREP(_mp_cb, obj->callbacks, Evas_Callbacks);
298 EVAS_MEMPOOL_INIT(_mp_fn, "evas_func_node", Evas_Func_Node, 2048, );
299 fn = EVAS_MEMPOOL_ALLOC(_mp_fn, Evas_Func_Node);
301 EVAS_MEMPOOL_PREP(_mp_fn, fn, Evas_Func_Node);
303 fn->data = (void *)data;
305 fn->priority = priority;
307 obj->callbacks->callbacks =
308 eina_inlist_sorted_insert(obj->callbacks->callbacks, EINA_INLIST_GET(fn),
309 _callback_priority_cmp);
313 evas_object_event_callback_del(Evas_Object *obj, Evas_Callback_Type type, Evas_Object_Event_Cb func)
318 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
322 if (!func) return NULL;
324 if (!obj->callbacks) return NULL;
326 EINA_INLIST_FOREACH(obj->callbacks->callbacks, fn)
328 if ((fn->func == func) && (fn->type == type) && (!fn->delete_me))
334 obj->callbacks->deletions_waiting = 1;
335 if (!obj->callbacks->walking_list)
336 evas_object_event_callback_clear(obj);
344 evas_object_event_callback_del_full(Evas_Object *obj, Evas_Callback_Type type, Evas_Object_Event_Cb func, const void *data)
349 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
353 if (!func) return NULL;
355 if (!obj->callbacks) return NULL;
357 EINA_INLIST_FOREACH(obj->callbacks->callbacks, fn)
359 if ((fn->func == func) && (fn->type == type) && (fn->data == data) && (!fn->delete_me))
365 obj->callbacks->deletions_waiting = 1;
366 if (!obj->callbacks->walking_list)
367 evas_object_event_callback_clear(obj);
375 evas_event_callback_add(Evas *e, Evas_Callback_Type type, Evas_Event_Cb func, const void *data)
377 evas_event_callback_priority_add(e, type, EVAS_CALLBACK_PRIORITY_DEFAULT,
382 evas_event_callback_priority_add(Evas *e, Evas_Callback_Type type, Evas_Callback_Priority priority, Evas_Event_Cb func, const void *data)
387 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
395 EVAS_MEMPOOL_INIT(_mp_cb, "evas_callbacks", Evas_Callbacks, 512, );
396 e->callbacks = EVAS_MEMPOOL_ALLOC(_mp_cb, Evas_Callbacks);
397 if (!e->callbacks) return;
398 EVAS_MEMPOOL_PREP(_mp_cb, e->callbacks, Evas_Callbacks);
401 EVAS_MEMPOOL_INIT(_mp_fn, "evas_func_node", Evas_Func_Node, 2048, );
402 fn = EVAS_MEMPOOL_ALLOC(_mp_fn, Evas_Func_Node);
404 EVAS_MEMPOOL_PREP(_mp_fn, fn, Evas_Func_Node);
406 fn->data = (void *)data;
408 fn->priority = priority;
410 e->callbacks->callbacks = eina_inlist_sorted_insert(e->callbacks->callbacks,
411 EINA_INLIST_GET(fn), _callback_priority_cmp);
415 evas_event_callback_del(Evas *e, Evas_Callback_Type type, Evas_Event_Cb func)
420 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
424 if (!func) return NULL;
426 if (!e->callbacks) return NULL;
428 EINA_INLIST_FOREACH(e->callbacks->callbacks, fn)
430 if ((fn->func == func) && (fn->type == type) && (!fn->delete_me))
436 e->callbacks->deletions_waiting = 1;
437 if (!e->callbacks->walking_list)
438 evas_event_callback_clear(e);
446 evas_event_callback_del_full(Evas *e, Evas_Callback_Type type, Evas_Event_Cb func, const void *data)
451 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
455 if (!func) return NULL;
457 if (!e->callbacks) return NULL;
459 EINA_INLIST_FOREACH(e->callbacks->callbacks, fn)
461 if ((fn->func == func) && (fn->type == type) && (fn->data == data) && (!fn->delete_me))
467 e->callbacks->deletions_waiting = 1;
468 if (!e->callbacks->walking_list)
469 evas_event_callback_clear(e);
477 evas_post_event_callback_push(Evas *e, Evas_Object_Event_Post_Cb func, const void *data)
479 Evas_Post_Callback *pc;
481 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
485 EVAS_MEMPOOL_INIT(_mp_pc, "evas_post_callback", Evas_Post_Callback, 64, );
486 pc = EVAS_MEMPOOL_ALLOC(_mp_pc, Evas_Post_Callback);
488 EVAS_MEMPOOL_PREP(_mp_pc, pc, Evas_Post_Callback);
489 if (e->delete_me) return;
493 e->post_events = eina_list_prepend(e->post_events, pc);
497 evas_post_event_callback_remove(Evas *e, Evas_Object_Event_Post_Cb func)
499 Evas_Post_Callback *pc;
502 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
506 EINA_LIST_FOREACH(e->post_events, l, pc)
508 if (pc->func == func)
517 evas_post_event_callback_remove_full(Evas *e, Evas_Object_Event_Post_Cb func, const void *data)
519 Evas_Post_Callback *pc;
522 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
526 EINA_LIST_FOREACH(e->post_events, l, pc)
528 if ((pc->func == func) && (pc->data == data))