2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
12 #include "ecore_private.h"
15 struct _Ecore_Idle_Enterer
19 int (*func) (void *data);
22 Eina_Bool delete_me : 1;
26 static Ecore_Idle_Enterer *idle_enterers = NULL;
27 static Ecore_Idle_Enterer *idle_enterer_current = NULL;
28 static int idle_enterers_delete_me = 0;
31 * Add an idle enterer handler.
32 * @param func The function to call when entering an idle state.
33 * @param data The data to be passed to the @p func call
34 * @return A handle to the idle enterer callback if successful. Otherwise,
38 EAPI Ecore_Idle_Enterer *
39 ecore_idle_enterer_add(int (*func) (void *data), const void *data)
41 Ecore_Idle_Enterer *ie;
43 if (!func) return NULL;
44 ie = calloc(1, sizeof(Ecore_Idle_Enterer));
46 ECORE_MAGIC_SET(ie, ECORE_MAGIC_IDLE_ENTERER);
48 ie->data = (void *)data;
49 idle_enterers = (Ecore_Idle_Enterer *) eina_inlist_append(EINA_INLIST_GET(idle_enterers), EINA_INLIST_GET(ie));
54 * Add an idle enterer handler at the start of the list so it gets called earlier than others.
55 * @param func The function to call when entering an idle state.
56 * @param data The data to be passed to the @p func call
57 * @return A handle to the idle enterer callback if successful. Otherwise,
61 EAPI Ecore_Idle_Enterer *
62 ecore_idle_enterer_before_add(int (*func) (void *data), const void *data)
64 Ecore_Idle_Enterer *ie;
66 if (!func) return NULL;
67 ie = calloc(1, sizeof(Ecore_Idle_Enterer));
69 ECORE_MAGIC_SET(ie, ECORE_MAGIC_IDLE_ENTERER);
71 ie->data = (void *)data;
72 idle_enterers = (Ecore_Idle_Enterer *) eina_inlist_prepend(EINA_INLIST_GET(idle_enterers), EINA_INLIST_GET(ie));
77 * Delete an idle enterer callback.
78 * @param idle_enterer The idle enterer to delete
79 * @return The data pointer passed to the idler enterer callback on success.
84 ecore_idle_enterer_del(Ecore_Idle_Enterer *idle_enterer)
86 if (!ECORE_MAGIC_CHECK(idle_enterer, ECORE_MAGIC_IDLE_ENTERER))
88 ECORE_MAGIC_FAIL(idle_enterer, ECORE_MAGIC_IDLE_ENTERER,
89 "ecore_idle_enterer_del");
92 idle_enterer->delete_me = 1;
93 idle_enterers_delete_me = 1;
94 return idle_enterer->data;
98 _ecore_idle_enterer_shutdown(void)
100 Ecore_Idle_Enterer *ie;
101 while ((ie = idle_enterers))
103 idle_enterers = (Ecore_Idle_Enterer *) eina_inlist_remove(EINA_INLIST_GET(idle_enterers), EINA_INLIST_GET(idle_enterers));
104 ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE);
107 idle_enterers_delete_me = 0;
108 idle_enterer_current = NULL;
112 _ecore_idle_enterer_call(void)
114 if (!idle_enterer_current)
116 /* regular main loop, start from head */
117 idle_enterer_current = idle_enterers;
121 /* recursive main loop, continue from where we were */
122 idle_enterer_current =
123 (Ecore_Idle_Enterer *)EINA_INLIST_GET(idle_enterer_current)->next;
126 while (idle_enterer_current)
128 Ecore_Idle_Enterer *ie = (Ecore_Idle_Enterer *)idle_enterer_current;
132 if (!ie->func(ie->data)) ecore_idle_enterer_del(ie);
135 if (idle_enterer_current) /* may have changed in recursive main loops */
136 idle_enterer_current =
137 (Ecore_Idle_Enterer *)EINA_INLIST_GET(idle_enterer_current)->next;
139 if (idle_enterers_delete_me)
141 Ecore_Idle_Enterer *l;
142 int deleted_idler_enterers_in_use = 0;
144 for (l = idle_enterers; l;)
146 Ecore_Idle_Enterer *ie = l;
147 l = (Ecore_Idle_Enterer *) EINA_INLIST_GET(l)->next;
152 deleted_idler_enterers_in_use++;
156 idle_enterers = (Ecore_Idle_Enterer *) eina_inlist_remove(EINA_INLIST_GET(idle_enterers), EINA_INLIST_GET(ie));
157 ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE);
161 if (!deleted_idler_enterers_in_use)
162 idle_enterers_delete_me = 0;
167 _ecore_idle_enterer_exist(void)
169 if (idle_enterers) return 1;