1.1 --- a/src/events/SDL_events.c Fri Jun 30 05:50:35 2006 +0000
1.2 +++ b/src/events/SDL_events.c Fri Jun 30 08:18:44 2006 +0000
1.3 @@ -34,6 +34,7 @@
1.4
1.5 /* Public data -- the event filter */
1.6 SDL_EventFilter SDL_EventOK = NULL;
1.7 +void *SDL_EventOKParam;
1.8 Uint8 SDL_ProcessEvents[SDL_NUMEVENTS];
1.9 static Uint32 SDL_eventstate = 0;
1.10
1.11 @@ -434,19 +435,41 @@
1.12 }
1.13
1.14 void
1.15 -SDL_SetEventFilter(SDL_EventFilter filter)
1.16 +SDL_SetEventFilter(SDL_EventFilter filter, void *userdata)
1.17 {
1.18 SDL_Event bitbucket;
1.19
1.20 /* Set filter and discard pending events */
1.21 SDL_EventOK = filter;
1.22 + SDL_EventOKParam = userdata;
1.23 while (SDL_PollEvent(&bitbucket) > 0);
1.24 }
1.25
1.26 SDL_EventFilter
1.27 -SDL_GetEventFilter(void)
1.28 +SDL_GetEventFilter(void **userdata)
1.29 +{
1.30 + if (userdata) {
1.31 + *userdata = SDL_EventOKParam;
1.32 + }
1.33 + return (SDL_EventOK);
1.34 +}
1.35 +
1.36 +void
1.37 +SDL_FilterEvents(SDL_EventFilter filter, void *userdata)
1.38 {
1.39 - return (SDL_EventOK);
1.40 + if (SDL_mutexP(SDL_EventQ.lock) == 0) {
1.41 + int spot;
1.42 +
1.43 + spot = SDL_EventQ.head;
1.44 + while (spot != SDL_EventQ.tail) {
1.45 + if (filter(userdata, &SDL_EventQ.event[spot])) {
1.46 + spot = (spot + 1) % MAXEVENTS;
1.47 + } else {
1.48 + spot = SDL_CutEvent(spot);
1.49 + }
1.50 + }
1.51 + }
1.52 + SDL_mutexV(SDL_EventQ.lock);
1.53 }
1.54
1.55 Uint8
1.56 @@ -507,7 +530,8 @@
1.57 SDL_memset(&event, 0, sizeof(event));
1.58 event.type = SDL_SYSWMEVENT;
1.59 event.syswm.msg = message;
1.60 - if ((SDL_EventOK == NULL) || (*SDL_EventOK) (&event)) {
1.61 + if ((SDL_EventOK == NULL)
1.62 + || (*SDL_EventOK) (SDL_EventOKParam, &event)) {
1.63 posted = 1;
1.64 SDL_PushEvent(&event);
1.65 }