aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/evas/src/lib/canvas/evas_callbacks.c
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/evas/src/lib/canvas/evas_callbacks.c')
-rw-r--r--libraries/evas/src/lib/canvas/evas_callbacks.c543
1 files changed, 0 insertions, 543 deletions
diff --git a/libraries/evas/src/lib/canvas/evas_callbacks.c b/libraries/evas/src/lib/canvas/evas_callbacks.c
deleted file mode 100644
index 47cfb0c..0000000
--- a/libraries/evas/src/lib/canvas/evas_callbacks.c
+++ /dev/null
@@ -1,543 +0,0 @@
1#include "evas_common.h"
2#include "evas_private.h"
3
4static void evas_object_event_callback_clear(Evas_Object *obj);
5static void evas_event_callback_clear(Evas *e);
6int _evas_event_counter = 0;
7
8EVAS_MEMPOOL(_mp_fn);
9EVAS_MEMPOOL(_mp_cb);
10EVAS_MEMPOOL(_mp_pc);
11
12void
13_evas_post_event_callback_call(Evas *e)
14{
15 Evas_Post_Callback *pc;
16 int skip = 0;
17
18 if (e->delete_me) return;
19 _evas_walk(e);
20 EINA_LIST_FREE(e->post_events, pc)
21 {
22 if ((!skip) && (!e->delete_me) && (!pc->delete_me))
23 {
24 if (!pc->func((void*)pc->data, e)) skip = 1;
25 }
26 EVAS_MEMPOOL_FREE(_mp_pc, pc);
27 }
28 _evas_unwalk(e);
29}
30
31void
32_evas_post_event_callback_free(Evas *e)
33{
34 Evas_Post_Callback *pc;
35
36 EINA_LIST_FREE(e->post_events, pc)
37 {
38 EVAS_MEMPOOL_FREE(_mp_pc, pc);
39 }
40 _evas_unwalk(e);
41}
42
43void
44evas_event_callback_list_post_free(Eina_Inlist **list)
45{
46 Eina_Inlist *l;
47
48 /* MEM OK */
49 for (l = *list; l;)
50 {
51 Evas_Func_Node *fn;
52
53 fn = (Evas_Func_Node *)l;
54 l = l->next;
55 if (fn->delete_me)
56 {
57 *list = eina_inlist_remove(*list, EINA_INLIST_GET(fn));
58 EVAS_MEMPOOL_FREE(_mp_fn, fn);
59 }
60 }
61}
62
63static void
64evas_object_event_callback_clear(Evas_Object *obj)
65{
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)
71 {
72 EVAS_MEMPOOL_FREE(_mp_cb, obj->callbacks);
73 obj->callbacks = NULL;
74 }
75}
76
77static void
78evas_event_callback_clear(Evas *e)
79{
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)
85 {
86 EVAS_MEMPOOL_FREE(_mp_cb, e->callbacks);
87 e->callbacks = NULL;
88 }
89}
90
91void
92evas_object_event_callback_all_del(Evas_Object *obj)
93{
94 Evas_Func_Node *fn;
95
96 if (!obj->callbacks) return;
97 EINA_INLIST_FOREACH(obj->callbacks->callbacks, fn)
98 fn->delete_me = 1;
99}
100
101void
102evas_object_event_callback_cleanup(Evas_Object *obj)
103{
104 /* MEM OK */
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;
109}
110
111void
112evas_event_callback_all_del(Evas *e)
113{
114 Evas_Func_Node *fn;
115
116 if (!e->callbacks) return;
117 EINA_INLIST_FOREACH(e->callbacks->callbacks, fn)
118 fn->delete_me = 1;
119}
120
121void
122evas_event_callback_cleanup(Evas *e)
123{
124 /* MEM OK */
125 if (!e->callbacks) return;
126 evas_event_callback_list_post_free(&e->callbacks->callbacks);
127 EVAS_MEMPOOL_FREE(_mp_cb, e->callbacks);
128 e->callbacks = NULL;
129}
130
131void
132evas_event_callback_call(Evas *e, Evas_Callback_Type type, void *event_info)
133{
134 Eina_Inlist **l_mod = NULL, *l;
135
136 _evas_walk(e);
137 if (e->callbacks)
138 {
139 l_mod = &e->callbacks->callbacks;
140 e->callbacks->walking_list++;
141 for (l = *l_mod; l; l = l->next)
142 {
143 Evas_Func_Node *fn;
144
145 fn = (Evas_Func_Node *)l;
146 if ((fn->type == type) && (!fn->delete_me))
147 {
148 Evas_Event_Cb func = fn->func;
149 if (func)
150 func(fn->data, e, event_info);
151 }
152 if (e->delete_me) break;
153 }
154 e->callbacks->walking_list--;
155 if (!e->callbacks->walking_list)
156 {
157 evas_event_callback_clear(e);
158 l_mod = NULL;
159 }
160 }
161 _evas_unwalk(e);
162}
163
164void
165evas_object_event_callback_call(Evas_Object *obj, Evas_Callback_Type type, void *event_info, int event_id)
166{
167 /* MEM OK */
168 Eina_Inlist **l_mod = NULL, *l;
169 Evas_Button_Flags flags = EVAS_BUTTON_NONE;
170 Evas *e;
171
172 if ((obj->delete_me) || (!obj->layer)) return;
173 if ((obj->last_event == event_id) &&
174 (obj->last_event_type == type)) return;
175 if (obj->last_event > event_id)
176 {
177 if ((obj->last_event_type == EVAS_CALLBACK_MOUSE_OUT) &&
178 ((type >= EVAS_CALLBACK_MOUSE_DOWN) &&
179 (type <= EVAS_CALLBACK_MULTI_MOVE)))
180 {
181 return;
182 }
183 }
184 obj->last_event = event_id;
185 obj->last_event_type = type;
186 if (!(e = obj->layer->evas)) return;
187
188 _evas_walk(e);
189 if (obj->callbacks)
190 {
191 l_mod = &obj->callbacks->callbacks;
192 switch (type)
193 {
194 case EVAS_CALLBACK_MOUSE_DOWN:
195 {
196 Evas_Event_Mouse_Down *ev = event_info;
197
198 flags = ev->flags;
199 if (ev->flags & (EVAS_BUTTON_DOUBLE_CLICK | EVAS_BUTTON_TRIPLE_CLICK))
200 {
201 if (obj->last_mouse_down_counter < (e->last_mouse_down_counter - 1))
202 ev->flags &= ~(EVAS_BUTTON_DOUBLE_CLICK | EVAS_BUTTON_TRIPLE_CLICK);
203 }
204 obj->last_mouse_down_counter = e->last_mouse_down_counter;
205 break;
206 }
207 case EVAS_CALLBACK_MOUSE_UP:
208 {
209 Evas_Event_Mouse_Up *ev = event_info;
210
211 flags = ev->flags;
212 if (ev->flags & (EVAS_BUTTON_DOUBLE_CLICK | EVAS_BUTTON_TRIPLE_CLICK))
213 {
214 if (obj->last_mouse_up_counter < (e->last_mouse_up_counter - 1))
215 ev->flags &= ~(EVAS_BUTTON_DOUBLE_CLICK | EVAS_BUTTON_TRIPLE_CLICK);
216 }
217 obj->last_mouse_up_counter = e->last_mouse_up_counter;
218 break;
219 }
220 default:
221 break;
222 }
223 obj->callbacks->walking_list++;
224 for (l = *l_mod; l; l = l->next)
225 {
226 Evas_Func_Node *fn;
227
228 fn = (Evas_Func_Node *)l;
229 if ((fn->type == type) && (!fn->delete_me))
230 {
231 Evas_Object_Event_Cb func = fn->func;
232 if (func)
233 func(fn->data, obj->layer->evas, obj, event_info);
234 }
235 if (obj->delete_me) break;
236 }
237 obj->callbacks->walking_list--;
238 if (!obj->callbacks->walking_list)
239 {
240 evas_object_event_callback_clear(obj);
241 l_mod = NULL;
242 }
243
244 if (type == EVAS_CALLBACK_MOUSE_DOWN)
245 {
246 Evas_Event_Mouse_Down *ev = event_info;
247 ev->flags = flags;
248 }
249 else if (type == EVAS_CALLBACK_MOUSE_UP)
250 {
251 Evas_Event_Mouse_Up *ev = event_info;
252 ev->flags = flags;
253 }
254 }
255
256 if (!((obj->no_propagate) && (l_mod) && (*l_mod)))
257 {
258 if (!obj->no_propagate)
259 {
260 if ((obj->smart.parent) && (type != EVAS_CALLBACK_FREE) &&
261 (type <= EVAS_CALLBACK_KEY_UP))
262 evas_object_event_callback_call(obj->smart.parent, type, event_info, event_id);
263 }
264 }
265 _evas_unwalk(e);
266}
267
268static int
269_callback_priority_cmp(const void *_a, const void *_b)
270{
271 const Evas_Func_Node *a, *b;
272 a = EINA_INLIST_CONTAINER_GET(_a, Evas_Func_Node);
273 b = EINA_INLIST_CONTAINER_GET(_b, Evas_Func_Node);
274 if (a->priority < b->priority)
275 return -1;
276 else
277 return 1;
278}
279
280EAPI void
281evas_object_event_callback_add(Evas_Object *obj, Evas_Callback_Type type, Evas_Object_Event_Cb func, const void *data)
282{
283 evas_object_event_callback_priority_add(obj, type,
284 EVAS_CALLBACK_PRIORITY_DEFAULT, func, data);
285}
286
287EAPI void
288evas_object_event_callback_priority_add(Evas_Object *obj, Evas_Callback_Type type, Evas_Callback_Priority priority, Evas_Object_Event_Cb func, const void *data)
289{
290 /* MEM OK */
291 Evas_Func_Node *fn;
292
293 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
294 return;
295 MAGIC_CHECK_END();
296
297 if (!func) return;
298
299 if (!obj->callbacks)
300 {
301 EVAS_MEMPOOL_INIT(_mp_cb, "evas_callbacks", Evas_Callbacks, 512, );
302 obj->callbacks = EVAS_MEMPOOL_ALLOC(_mp_cb, Evas_Callbacks);
303 if (!obj->callbacks) return;
304 EVAS_MEMPOOL_PREP(_mp_cb, obj->callbacks, Evas_Callbacks);
305 }
306
307 EVAS_MEMPOOL_INIT(_mp_fn, "evas_func_node", Evas_Func_Node, 2048, );
308 fn = EVAS_MEMPOOL_ALLOC(_mp_fn, Evas_Func_Node);
309 if (!fn) return;
310 EVAS_MEMPOOL_PREP(_mp_fn, fn, Evas_Func_Node);
311 fn->func = func;
312 fn->data = (void *)data;
313 fn->type = type;
314 fn->priority = priority;
315
316 obj->callbacks->callbacks =
317 eina_inlist_sorted_insert(obj->callbacks->callbacks, EINA_INLIST_GET(fn),
318 _callback_priority_cmp);
319}
320
321EAPI void *
322evas_object_event_callback_del(Evas_Object *obj, Evas_Callback_Type type, Evas_Object_Event_Cb func)
323{
324 /* MEM OK */
325 Evas_Func_Node *fn;
326
327 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
328 return NULL;
329 MAGIC_CHECK_END();
330
331 if (!func) return NULL;
332
333 if (!obj->callbacks) return NULL;
334
335 EINA_INLIST_FOREACH(obj->callbacks->callbacks, fn)
336 {
337 if ((fn->func == func) && (fn->type == type) && (!fn->delete_me))
338 {
339 void *tmp;
340
341 tmp = fn->data;
342 fn->delete_me = 1;
343 obj->callbacks->deletions_waiting = 1;
344 if (!obj->callbacks->walking_list)
345 evas_object_event_callback_clear(obj);
346 return tmp;
347 }
348 }
349 return NULL;
350}
351
352EAPI void *
353evas_object_event_callback_del_full(Evas_Object *obj, Evas_Callback_Type type, Evas_Object_Event_Cb func, const void *data)
354{
355 /* MEM OK */
356 Evas_Func_Node *fn;
357
358 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
359 return NULL;
360 MAGIC_CHECK_END();
361
362 if (!func) return NULL;
363
364 if (!obj->callbacks) return NULL;
365
366 EINA_INLIST_FOREACH(obj->callbacks->callbacks, fn)
367 {
368 if ((fn->func == func) && (fn->type == type) && (fn->data == data) && (!fn->delete_me))
369 {
370 void *tmp;
371
372 tmp = fn->data;
373 fn->delete_me = 1;
374 obj->callbacks->deletions_waiting = 1;
375 if (!obj->callbacks->walking_list)
376 evas_object_event_callback_clear(obj);
377 return tmp;
378 }
379 }
380 return NULL;
381}
382
383EAPI void
384evas_event_callback_add(Evas *e, Evas_Callback_Type type, Evas_Event_Cb func, const void *data)
385{
386 evas_event_callback_priority_add(e, type, EVAS_CALLBACK_PRIORITY_DEFAULT,
387 func, data);
388}
389
390EAPI void
391evas_event_callback_priority_add(Evas *e, Evas_Callback_Type type, Evas_Callback_Priority priority, Evas_Event_Cb func, const void *data)
392{
393 /* MEM OK */
394 Evas_Func_Node *fn;
395
396 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
397 return;
398 MAGIC_CHECK_END();
399
400 if (!func) return;
401
402 if (!e->callbacks)
403 {
404 EVAS_MEMPOOL_INIT(_mp_cb, "evas_callbacks", Evas_Callbacks, 512, );
405 e->callbacks = EVAS_MEMPOOL_ALLOC(_mp_cb, Evas_Callbacks);
406 if (!e->callbacks) return;
407 EVAS_MEMPOOL_PREP(_mp_cb, e->callbacks, Evas_Callbacks);
408 }
409
410 EVAS_MEMPOOL_INIT(_mp_fn, "evas_func_node", Evas_Func_Node, 2048, );
411 fn = EVAS_MEMPOOL_ALLOC(_mp_fn, Evas_Func_Node);
412 if (!fn) return;
413 EVAS_MEMPOOL_PREP(_mp_fn, fn, Evas_Func_Node);
414 fn->func = func;
415 fn->data = (void *)data;
416 fn->type = type;
417 fn->priority = priority;
418
419 e->callbacks->callbacks = eina_inlist_sorted_insert(e->callbacks->callbacks,
420 EINA_INLIST_GET(fn), _callback_priority_cmp);
421}
422
423EAPI void *
424evas_event_callback_del(Evas *e, Evas_Callback_Type type, Evas_Event_Cb func)
425{
426 /* MEM OK */
427 Evas_Func_Node *fn;
428
429 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
430 return NULL;
431 MAGIC_CHECK_END();
432
433 if (!func) return NULL;
434
435 if (!e->callbacks) return NULL;
436
437 EINA_INLIST_FOREACH(e->callbacks->callbacks, fn)
438 {
439 if ((fn->func == func) && (fn->type == type) && (!fn->delete_me))
440 {
441 void *data;
442
443 data = fn->data;
444 fn->delete_me = 1;
445 e->callbacks->deletions_waiting = 1;
446 if (!e->callbacks->walking_list)
447 evas_event_callback_clear(e);
448 return data;
449 }
450 }
451 return NULL;
452}
453
454EAPI void *
455evas_event_callback_del_full(Evas *e, Evas_Callback_Type type, Evas_Event_Cb func, const void *data)
456{
457 /* MEM OK */
458 Evas_Func_Node *fn;
459
460 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
461 return NULL;
462 MAGIC_CHECK_END();
463
464 if (!func) return NULL;
465
466 if (!e->callbacks) return NULL;
467
468 EINA_INLIST_FOREACH(e->callbacks->callbacks, fn)
469 {
470 if ((fn->func == func) && (fn->type == type) && (fn->data == data) && (!fn->delete_me))
471 {
472 void *tmp;
473
474 tmp = fn->data;
475 fn->delete_me = 1;
476 e->callbacks->deletions_waiting = 1;
477 if (!e->callbacks->walking_list)
478 evas_event_callback_clear(e);
479 return tmp;
480 }
481 }
482 return NULL;
483}
484
485EAPI void
486evas_post_event_callback_push(Evas *e, Evas_Object_Event_Post_Cb func, const void *data)
487{
488 Evas_Post_Callback *pc;
489
490 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
491 return;
492 MAGIC_CHECK_END();
493
494 EVAS_MEMPOOL_INIT(_mp_pc, "evas_post_callback", Evas_Post_Callback, 64, );
495 pc = EVAS_MEMPOOL_ALLOC(_mp_pc, Evas_Post_Callback);
496 if (!pc) return;
497 EVAS_MEMPOOL_PREP(_mp_pc, pc, Evas_Post_Callback);
498 if (e->delete_me) return;
499
500 pc->func = func;
501 pc->data = data;
502 e->post_events = eina_list_prepend(e->post_events, pc);
503}
504
505EAPI void
506evas_post_event_callback_remove(Evas *e, Evas_Object_Event_Post_Cb func)
507{
508 Evas_Post_Callback *pc;
509 Eina_List *l;
510
511 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
512 return;
513 MAGIC_CHECK_END();
514
515 EINA_LIST_FOREACH(e->post_events, l, pc)
516 {
517 if (pc->func == func)
518 {
519 pc->delete_me = 1;
520 return;
521 }
522 }
523}
524
525EAPI void
526evas_post_event_callback_remove_full(Evas *e, Evas_Object_Event_Post_Cb func, const void *data)
527{
528 Evas_Post_Callback *pc;
529 Eina_List *l;
530
531 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
532 return;
533 MAGIC_CHECK_END();
534
535 EINA_LIST_FOREACH(e->post_events, l, pc)
536 {
537 if ((pc->func == func) && (pc->data == data))
538 {
539 pc->delete_me = 1;
540 return;
541 }
542 }
543}