8 #include "ecore_private.h"
10 static int inpurge = 0;
12 struct _Ecore_Event_Handler
17 Ecore_Event_Handler_Cb func;
20 Eina_Bool delete_me : 1;
22 GENERIC_ALLOC_SIZE_DECLARE(Ecore_Event_Handler);
24 struct _Ecore_Event_Filter
28 Ecore_Data_Cb func_start;
29 Ecore_Filter_Cb func_filter;
30 Ecore_End_Cb func_end;
34 Eina_Bool delete_me : 1;
36 GENERIC_ALLOC_SIZE_DECLARE(Ecore_Event_Filter);
44 Ecore_End_Cb func_free;
47 Eina_Bool delete_me : 1;
49 GENERIC_ALLOC_SIZE_DECLARE(Ecore_Event);
51 static int events_num = 0;
52 static Ecore_Event *events = NULL;
53 static Ecore_Event *event_current = NULL;
54 static Ecore_Event *purge_events = NULL;
56 static Ecore_Event_Handler **event_handlers = NULL;
57 static Ecore_Event_Handler *event_handler_current = NULL;
58 static int event_handlers_num = 0;
59 static int event_handlers_alloc_num = 0;
60 static Eina_List *event_handlers_delete_list = NULL;
62 static Ecore_Event_Handler *event_handlers_add_list = NULL;
64 static Ecore_Event_Filter *event_filters = NULL;
65 static Ecore_Event_Filter *event_filter_current = NULL;
66 static Ecore_Event *event_filter_event_current = NULL;
67 static int event_filters_delete_me = 0;
68 static int event_id_max = ECORE_EVENT_COUNT;
69 static int ecore_raw_event_type = ECORE_EVENT_NONE;
70 static void *ecore_raw_event_event = NULL;
72 static void _ecore_event_purge_deleted(void);
73 static void *_ecore_event_del(Ecore_Event *event);
75 EAPI Ecore_Event_Handler *
76 ecore_event_handler_add(int type,
77 Ecore_Event_Handler_Cb func,
80 Ecore_Event_Handler *eh = NULL;
82 EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
85 if (!func) goto unlock;
86 if ((type <= ECORE_EVENT_NONE) || (type >= event_id_max)) goto unlock;
87 eh = ecore_event_handler_calloc(1);
89 ECORE_MAGIC_SET(eh, ECORE_MAGIC_EVENT_HANDLER);
92 eh->data = (void *)data;
93 if (type >= (event_handlers_num - 1))
97 p_alloc_num = event_handlers_alloc_num;
98 event_handlers_num = type + 1;
99 if (event_handlers_num > event_handlers_alloc_num)
101 Ecore_Event_Handler **new_handlers;
104 event_handlers_alloc_num = ((event_handlers_num + 16) / 16) * 16;
105 new_handlers = realloc(event_handlers, event_handlers_alloc_num * sizeof(Ecore_Event_Handler *));
108 ecore_event_handler_mp_free(eh);
111 event_handlers = new_handlers;
112 for (i = p_alloc_num; i < event_handlers_alloc_num; i++)
113 event_handlers[i] = NULL;
116 if (ecore_raw_event_type == type)
117 event_handlers_add_list = (Ecore_Event_Handler *)eina_inlist_append(EINA_INLIST_GET(event_handlers_add_list), EINA_INLIST_GET(eh));
118 else if (type < event_handlers_alloc_num)
119 event_handlers[type] = (Ecore_Event_Handler *)eina_inlist_append(EINA_INLIST_GET(event_handlers[type]), EINA_INLIST_GET(eh));
127 ecore_event_handler_del(Ecore_Event_Handler *event_handler)
131 EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
133 if (!ECORE_MAGIC_CHECK(event_handler, ECORE_MAGIC_EVENT_HANDLER))
135 ECORE_MAGIC_FAIL(event_handler, ECORE_MAGIC_EVENT_HANDLER,
136 "ecore_event_handler_del");
139 data = _ecore_event_handler_del(event_handler);
147 ecore_event_handler_data_get(Ecore_Event_Handler *eh)
151 EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
153 if (!ECORE_MAGIC_CHECK(eh, ECORE_MAGIC_EVENT_HANDLER))
155 ECORE_MAGIC_FAIL(eh, ECORE_MAGIC_EVENT_HANDLER, "ecore_event_handler_data_get");
165 ecore_event_handler_data_set(Ecore_Event_Handler *eh,
170 EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
172 if (!ECORE_MAGIC_CHECK(eh, ECORE_MAGIC_EVENT_HANDLER))
174 ECORE_MAGIC_FAIL(eh, ECORE_MAGIC_EVENT_HANDLER, "ecore_event_handler_data_set");
178 eh->data = (void *)data;
186 _ecore_event_generic_free(void *data __UNUSED__,
188 { /* DO NOT MEMPOOL FREE THIS */
193 ecore_event_add(int type,
195 Ecore_End_Cb func_free,
198 Ecore_Event *event = NULL;
200 EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
203 /* if (!ev) goto unlock; */
204 if (type <= ECORE_EVENT_NONE) goto unlock;
205 if (type >= event_id_max) goto unlock;
206 if ((ev) && (!func_free)) func_free = _ecore_event_generic_free;
207 event = _ecore_event_add(type, ev, func_free, data);
214 ecore_event_del(Ecore_Event *event)
218 EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
220 if (!ECORE_MAGIC_CHECK(event, ECORE_MAGIC_EVENT))
222 ECORE_MAGIC_FAIL(event, ECORE_MAGIC_EVENT, "ecore_event_del");
225 EINA_SAFETY_ON_TRUE_GOTO(event->delete_me, unlock);
226 event->delete_me = 1;
234 ecore_event_type_new(void)
238 EINA_MAIN_LOOP_CHECK_RETURN_VAL(0);
246 EAPI Ecore_Event_Filter *
247 ecore_event_filter_add(Ecore_Data_Cb func_start,
248 Ecore_Filter_Cb func_filter,
249 Ecore_End_Cb func_end,
252 Ecore_Event_Filter *ef = NULL;
254 EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
256 if (!func_filter) goto unlock;
257 ef = ecore_event_filter_calloc(1);
258 if (!ef) goto unlock;
259 ECORE_MAGIC_SET(ef, ECORE_MAGIC_EVENT_FILTER);
260 ef->func_start = func_start;
261 ef->func_filter = func_filter;
262 ef->func_end = func_end;
263 ef->data = (void *)data;
264 event_filters = (Ecore_Event_Filter *)eina_inlist_append(EINA_INLIST_GET(event_filters), EINA_INLIST_GET(ef));
271 ecore_event_filter_del(Ecore_Event_Filter *ef)
275 EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
277 if (!ECORE_MAGIC_CHECK(ef, ECORE_MAGIC_EVENT_FILTER))
279 ECORE_MAGIC_FAIL(ef, ECORE_MAGIC_EVENT_FILTER, "ecore_event_filter_del");
282 EINA_SAFETY_ON_TRUE_GOTO(ef->delete_me, unlock);
284 event_filters_delete_me = 1;
293 ecore_event_current_type_get(void)
295 EINA_MAIN_LOOP_CHECK_RETURN_VAL(0);
296 return ecore_raw_event_type;
300 ecore_event_current_event_get(void)
302 EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
303 return ecore_raw_event_event;
307 _ecore_event_handler_del(Ecore_Event_Handler *event_handler)
309 EINA_SAFETY_ON_TRUE_RETURN_VAL(event_handler->delete_me, NULL);
310 event_handler->delete_me = 1;
311 event_handlers_delete_list = eina_list_append(event_handlers_delete_list, event_handler);
312 return event_handler->data;
316 _ecore_event_shutdown(void)
319 Ecore_Event_Handler *eh;
320 Ecore_Event_Filter *ef;
322 while (events) _ecore_event_del(events);
323 event_current = NULL;
324 for (i = 0; i < event_handlers_num; i++)
326 while ((eh = event_handlers[i]))
328 event_handlers[i] = (Ecore_Event_Handler *)eina_inlist_remove(EINA_INLIST_GET(event_handlers[i]), EINA_INLIST_GET(event_handlers[i]));
329 ECORE_MAGIC_SET(eh, ECORE_MAGIC_NONE);
330 if (!eh->delete_me) ecore_event_handler_mp_free(eh);
333 EINA_LIST_FREE(event_handlers_delete_list, eh)
334 ecore_event_handler_mp_free(eh);
335 if (event_handlers) free(event_handlers);
336 event_handlers = NULL;
337 event_handlers_num = 0;
338 event_handlers_alloc_num = 0;
339 while ((ef = event_filters))
341 event_filters = (Ecore_Event_Filter *)eina_inlist_remove(EINA_INLIST_GET(event_filters), EINA_INLIST_GET(event_filters));
342 ECORE_MAGIC_SET(ef, ECORE_MAGIC_NONE);
343 ecore_event_filter_mp_free(ef);
345 event_filters_delete_me = 0;
346 event_filter_current = NULL;
347 event_filter_event_current = NULL;
351 _ecore_event_exist(void)
354 EINA_INLIST_FOREACH(events, e)
355 if (!e->delete_me) return 1;
360 _ecore_event_add(int type,
362 Ecore_End_Cb func_free,
367 e = ecore_event_calloc(1);
369 ECORE_MAGIC_SET(e, ECORE_MAGIC_EVENT);
372 e->func_free = func_free;
376 purge_events = (Ecore_Event *)eina_inlist_append(EINA_INLIST_GET(purge_events), EINA_INLIST_GET(e));
381 events = (Ecore_Event *)eina_inlist_append(EINA_INLIST_GET(events), EINA_INLIST_GET(e));
388 _ecore_event_del(Ecore_Event *event)
393 if (event->func_free) _ecore_call_end_cb(event->func_free, event->data, event->event);
394 events = (Ecore_Event *)eina_inlist_remove(EINA_INLIST_GET(events), EINA_INLIST_GET(event));
395 ECORE_MAGIC_SET(event, ECORE_MAGIC_NONE);
396 ecore_event_mp_free(event);
402 _ecore_event_purge_deleted(void)
404 Ecore_Event *itr = events;
409 Ecore_Event *next = (Ecore_Event *)EINA_INLIST_GET(itr)->next;
410 if ((!itr->references) && (itr->delete_me))
411 _ecore_event_del(itr);
417 Ecore_Event *e = purge_events;
418 purge_events = (Ecore_Event *)eina_inlist_remove(EINA_INLIST_GET(purge_events), EINA_INLIST_GET(purge_events));
419 events = (Ecore_Event *)eina_inlist_append(EINA_INLIST_GET(events), EINA_INLIST_GET(e));
424 _ecore_event_filters_apply()
426 if (!event_filter_current)
428 /* regular main loop, start from head */
429 event_filter_current = event_filters;
433 /* recursive main loop, continue from where we were */
434 event_filter_current = (Ecore_Event_Filter *)EINA_INLIST_GET(event_filter_current)->next;
437 while (event_filter_current)
439 Ecore_Event_Filter *ef = event_filter_current;
446 ef->loop_data = _ecore_call_data_cb(ef->func_start, ef->data);
448 if (!event_filter_event_current)
450 /* regular main loop, start from head */
451 event_filter_event_current = events;
455 /* recursive main loop, continue from where we were */
456 event_filter_event_current = (Ecore_Event *)EINA_INLIST_GET(event_filter_event_current)->next;
459 while (event_filter_event_current)
461 Ecore_Event *e = event_filter_event_current;
463 if (!_ecore_call_filter_cb(ef->func_filter, ef->data,
464 ef->loop_data, e->type, e->event))
469 if (event_filter_event_current) /* may have changed in recursive main loops */
470 event_filter_event_current = (Ecore_Event *)EINA_INLIST_GET(event_filter_event_current)->next;
473 _ecore_call_end_cb(ef->func_end, ef->data, ef->loop_data);
478 if (event_filter_current) /* may have changed in recursive main loops */
479 event_filter_current = (Ecore_Event_Filter *)EINA_INLIST_GET(event_filter_current)->next;
481 if (event_filters_delete_me)
483 int deleted_in_use = 0;
484 Ecore_Event_Filter *l;
485 for (l = event_filters; l; )
487 Ecore_Event_Filter *ef = l;
488 l = (Ecore_Event_Filter *)EINA_INLIST_GET(l)->next;
497 event_filters = (Ecore_Event_Filter *)eina_inlist_remove(EINA_INLIST_GET(event_filters), EINA_INLIST_GET(ef));
498 ECORE_MAGIC_SET(ef, ECORE_MAGIC_NONE);
499 ecore_event_filter_mp_free(ef);
503 event_filters_delete_me = 0;
508 _ecore_event_call(void)
510 Eina_List *l, *l_next;
511 Ecore_Event_Handler *eh;
513 _ecore_event_filters_apply();
517 /* regular main loop, start from head */
518 event_current = events;
519 event_handler_current = NULL;
522 while (event_current)
524 Ecore_Event *e = event_current;
525 int handle_count = 0;
529 event_current = (Ecore_Event *)EINA_INLIST_GET(event_current)->next;
533 ecore_raw_event_type = e->type;
534 ecore_raw_event_event = e->event;
536 if ((e->type >= 0) && (e->type < event_handlers_num))
538 if (!event_handler_current)
540 /* regular main loop, start from head */
541 event_handler_current = event_handlers[e->type];
545 /* recursive main loop, continue from where we were */
546 event_handler_current = (Ecore_Event_Handler *)EINA_INLIST_GET(event_handler_current)->next;
549 while ((event_handler_current) && (!e->delete_me))
551 eh = event_handler_current;
559 ret = _ecore_call_handler_cb(eh->func, eh->data, e->type, e->event);
564 event_handler_current = NULL;
565 break; /* 0 == "call no further handlers" */
569 if (event_handler_current) /* may have changed in recursive main loops */
570 event_handler_current = (Ecore_Event_Handler *)EINA_INLIST_GET(event_handler_current)->next;
573 while (event_handlers_add_list)
575 eh = event_handlers_add_list;
576 event_handlers_add_list = (Ecore_Event_Handler *)eina_inlist_remove(EINA_INLIST_GET(event_handlers_add_list), EINA_INLIST_GET(eh));
577 event_handlers[eh->type] = (Ecore_Event_Handler *)eina_inlist_append(EINA_INLIST_GET(event_handlers[eh->type]), EINA_INLIST_GET(eh));
579 /* if no handlers were set for EXIT signal - then default is */
580 /* to quit the main loop */
581 if ((e->type == ECORE_EVENT_SIGNAL_EXIT) && (handle_count == 0))
582 ecore_main_loop_quit();
586 if (event_current) /* may have changed in recursive main loops */
587 event_current = (Ecore_Event *)EINA_INLIST_GET(event_current)->next;
590 ecore_raw_event_type = ECORE_EVENT_NONE;
591 ecore_raw_event_event = NULL;
593 _ecore_event_purge_deleted();
595 EINA_LIST_FOREACH_SAFE(event_handlers_delete_list, l, l_next, eh)
597 if (eh->references) continue;
599 event_handlers_delete_list = eina_list_remove_list(event_handlers_delete_list, l);
601 event_handlers[eh->type] = (Ecore_Event_Handler *)eina_inlist_remove(EINA_INLIST_GET(event_handlers[eh->type]), EINA_INLIST_GET(eh));
602 ECORE_MAGIC_SET(eh, ECORE_MAGIC_NONE);
603 ecore_event_handler_mp_free(eh);
608 _ecore_event_signal_user_new(void)
610 Ecore_Event_Signal_User *e;
612 e = calloc(1, sizeof(Ecore_Event_Signal_User));
617 _ecore_event_signal_hup_new(void)
619 Ecore_Event_Signal_Hup *e;
621 e = calloc(1, sizeof(Ecore_Event_Signal_Hup));
626 _ecore_event_signal_exit_new(void)
628 Ecore_Event_Signal_Exit *e;
630 e = calloc(1, sizeof(Ecore_Event_Signal_Exit));
635 _ecore_event_signal_power_new(void)
637 Ecore_Event_Signal_Power *e;
639 e = calloc(1, sizeof(Ecore_Event_Signal_Power));
644 _ecore_event_signal_realtime_new(void)
646 return calloc(1, sizeof(Ecore_Event_Signal_Realtime));