Added functions to watch events as they go through the event queue.
This commit is contained in:
parent
b231d0b93d
commit
52cf8a6451
2 changed files with 70 additions and 0 deletions
|
@ -580,6 +580,18 @@ extern DECLSPEC void SDLCALL SDL_SetEventFilter(SDL_EventFilter filter,
|
|||
extern DECLSPEC SDL_bool SDLCALL SDL_GetEventFilter(SDL_EventFilter * filter,
|
||||
void **userdata);
|
||||
|
||||
/**
|
||||
* Add a function which is called when an event is added to the queue.
|
||||
*/
|
||||
extern DECLSPEC void SDLCALL SDL_AddEventWatch(SDL_EventFilter filter,
|
||||
void *userdata);
|
||||
|
||||
/**
|
||||
* Remove an event watch function added with SDL_AddEventWatch()
|
||||
*/
|
||||
extern DECLSPEC void SDLCALL SDL_DelEventWatch(SDL_EventFilter filter,
|
||||
void *userdata);
|
||||
|
||||
/**
|
||||
* Run the filter function on the current event queue, removing any
|
||||
* events for which the filter returns 0.
|
||||
|
|
|
@ -38,6 +38,14 @@
|
|||
SDL_EventFilter SDL_EventOK = NULL;
|
||||
void *SDL_EventOKParam;
|
||||
|
||||
typedef struct SDL_EventWatcher {
|
||||
SDL_EventFilter callback;
|
||||
void *userdata;
|
||||
struct SDL_EventWatcher *next;
|
||||
} SDL_EventWatcher;
|
||||
|
||||
static SDL_EventWatcher *SDL_event_watchers = NULL;
|
||||
|
||||
typedef struct {
|
||||
Uint32 bits[8];
|
||||
} SDL_DisabledEventBlock;
|
||||
|
@ -96,6 +104,12 @@ SDL_StopEventLoop(void)
|
|||
SDL_disabled_events[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
while (SDL_event_watchers) {
|
||||
SDL_EventWatcher *tmp = SDL_event_watchers;
|
||||
SDL_event_watchers = tmp->next;
|
||||
SDL_free(tmp);
|
||||
}
|
||||
}
|
||||
|
||||
/* This function (and associated calls) may be called more than once */
|
||||
|
@ -340,9 +354,16 @@ SDL_WaitEventTimeout(SDL_Event * event, int timeout)
|
|||
int
|
||||
SDL_PushEvent(SDL_Event * event)
|
||||
{
|
||||
SDL_EventWatcher *curr;
|
||||
|
||||
if (SDL_EventOK && !SDL_EventOK(SDL_EventOKParam, event)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (curr = SDL_event_watchers; curr; curr = curr->next) {
|
||||
curr->callback(curr->userdata, event);
|
||||
}
|
||||
|
||||
if (SDL_PeepEvents(event, 1, SDL_ADDEVENT, 0, 0) <= 0) {
|
||||
return -1;
|
||||
}
|
||||
|
@ -376,6 +397,43 @@ SDL_GetEventFilter(SDL_EventFilter * filter, void **userdata)
|
|||
return SDL_EventOK ? SDL_TRUE : SDL_FALSE;
|
||||
}
|
||||
|
||||
/* FIXME: This is not thread-safe yet */
|
||||
void
|
||||
SDL_AddEventWatch(SDL_EventFilter filter, void *userdata)
|
||||
{
|
||||
SDL_EventWatcher *watcher;
|
||||
|
||||
watcher = (SDL_EventWatcher *)SDL_malloc(sizeof(*watcher));
|
||||
if (!watcher) {
|
||||
/* Uh oh... */
|
||||
return;
|
||||
}
|
||||
watcher->callback = filter;
|
||||
watcher->userdata = userdata;
|
||||
watcher->next = SDL_event_watchers;
|
||||
SDL_event_watchers = watcher;
|
||||
}
|
||||
|
||||
/* FIXME: This is not thread-safe yet */
|
||||
void
|
||||
SDL_DelEventWatch(SDL_EventFilter filter, void *userdata)
|
||||
{
|
||||
SDL_EventWatcher *prev = NULL;
|
||||
SDL_EventWatcher *curr;
|
||||
|
||||
for (curr = SDL_event_watchers; curr; prev = curr, curr = curr->next) {
|
||||
if (curr->callback == filter && curr->userdata == userdata) {
|
||||
if (prev) {
|
||||
prev->next = curr->next;
|
||||
} else {
|
||||
SDL_event_watchers = curr->next;
|
||||
}
|
||||
SDL_free(curr);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
SDL_FilterEvents(SDL_EventFilter filter, void *userdata)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue