2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
12 #include "ecore_private.h"
15 struct _Ecore_Idle_Exiter
19 int (*func) (void *data);
22 Eina_Bool delete_me : 1;
26 static Ecore_Idle_Exiter *idle_exiters = NULL;
27 static Ecore_Idle_Exiter *idle_exiter_current = NULL;
28 static int idle_exiters_delete_me = 0;
31 * Add an idle exiter handler.
32 * @param func The function to call when exiting an idle state.
33 * @param data The data to be passed to the @p func call
34 * @return A handle to the idle exiter callback on success. NULL otherwise.
37 EAPI Ecore_Idle_Exiter *
38 ecore_idle_exiter_add(int (*func) (void *data), const void *data)
40 Ecore_Idle_Exiter *ie;
42 if (!func) return NULL;
43 ie = calloc(1, sizeof(Ecore_Idle_Exiter));
45 ECORE_MAGIC_SET(ie, ECORE_MAGIC_IDLE_EXITER);
47 ie->data = (void *)data;
48 idle_exiters = (Ecore_Idle_Exiter *) eina_inlist_append(EINA_INLIST_GET(idle_exiters), EINA_INLIST_GET(ie));
53 * Delete an idle exiter handler from the list to be run on exiting idle state.
54 * @param idle_exiter The idle exiter to delete
55 * @return The data pointer that was being being passed to the handler if
56 * successful. NULL otherwise.
60 ecore_idle_exiter_del(Ecore_Idle_Exiter *idle_exiter)
62 if (!ECORE_MAGIC_CHECK(idle_exiter, ECORE_MAGIC_IDLE_EXITER))
64 ECORE_MAGIC_FAIL(idle_exiter, ECORE_MAGIC_IDLE_EXITER,
65 "ecore_idle_exiter_del");
68 idle_exiter->delete_me = 1;
69 idle_exiters_delete_me = 1;
70 return idle_exiter->data;
74 _ecore_idle_exiter_shutdown(void)
76 Ecore_Idle_Exiter *ie;
77 while ((ie = idle_exiters))
79 idle_exiters = (Ecore_Idle_Exiter *) eina_inlist_remove(EINA_INLIST_GET(idle_exiters), EINA_INLIST_GET(idle_exiters));
80 ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE);
83 idle_exiters_delete_me = 0;
84 idle_exiter_current = NULL;
88 _ecore_idle_exiter_call(void)
90 if (!idle_exiter_current)
92 /* regular main loop, start from head */
93 idle_exiter_current = idle_exiters;
97 /* recursive main loop, continue from where we were */
99 (Ecore_Idle_Exiter *)EINA_INLIST_GET(idle_exiter_current)->next;
102 while (idle_exiter_current)
104 Ecore_Idle_Exiter *ie = (Ecore_Idle_Exiter *)idle_exiter_current;
108 if (!ie->func(ie->data)) ecore_idle_exiter_del(ie);
111 if (idle_exiter_current) /* may have changed in recursive main loops */
112 idle_exiter_current =
113 (Ecore_Idle_Exiter *)EINA_INLIST_GET(idle_exiter_current)->next;
115 if (idle_exiters_delete_me)
117 Ecore_Idle_Exiter *l;
118 int deleted_idler_exiters_in_use = 0;
120 for (l = idle_exiters; l;)
122 Ecore_Idle_Exiter *ie = l;
124 l = (Ecore_Idle_Exiter *) EINA_INLIST_GET(l)->next;
129 deleted_idler_exiters_in_use++;
133 idle_exiters = (Ecore_Idle_Exiter *) eina_inlist_remove(EINA_INLIST_GET(idle_exiters), EINA_INLIST_GET(ie));
134 ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE);
138 if (!deleted_idler_exiters_in_use)
139 idle_exiters_delete_me = 0;
144 _ecore_idle_exiter_exist(void)
146 if (idle_exiters) return 1;