forked from enlightenment/efl
ooh someone somewhere made the main event loop not work quite right.
fix if event purge happens to generate events. SVN revision: 49203
This commit is contained in:
parent
285d1558ae
commit
17873647fc
|
@ -11,6 +11,7 @@
|
|||
#include "Ecore.h"
|
||||
#include "ecore_private.h"
|
||||
|
||||
static int inpurge = 0;
|
||||
|
||||
struct _Ecore_Event_Handler
|
||||
{
|
||||
|
@ -52,6 +53,7 @@ struct _Ecore_Event
|
|||
static int events_num = 0;
|
||||
static Ecore_Event *events = NULL;
|
||||
static Ecore_Event *event_current = NULL;
|
||||
static Ecore_Event *purge_events = NULL;
|
||||
|
||||
static Ecore_Event_Handler **event_handlers = NULL;
|
||||
static Ecore_Event_Handler *event_handler_current = NULL;
|
||||
|
@ -384,8 +386,16 @@ _ecore_event_add(int type, void *ev, void (*func_free) (void *data, void *ev), v
|
|||
e->event = ev;
|
||||
e->func_free = func_free;
|
||||
e->data = data;
|
||||
if (inpurge > 0)
|
||||
{
|
||||
purge_events = (Ecore_Event *)eina_inlist_append(EINA_INLIST_GET(purge_events), EINA_INLIST_GET(e));
|
||||
events_num++;
|
||||
}
|
||||
else
|
||||
{
|
||||
events = (Ecore_Event *)eina_inlist_append(EINA_INLIST_GET(events), EINA_INLIST_GET(e));
|
||||
events_num++;
|
||||
}
|
||||
return e;
|
||||
}
|
||||
|
||||
|
@ -408,6 +418,7 @@ _ecore_event_purge_deleted(void)
|
|||
{
|
||||
Ecore_Event *itr = events;
|
||||
|
||||
inpurge++;
|
||||
while (itr)
|
||||
{
|
||||
Ecore_Event *next = (Ecore_Event *)EINA_INLIST_GET(itr)->next;
|
||||
|
@ -415,6 +426,13 @@ _ecore_event_purge_deleted(void)
|
|||
_ecore_event_del(itr);
|
||||
itr = next;
|
||||
}
|
||||
inpurge--;
|
||||
while (purge_events)
|
||||
{
|
||||
Ecore_Event *e = purge_events;
|
||||
purge_events = (Ecore_Event *)eina_inlist_remove(EINA_INLIST_GET(purge_events), EINA_INLIST_GET(purge_events));
|
||||
events = eina_inlist_append(EINA_INLIST_GET(events), EINA_INLIST_GET(e));
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -504,8 +522,6 @@ _ecore_event_call(void)
|
|||
event_filters_delete_me = 0;
|
||||
}
|
||||
|
||||
// printf("EVENT BATCH...\n");
|
||||
|
||||
if (!event_current)
|
||||
{
|
||||
/* regular main loop, start from head */
|
||||
|
@ -575,6 +591,7 @@ _ecore_event_call(void)
|
|||
ecore_raw_event_event = NULL;
|
||||
|
||||
_ecore_event_purge_deleted();
|
||||
|
||||
EINA_LIST_FOREACH_SAFE(event_handlers_delete_list, l, l_next, eh)
|
||||
{
|
||||
if (eh->references) continue;
|
||||
|
|
Loading…
Reference in New Issue