2004-03-16 21:44:17 -08:00
|
|
|
#include "ecore_private.h"
|
|
|
|
#include "Ecore.h"
|
|
|
|
|
|
|
|
static Ecore_Idle_Exiter *idle_exiters = NULL;
|
2006-06-22 23:40:26 -07:00
|
|
|
static int idle_exiters_delete_me = 0;
|
2004-03-16 21:44:17 -08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Add an idle exiter handler.
|
|
|
|
* @param func The function to call when exiting an idle state.
|
|
|
|
* @param data The data to be passed to the @p func call
|
2004-05-07 21:44:04 -07:00
|
|
|
* @return A handle to the idle exiter callback on success. NULL otherwise.
|
|
|
|
* @ingroup Idle_Group
|
2004-03-16 21:44:17 -08:00
|
|
|
*/
|
2006-01-06 09:58:12 -08:00
|
|
|
EAPI Ecore_Idle_Exiter *
|
2004-03-16 21:44:17 -08:00
|
|
|
ecore_idle_exiter_add(int (*func) (void *data), const void *data)
|
|
|
|
{
|
|
|
|
Ecore_Idle_Exiter *ie;
|
|
|
|
|
|
|
|
if (!func) return NULL;
|
|
|
|
ie = calloc(1, sizeof(Ecore_Idle_Exiter));
|
|
|
|
if (!ie) return NULL;
|
|
|
|
ECORE_MAGIC_SET(ie, ECORE_MAGIC_IDLE_EXITER);
|
|
|
|
ie->func = func;
|
|
|
|
ie->data = (void *)data;
|
2005-08-30 03:05:27 -07:00
|
|
|
idle_exiters = _ecore_list2_append(idle_exiters, ie);
|
2004-03-16 21:44:17 -08:00
|
|
|
return ie;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2004-05-07 21:44:04 -07:00
|
|
|
* Delete an idle exiter handler from the list to be run on exiting idle state.
|
2004-03-16 21:44:17 -08:00
|
|
|
* @param idle_exiter The idle exiter to delete
|
2004-05-07 21:44:04 -07:00
|
|
|
* @return The data pointer that was being being passed to the handler if
|
|
|
|
* successful. NULL otherwise.
|
|
|
|
* @ingroup Idle_Group
|
2004-03-16 21:44:17 -08:00
|
|
|
*/
|
2006-01-06 09:58:12 -08:00
|
|
|
EAPI void *
|
2004-03-16 21:44:17 -08:00
|
|
|
ecore_idle_exiter_del(Ecore_Idle_Exiter *idle_exiter)
|
|
|
|
{
|
|
|
|
if (!ECORE_MAGIC_CHECK(idle_exiter, ECORE_MAGIC_IDLE_EXITER))
|
|
|
|
{
|
|
|
|
ECORE_MAGIC_FAIL(idle_exiter, ECORE_MAGIC_IDLE_EXITER,
|
|
|
|
"ecore_idle_exiter_del");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
idle_exiter->delete_me = 1;
|
|
|
|
idle_exiters_delete_me = 1;
|
|
|
|
return idle_exiter->data;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
_ecore_idle_exiter_shutdown(void)
|
|
|
|
{
|
|
|
|
while (idle_exiters)
|
|
|
|
{
|
|
|
|
Ecore_Idle_Exiter *ie;
|
2008-11-29 03:23:17 -08:00
|
|
|
|
2004-03-16 21:44:17 -08:00
|
|
|
ie = idle_exiters;
|
2005-08-30 03:05:27 -07:00
|
|
|
idle_exiters = _ecore_list2_remove(idle_exiters, ie);
|
2004-03-16 21:44:17 -08:00
|
|
|
ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE);
|
|
|
|
free(ie);
|
|
|
|
}
|
|
|
|
idle_exiters_delete_me = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
_ecore_idle_exiter_call(void)
|
|
|
|
{
|
2005-08-30 03:05:27 -07:00
|
|
|
Ecore_List2 *l;
|
2008-11-29 03:23:17 -08:00
|
|
|
|
2005-08-30 03:05:27 -07:00
|
|
|
for (l = (Ecore_List2 *)idle_exiters; l; l = l->next)
|
2004-03-16 21:44:17 -08:00
|
|
|
{
|
|
|
|
Ecore_Idle_Exiter *ie;
|
2008-11-29 03:23:17 -08:00
|
|
|
|
2004-03-16 21:44:17 -08:00
|
|
|
ie = (Ecore_Idle_Exiter *)l;
|
|
|
|
if (!ie->delete_me)
|
|
|
|
{
|
|
|
|
if (!ie->func(ie->data)) ecore_idle_exiter_del(ie);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (idle_exiters_delete_me)
|
|
|
|
{
|
2005-08-30 03:05:27 -07:00
|
|
|
for (l = (Ecore_List2 *)idle_exiters; l;)
|
2004-03-16 21:44:17 -08:00
|
|
|
{
|
|
|
|
Ecore_Idle_Exiter *ie;
|
2008-11-29 03:23:17 -08:00
|
|
|
|
2004-03-16 21:44:17 -08:00
|
|
|
ie = (Ecore_Idle_Exiter *)l;
|
|
|
|
l = l->next;
|
|
|
|
if (ie->delete_me)
|
|
|
|
{
|
2005-08-30 03:05:27 -07:00
|
|
|
idle_exiters = _ecore_list2_remove(idle_exiters, ie);
|
2004-03-16 21:44:17 -08:00
|
|
|
ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE);
|
|
|
|
free(ie);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
idle_exiters_delete_me = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
_ecore_idle_exiter_exist(void)
|
|
|
|
{
|
|
|
|
if (idle_exiters) return 1;
|
|
|
|
return 0;
|
|
|
|
}
|