8 #include "ecore_private.h"
11 struct _Ecore_Idle_Exiter
18 Eina_Bool delete_me : 1;
22 static Ecore_Idle_Exiter *idle_exiters = NULL;
23 static Ecore_Idle_Exiter *idle_exiter_current = NULL;
24 static int idle_exiters_delete_me = 0;
27 * @addtogroup Ecore_Group Ecore - Main Loop and Job Functions.
33 * @addtogroup Ecore_Idle_Group Ecore Idle functions
39 * Add an idle exiter handler.
40 * @param func The function to call when exiting an idle state.
41 * @param data The data to be passed to the @p func call
42 * @return A handle to the idle exiter callback on success. NULL otherwise.
44 EAPI Ecore_Idle_Exiter *
45 ecore_idle_exiter_add(Ecore_Task_Cb func, const void *data)
47 Ecore_Idle_Exiter *ie;
49 if (!func) return NULL;
50 ie = calloc(1, sizeof(Ecore_Idle_Exiter));
52 ECORE_MAGIC_SET(ie, ECORE_MAGIC_IDLE_EXITER);
54 ie->data = (void *)data;
55 idle_exiters = (Ecore_Idle_Exiter *) eina_inlist_append(EINA_INLIST_GET(idle_exiters), EINA_INLIST_GET(ie));
60 * Delete an idle exiter handler from the list to be run on exiting idle state.
61 * @param idle_exiter The idle exiter to delete
62 * @return The data pointer that was being being passed to the handler if
63 * successful. NULL otherwise.
66 ecore_idle_exiter_del(Ecore_Idle_Exiter *idle_exiter)
68 if (!ECORE_MAGIC_CHECK(idle_exiter, ECORE_MAGIC_IDLE_EXITER))
70 ECORE_MAGIC_FAIL(idle_exiter, ECORE_MAGIC_IDLE_EXITER,
71 "ecore_idle_exiter_del");
74 EINA_SAFETY_ON_TRUE_RETURN_VAL(idle_exiter->delete_me, NULL);
75 idle_exiter->delete_me = 1;
76 idle_exiters_delete_me = 1;
77 return idle_exiter->data;
89 _ecore_idle_exiter_shutdown(void)
91 Ecore_Idle_Exiter *ie;
92 while ((ie = idle_exiters))
94 idle_exiters = (Ecore_Idle_Exiter *) eina_inlist_remove(EINA_INLIST_GET(idle_exiters), EINA_INLIST_GET(idle_exiters));
95 ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE);
98 idle_exiters_delete_me = 0;
99 idle_exiter_current = NULL;
103 _ecore_idle_exiter_call(void)
105 if (!idle_exiter_current)
107 /* regular main loop, start from head */
108 idle_exiter_current = idle_exiters;
112 /* recursive main loop, continue from where we were */
113 idle_exiter_current =
114 (Ecore_Idle_Exiter *)EINA_INLIST_GET(idle_exiter_current)->next;
117 while (idle_exiter_current)
119 Ecore_Idle_Exiter *ie = (Ecore_Idle_Exiter *)idle_exiter_current;
123 if (!ie->func(ie->data))
125 if (!ie->delete_me) ecore_idle_exiter_del(ie);
129 if (idle_exiter_current) /* may have changed in recursive main loops */
130 idle_exiter_current =
131 (Ecore_Idle_Exiter *)EINA_INLIST_GET(idle_exiter_current)->next;
133 if (idle_exiters_delete_me)
135 Ecore_Idle_Exiter *l;
136 int deleted_idler_exiters_in_use = 0;
138 for (l = idle_exiters; l;)
140 Ecore_Idle_Exiter *ie = l;
142 l = (Ecore_Idle_Exiter *) EINA_INLIST_GET(l)->next;
147 deleted_idler_exiters_in_use++;
151 idle_exiters = (Ecore_Idle_Exiter *) eina_inlist_remove(EINA_INLIST_GET(idle_exiters), EINA_INLIST_GET(ie));
152 ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE);
156 if (!deleted_idler_exiters_in_use)
157 idle_exiters_delete_me = 0;
162 _ecore_idle_exiter_exist(void)
164 if (idle_exiters) return 1;