diff src/events/SDL_events.c @ 1895:c121d94672cb

SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
author Sam Lantinga <slouken@libsdl.org>
date Mon, 10 Jul 2006 21:04:37 +0000
parents 290b5baf2fca
children 542c78b6fb12
line wrap: on
line diff
--- a/src/events/SDL_events.c	Thu Jul 06 18:01:37 2006 +0000
+++ b/src/events/SDL_events.c	Mon Jul 10 21:04:37 2006 +0000
@@ -34,46 +34,51 @@
 
 /* Public data -- the event filter */
 SDL_EventFilter SDL_EventOK = NULL;
+void *SDL_EventOKParam;
 Uint8 SDL_ProcessEvents[SDL_NUMEVENTS];
 static Uint32 SDL_eventstate = 0;
 
 /* Private data -- event queue */
 #define MAXEVENTS	128
-static struct {
-	SDL_mutex *lock;
-	int active;
-	int head;
-	int tail;
-	SDL_Event event[MAXEVENTS];
-	int wmmsg_next;
-	struct SDL_SysWMmsg wmmsg[MAXEVENTS];
+static struct
+{
+    SDL_mutex *lock;
+    int active;
+    int head;
+    int tail;
+    SDL_Event event[MAXEVENTS];
+    int wmmsg_next;
+    struct SDL_SysWMmsg wmmsg[MAXEVENTS];
 } SDL_EventQ;
 
 /* Private data -- event locking structure */
-static struct {
-	SDL_mutex *lock;
-	int safe;
+static struct
+{
+    SDL_mutex *lock;
+    int safe;
 } SDL_EventLock;
 
 /* Thread functions */
-static SDL_Thread *SDL_EventThread = NULL;	/* Thread handle */
-static Uint32 event_thread;			/* The event thread id */
+static SDL_Thread *SDL_EventThread = NULL;      /* Thread handle */
+static Uint32 event_thread;     /* The event thread id */
 
-void SDL_Lock_EventThread(void)
+void
+SDL_Lock_EventThread(void)
 {
-	if ( SDL_EventThread && (SDL_ThreadID() != event_thread) ) {
-		/* Grab lock and spin until we're sure event thread stopped */
-		SDL_mutexP(SDL_EventLock.lock);
-		while ( ! SDL_EventLock.safe ) {
-			SDL_Delay(1);
-		}
-	}
+    if (SDL_EventThread && (SDL_ThreadID() != event_thread)) {
+        /* Grab lock and spin until we're sure event thread stopped */
+        SDL_mutexP(SDL_EventLock.lock);
+        while (!SDL_EventLock.safe) {
+            SDL_Delay(1);
+        }
+    }
 }
-void SDL_Unlock_EventThread(void)
+void
+SDL_Unlock_EventThread(void)
 {
-	if ( SDL_EventThread && (SDL_ThreadID() != event_thread) ) {
-		SDL_mutexV(SDL_EventLock.lock);
-	}
+    if (SDL_EventThread && (SDL_ThreadID() != event_thread)) {
+        SDL_mutexV(SDL_EventLock.lock);
+    }
 }
 
 #ifdef __OS2__
@@ -87,414 +92,461 @@
 #include <time.h>
 #endif
 
-static int SDLCALL SDL_GobbleEvents(void *unused)
+static int SDLCALL
+SDL_GobbleEvents(void *unused)
 {
-	event_thread = SDL_ThreadID();
+    event_thread = SDL_ThreadID();
 
 #ifdef __OS2__
 #ifdef USE_DOSSETPRIORITY
-	/* Increase thread priority, so it will process events in time for sure! */
-	DosSetPriority(PRTYS_THREAD, PRTYC_REGULAR, +16, 0);
+    /* Increase thread priority, so it will process events in time for sure! */
+    DosSetPriority(PRTYS_THREAD, PRTYC_REGULAR, +16, 0);
 #endif
 #endif
 
-	while ( SDL_EventQ.active ) {
-		SDL_VideoDevice *video = current_video;
-		SDL_VideoDevice *this  = current_video;
+    while (SDL_EventQ.active) {
+        SDL_VideoDevice *_this = SDL_GetVideoDevice();
 
-		/* Get events from the video subsystem */
-		if ( video ) {
-			video->PumpEvents(this);
-		}
+        /* Get events from the video subsystem */
+        if (_this) {
+            _this->PumpEvents(_this);
+        }
 
-		/* Queue pending key-repeat events */
-		SDL_CheckKeyRepeat();
+        /* Queue pending key-repeat events */
+        SDL_CheckKeyRepeat();
 
 #if !SDL_JOYSTICK_DISABLED
-		/* Check for joystick state change */
-		if ( SDL_numjoysticks && (SDL_eventstate & SDL_JOYEVENTMASK) ) {
-			SDL_JoystickUpdate();
-		}
+        /* Check for joystick state change */
+        if (SDL_numjoysticks && (SDL_eventstate & SDL_JOYEVENTMASK)) {
+            SDL_JoystickUpdate();
+        }
 #endif
 
-		/* Give up the CPU for the rest of our timeslice */
-		SDL_EventLock.safe = 1;
-		if ( SDL_timer_running ) {
-			SDL_ThreadedTimerCheck();
-		}
-		SDL_Delay(1);
+        /* Give up the CPU for the rest of our timeslice */
+        SDL_EventLock.safe = 1;
+        if (SDL_timer_running) {
+            SDL_ThreadedTimerCheck();
+        }
+        SDL_Delay(1);
 
-		/* Check for event locking.
-		   On the P of the lock mutex, if the lock is held, this thread
-		   will wait until the lock is released before continuing.  The
-		   safe flag will be set, meaning that the other thread can go
-		   about it's business.  The safe flag is reset before the V,
-		   so as soon as the mutex is free, other threads can see that
-		   it's not safe to interfere with the event thread.
-		 */
-		SDL_mutexP(SDL_EventLock.lock);
-		SDL_EventLock.safe = 0;
-		SDL_mutexV(SDL_EventLock.lock);
-	}
-	SDL_SetTimerThreaded(0);
-	event_thread = 0;
-	return(0);
+        /* Check for event locking.
+           On the P of the lock mutex, if the lock is held, this thread
+           will wait until the lock is released before continuing.  The
+           safe flag will be set, meaning that the other thread can go
+           about it's business.  The safe flag is reset before the V,
+           so as soon as the mutex is free, other threads can see that
+           it's not safe to interfere with the event thread.
+         */
+        SDL_mutexP(SDL_EventLock.lock);
+        SDL_EventLock.safe = 0;
+        SDL_mutexV(SDL_EventLock.lock);
+    }
+    SDL_SetTimerThreaded(0);
+    event_thread = 0;
+    return (0);
 }
 
-static int SDL_StartEventThread(Uint32 flags)
+static int
+SDL_StartEventThread(Uint32 flags)
 {
-	/* Reset everything to zero */
-	SDL_EventThread = NULL;
-	SDL_memset(&SDL_EventLock, 0, sizeof(SDL_EventLock));
+    /* Reset everything to zero */
+    SDL_EventThread = NULL;
+    SDL_memset(&SDL_EventLock, 0, sizeof(SDL_EventLock));
 
-	/* Create the lock and set ourselves active */
+    /* Create the lock and set ourselves active */
 #if !SDL_THREADS_DISABLED
-	SDL_EventQ.lock = SDL_CreateMutex();
-	if ( SDL_EventQ.lock == NULL ) {
-#ifdef __MACOS__ /* MacOS classic you can't multithread, so no lock needed */
-		;
+    SDL_EventQ.lock = SDL_CreateMutex();
+    if (SDL_EventQ.lock == NULL) {
+#ifdef __MACOS__                /* MacOS classic you can't multithread, so no lock needed */
+        ;
 #else
-		return(-1);
+        return (-1);
 #endif
-	}
+    }
 #endif /* !SDL_THREADS_DISABLED */
-	SDL_EventQ.active = 1;
+    SDL_EventQ.active = 1;
 
-	if ( (flags&SDL_INIT_EVENTTHREAD) == SDL_INIT_EVENTTHREAD ) {
-		SDL_EventLock.lock = SDL_CreateMutex();
-		if ( SDL_EventLock.lock == NULL ) {
-			return(-1);
-		}
-		SDL_EventLock.safe = 0;
+    if ((flags & SDL_INIT_EVENTTHREAD) == SDL_INIT_EVENTTHREAD) {
+        SDL_EventLock.lock = SDL_CreateMutex();
+        if (SDL_EventLock.lock == NULL) {
+            return (-1);
+        }
+        SDL_EventLock.safe = 0;
 
-		/* The event thread will handle timers too */
-		SDL_SetTimerThreaded(2);
+        /* The event thread will handle timers too */
+        SDL_SetTimerThreaded(2);
 #if (defined(__WIN32__) && !defined(_WIN32_WCE)) && !defined(HAVE_LIBC)
 #undef SDL_CreateThread
-		SDL_EventThread = SDL_CreateThread(SDL_GobbleEvents, NULL, NULL, NULL);
+        SDL_EventThread =
+            SDL_CreateThread(SDL_GobbleEvents, NULL, NULL, NULL);
 #else
-		SDL_EventThread = SDL_CreateThread(SDL_GobbleEvents, NULL);
+        SDL_EventThread = SDL_CreateThread(SDL_GobbleEvents, NULL);
 #endif
-		if ( SDL_EventThread == NULL ) {
-			return(-1);
-		}
-	} else {
-		event_thread = 0;
-	}
-	return(0);
+        if (SDL_EventThread == NULL) {
+            return (-1);
+        }
+    } else {
+        event_thread = 0;
+    }
+    return (0);
 }
 
-static void SDL_StopEventThread(void)
+static void
+SDL_StopEventThread(void)
 {
-	SDL_EventQ.active = 0;
-	if ( SDL_EventThread ) {
-		SDL_WaitThread(SDL_EventThread, NULL);
-		SDL_EventThread = NULL;
-		SDL_DestroyMutex(SDL_EventLock.lock);
-	}
+    SDL_EventQ.active = 0;
+    if (SDL_EventThread) {
+        SDL_WaitThread(SDL_EventThread, NULL);
+        SDL_EventThread = NULL;
+        SDL_DestroyMutex(SDL_EventLock.lock);
+    }
 #ifndef IPOD
-	SDL_DestroyMutex(SDL_EventQ.lock);
+    SDL_DestroyMutex(SDL_EventQ.lock);
 #endif
 }
 
-Uint32 SDL_EventThreadID(void)
+Uint32
+SDL_EventThreadID(void)
 {
-	return(event_thread);
+    return (event_thread);
 }
 
 /* Public functions */
 
-void SDL_StopEventLoop(void)
+void
+SDL_StopEventLoop(void)
 {
-	/* Halt the event thread, if running */
-	SDL_StopEventThread();
+    /* Halt the event thread, if running */
+    SDL_StopEventThread();
 
-	/* Shutdown event handlers */
-	SDL_AppActiveQuit();
-	SDL_KeyboardQuit();
-	SDL_MouseQuit();
-	SDL_QuitQuit();
+    /* Shutdown event handlers */
+    SDL_KeyboardQuit();
+    SDL_MouseQuit();
+    SDL_QuitQuit();
 
-	/* Clean out EventQ */
-	SDL_EventQ.head = 0;
-	SDL_EventQ.tail = 0;
-	SDL_EventQ.wmmsg_next = 0;
+    /* Clean out EventQ */
+    SDL_EventQ.head = 0;
+    SDL_EventQ.tail = 0;
+    SDL_EventQ.wmmsg_next = 0;
 }
 
 /* This function (and associated calls) may be called more than once */
-int SDL_StartEventLoop(Uint32 flags)
+int
+SDL_StartEventLoop(Uint32 flags)
 {
-	int retcode;
+    int retcode;
 
-	/* Clean out the event queue */
-	SDL_EventThread = NULL;
-	SDL_EventQ.lock = NULL;
-	SDL_StopEventLoop();
-
-	/* No filter to start with, process most event types */
-	SDL_EventOK = NULL;
-	SDL_memset(SDL_ProcessEvents,SDL_ENABLE,sizeof(SDL_ProcessEvents));
-	SDL_eventstate = ~0;
-	/* It's not save to call SDL_EventState() yet */
-	SDL_eventstate &= ~(0x00000001 << SDL_SYSWMEVENT);
-	SDL_ProcessEvents[SDL_SYSWMEVENT] = SDL_IGNORE;
+    /* Clean out the event queue */
+    SDL_EventThread = NULL;
+    SDL_EventQ.lock = NULL;
+    SDL_StopEventLoop();
 
-	/* Initialize event handlers */
-	retcode = 0;
-	retcode += SDL_AppActiveInit();
-	retcode += SDL_KeyboardInit();
-	retcode += SDL_MouseInit();
-	retcode += SDL_QuitInit();
-	if ( retcode < 0 ) {
-		/* We don't expect them to fail, but... */
-		return(-1);
-	}
+    /* No filter to start with, process most event types */
+    SDL_EventOK = NULL;
+    SDL_memset(SDL_ProcessEvents, SDL_ENABLE, sizeof(SDL_ProcessEvents));
+    SDL_eventstate = ~0;
+    /* It's not save to call SDL_EventState() yet */
+    SDL_eventstate &= ~(0x00000001 << SDL_SYSWMEVENT);
+    SDL_ProcessEvents[SDL_SYSWMEVENT] = SDL_IGNORE;
 
-	/* Create the lock and event thread */
-	if ( SDL_StartEventThread(flags) < 0 ) {
-		SDL_StopEventLoop();
-		return(-1);
-	}
-	return(0);
+    /* Initialize event handlers */
+    retcode = 0;
+    retcode += SDL_KeyboardInit();
+    retcode += SDL_MouseInit();
+    retcode += SDL_QuitInit();
+    if (retcode < 0) {
+        /* We don't expect them to fail, but... */
+        return (-1);
+    }
+
+    /* Create the lock and event thread */
+    if (SDL_StartEventThread(flags) < 0) {
+        SDL_StopEventLoop();
+        return (-1);
+    }
+    return (0);
 }
 
 
 /* Add an event to the event queue -- called with the queue locked */
-static int SDL_AddEvent(SDL_Event *event)
+static int
+SDL_AddEvent(SDL_Event * event)
 {
-	int tail, added;
+    int tail, added;
 
-	tail = (SDL_EventQ.tail+1)%MAXEVENTS;
-	if ( tail == SDL_EventQ.head ) {
-		/* Overflow, drop event */
-		added = 0;
-	} else {
-		SDL_EventQ.event[SDL_EventQ.tail] = *event;
-		if (event->type == SDL_SYSWMEVENT) {
-			/* Note that it's possible to lose an event */
-			int next = SDL_EventQ.wmmsg_next;
-			SDL_EventQ.wmmsg[next] = *event->syswm.msg;
-		        SDL_EventQ.event[SDL_EventQ.tail].syswm.msg =
-						&SDL_EventQ.wmmsg[next];
-			SDL_EventQ.wmmsg_next = (next+1)%MAXEVENTS;
-		}
-		SDL_EventQ.tail = tail;
-		added = 1;
-	}
-	return(added);
+    tail = (SDL_EventQ.tail + 1) % MAXEVENTS;
+    if (tail == SDL_EventQ.head) {
+        /* Overflow, drop event */
+        added = 0;
+    } else {
+        SDL_EventQ.event[SDL_EventQ.tail] = *event;
+        if (event->type == SDL_SYSWMEVENT) {
+            /* Note that it's possible to lose an event */
+            int next = SDL_EventQ.wmmsg_next;
+            SDL_EventQ.wmmsg[next] = *event->syswm.msg;
+            SDL_EventQ.event[SDL_EventQ.tail].syswm.msg =
+                &SDL_EventQ.wmmsg[next];
+            SDL_EventQ.wmmsg_next = (next + 1) % MAXEVENTS;
+        }
+        SDL_EventQ.tail = tail;
+        added = 1;
+    }
+    return (added);
 }
 
 /* Cut an event, and return the next valid spot, or the tail */
 /*                           -- called with the queue locked */
-static int SDL_CutEvent(int spot)
+static int
+SDL_CutEvent(int spot)
 {
-	if ( spot == SDL_EventQ.head ) {
-		SDL_EventQ.head = (SDL_EventQ.head+1)%MAXEVENTS;
-		return(SDL_EventQ.head);
-	} else
-	if ( (spot+1)%MAXEVENTS == SDL_EventQ.tail ) {
-		SDL_EventQ.tail = spot;
-		return(SDL_EventQ.tail);
-	} else
-	/* We cut the middle -- shift everything over */
-	{
-		int here, next;
+    if (spot == SDL_EventQ.head) {
+        SDL_EventQ.head = (SDL_EventQ.head + 1) % MAXEVENTS;
+        return (SDL_EventQ.head);
+    } else if ((spot + 1) % MAXEVENTS == SDL_EventQ.tail) {
+        SDL_EventQ.tail = spot;
+        return (SDL_EventQ.tail);
+    } else
+        /* We cut the middle -- shift everything over */
+    {
+        int here, next;
 
-		/* This can probably be optimized with SDL_memcpy() -- careful! */
-		if ( --SDL_EventQ.tail < 0 ) {
-			SDL_EventQ.tail = MAXEVENTS-1;
-		}
-		for ( here=spot; here != SDL_EventQ.tail; here = next ) {
-			next = (here+1)%MAXEVENTS;
-			SDL_EventQ.event[here] = SDL_EventQ.event[next];
-		}
-		return(spot);
-	}
-	/* NOTREACHED */
+        /* This can probably be optimized with SDL_memcpy() -- careful! */
+        if (--SDL_EventQ.tail < 0) {
+            SDL_EventQ.tail = MAXEVENTS - 1;
+        }
+        for (here = spot; here != SDL_EventQ.tail; here = next) {
+            next = (here + 1) % MAXEVENTS;
+            SDL_EventQ.event[here] = SDL_EventQ.event[next];
+        }
+        return (spot);
+    }
+    /* NOTREACHED */
 }
 
 /* Lock the event queue, take a peep at it, and unlock it */
-int SDL_PeepEvents(SDL_Event *events, int numevents, SDL_eventaction action,
-								Uint32 mask)
+int
+SDL_PeepEvents(SDL_Event * events, int numevents, SDL_eventaction action,
+               Uint32 mask)
 {
-	int i, used;
+    int i, used;
 
-	/* Don't look after we've quit */
-	if ( ! SDL_EventQ.active ) {
-		return(-1);
-	}
-	/* Lock the event queue */
-	used = 0;
-	if ( SDL_mutexP(SDL_EventQ.lock) == 0 ) {
-		if ( action == SDL_ADDEVENT ) {
-			for ( i=0; i<numevents; ++i ) {
-				used += SDL_AddEvent(&events[i]);
-			}
-		} else {
-			SDL_Event tmpevent;
-			int spot;
+    /* Don't look after we've quit */
+    if (!SDL_EventQ.active) {
+        return (-1);
+    }
+    /* Lock the event queue */
+    used = 0;
+    if (SDL_mutexP(SDL_EventQ.lock) == 0) {
+        if (action == SDL_ADDEVENT) {
+            for (i = 0; i < numevents; ++i) {
+                used += SDL_AddEvent(&events[i]);
+            }
+        } else {
+            SDL_Event tmpevent;
+            int spot;
 
-			/* If 'events' is NULL, just see if they exist */
-			if ( events == NULL ) {
-				action = SDL_PEEKEVENT;
-				numevents = 1;
-				events = &tmpevent;
-			}
-			spot = SDL_EventQ.head;
-			while ((used < numevents)&&(spot != SDL_EventQ.tail)) {
-				if ( mask & SDL_EVENTMASK(SDL_EventQ.event[spot].type) ) {
-					events[used++] = SDL_EventQ.event[spot];
-					if ( action == SDL_GETEVENT ) {
-						spot = SDL_CutEvent(spot);
-					} else {
-						spot = (spot+1)%MAXEVENTS;
-					}
-				} else {
-					spot = (spot+1)%MAXEVENTS;
-				}
-			}
-		}
-		SDL_mutexV(SDL_EventQ.lock);
-	} else {
-		SDL_SetError("Couldn't lock event queue");
-		used = -1;
-	}
-	return(used);
+            /* If 'events' is NULL, just see if they exist */
+            if (events == NULL) {
+                action = SDL_PEEKEVENT;
+                numevents = 1;
+                events = &tmpevent;
+            }
+            spot = SDL_EventQ.head;
+            while ((used < numevents) && (spot != SDL_EventQ.tail)) {
+                if (mask & SDL_EVENTMASK(SDL_EventQ.event[spot].type)) {
+                    events[used++] = SDL_EventQ.event[spot];
+                    if (action == SDL_GETEVENT) {
+                        spot = SDL_CutEvent(spot);
+                    } else {
+                        spot = (spot + 1) % MAXEVENTS;
+                    }
+                } else {
+                    spot = (spot + 1) % MAXEVENTS;
+                }
+            }
+        }
+        SDL_mutexV(SDL_EventQ.lock);
+    } else {
+        SDL_SetError("Couldn't lock event queue");
+        used = -1;
+    }
+    return (used);
+}
+
+SDL_bool
+SDL_HasEvent(Uint32 mask)
+{
+    return (SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, mask) > 0);
 }
 
 /* Run the system dependent event loops */
-void SDL_PumpEvents(void)
+void
+SDL_PumpEvents(void)
 {
-	if ( !SDL_EventThread ) {
-		SDL_VideoDevice *video = current_video;
-		SDL_VideoDevice *this  = current_video;
+    if (!SDL_EventThread) {
+        SDL_VideoDevice *_this = SDL_GetVideoDevice();
 
-		/* Get events from the video subsystem */
-		if ( video ) {
-			video->PumpEvents(this);
-		}
+        /* Get events from the video subsystem */
+        if (_this) {
+            _this->PumpEvents(_this);
+        }
 
-		/* Queue pending key-repeat events */
-		SDL_CheckKeyRepeat();
+        /* Queue pending key-repeat events */
+        SDL_CheckKeyRepeat();
 
 #if !SDL_JOYSTICK_DISABLED
-		/* Check for joystick state change */
-		if ( SDL_numjoysticks && (SDL_eventstate & SDL_JOYEVENTMASK) ) {
-			SDL_JoystickUpdate();
-		}
+        /* Check for joystick state change */
+        if (SDL_numjoysticks && (SDL_eventstate & SDL_JOYEVENTMASK)) {
+            SDL_JoystickUpdate();
+        }
 #endif
-	}
+    }
 }
 
 /* Public functions */
 
-int SDL_PollEvent (SDL_Event *event)
+int
+SDL_PollEvent(SDL_Event * event)
 {
-	SDL_PumpEvents();
+    SDL_PumpEvents();
+
+    /* We can't return -1, just return 0 (no event) on error */
+    if (SDL_PeepEvents(event, 1, SDL_GETEVENT, SDL_ALLEVENTS) <= 0)
+        return 0;
+    return 1;
+}
 
-	/* We can't return -1, just return 0 (no event) on error */
-	if ( SDL_PeepEvents(event, 1, SDL_GETEVENT, SDL_ALLEVENTS) <= 0 )
-		return 0;
-	return 1;
+int
+SDL_WaitEvent(SDL_Event * event)
+{
+    while (1) {
+        SDL_PumpEvents();
+        switch (SDL_PeepEvents(event, 1, SDL_GETEVENT, SDL_ALLEVENTS)) {
+        case -1:
+            return 0;
+        case 1:
+            return 1;
+        case 0:
+            SDL_Delay(10);
+        }
+    }
 }
 
-int SDL_WaitEvent (SDL_Event *event)
+int
+SDL_PushEvent(SDL_Event * event)
 {
-	while ( 1 ) {
-		SDL_PumpEvents();
-		switch(SDL_PeepEvents(event, 1, SDL_GETEVENT, SDL_ALLEVENTS)) {
-		    case -1: return 0;
-		    case 1: return 1;
-		    case 0: SDL_Delay(10);
-		}
-	}
+    if (SDL_EventOK && !SDL_EventOK(SDL_EventOKParam, event)) {
+        return 0;
+    }
+    if (SDL_PeepEvents(event, 1, SDL_ADDEVENT, 0) <= 0) {
+        return -1;
+    }
+    return 1;
 }
 
-int SDL_PushEvent(SDL_Event *event)
+void
+SDL_SetEventFilter(SDL_EventFilter filter, void *userdata)
 {
-	if ( SDL_PeepEvents(event, 1, SDL_ADDEVENT, 0) <= 0 )
-		return -1;
-	return 0;
+    SDL_Event bitbucket;
+
+    /* Set filter and discard pending events */
+    SDL_EventOK = filter;
+    SDL_EventOKParam = userdata;
+    while (SDL_PollEvent(&bitbucket) > 0);
 }
 
-void SDL_SetEventFilter (SDL_EventFilter filter)
+SDL_bool
+SDL_GetEventFilter(SDL_EventFilter * filter, void **userdata)
 {
-	SDL_Event bitbucket;
-
-	/* Set filter and discard pending events */
-	SDL_EventOK = filter;
-	while ( SDL_PollEvent(&bitbucket) > 0 )
-		;
-}
-
-SDL_EventFilter SDL_GetEventFilter(void)
-{
-	return(SDL_EventOK);
+    if (filter) {
+        *filter = SDL_EventOK;
+    }
+    if (userdata) {
+        *userdata = SDL_EventOKParam;
+    }
+    return SDL_EventOK ? SDL_TRUE : SDL_FALSE;
 }
 
-Uint8 SDL_EventState (Uint8 type, int state)
+void
+SDL_FilterEvents(SDL_EventFilter filter, void *userdata)
 {
-	SDL_Event bitbucket;
-	Uint8 current_state;
+    if (SDL_mutexP(SDL_EventQ.lock) == 0) {
+        int spot;
+
+        spot = SDL_EventQ.head;
+        while (spot != SDL_EventQ.tail) {
+            if (filter(userdata, &SDL_EventQ.event[spot])) {
+                spot = (spot + 1) % MAXEVENTS;
+            } else {
+                spot = SDL_CutEvent(spot);
+            }
+        }
+    }
+    SDL_mutexV(SDL_EventQ.lock);
+}
+
+Uint8
+SDL_EventState(Uint8 type, int state)
+{
+    SDL_Event bitbucket;
+    Uint8 current_state;
 
-	/* If SDL_ALLEVENTS was specified... */
-	if ( type == 0xFF ) {
-		current_state = SDL_IGNORE;
-		for ( type=0; type<SDL_NUMEVENTS; ++type ) {
-			if ( SDL_ProcessEvents[type] != SDL_IGNORE ) {
-				current_state = SDL_ENABLE;
-			}
-			SDL_ProcessEvents[type] = state;
-			if ( state == SDL_ENABLE ) {
-				SDL_eventstate |= (0x00000001 << (type));
-			} else {
-				SDL_eventstate &= ~(0x00000001 << (type));
-			}
-		}
-		while ( SDL_PollEvent(&bitbucket) > 0 )
-			;
-		return(current_state);
-	}
+    /* If SDL_ALLEVENTS was specified... */
+    if (type == 0xFF) {
+        current_state = SDL_IGNORE;
+        for (type = 0; type < SDL_NUMEVENTS; ++type) {
+            if (SDL_ProcessEvents[type] != SDL_IGNORE) {
+                current_state = SDL_ENABLE;
+            }
+            SDL_ProcessEvents[type] = state;
+            if (state == SDL_ENABLE) {
+                SDL_eventstate |= (0x00000001 << (type));
+            } else {
+                SDL_eventstate &= ~(0x00000001 << (type));
+            }
+        }
+        while (SDL_PollEvent(&bitbucket) > 0);
+        return (current_state);
+    }
 
-	/* Just set the state for one event type */
-	current_state = SDL_ProcessEvents[type];
-	switch (state) {
-		case SDL_IGNORE:
-		case SDL_ENABLE:
-			/* Set state and discard pending events */
-			SDL_ProcessEvents[type] = state;
-			if ( state == SDL_ENABLE ) {
-				SDL_eventstate |= (0x00000001 << (type));
-			} else {
-				SDL_eventstate &= ~(0x00000001 << (type));
-			}
-			while ( SDL_PollEvent(&bitbucket) > 0 )
-				;
-			break;
-		default:
-			/* Querying state? */
-			break;
-	}
-	return(current_state);
+    /* Just set the state for one event type */
+    current_state = SDL_ProcessEvents[type];
+    switch (state) {
+    case SDL_IGNORE:
+    case SDL_ENABLE:
+        /* Set state and discard pending events */
+        SDL_ProcessEvents[type] = state;
+        if (state == SDL_ENABLE) {
+            SDL_eventstate |= (0x00000001 << (type));
+        } else {
+            SDL_eventstate &= ~(0x00000001 << (type));
+        }
+        while (SDL_PollEvent(&bitbucket) > 0);
+        break;
+    default:
+        /* Querying state? */
+        break;
+    }
+    return (current_state);
 }
 
 /* This is a generic event handler.
  */
-int SDL_PrivateSysWMEvent(SDL_SysWMmsg *message)
+int
+SDL_SendSysWMEvent(SDL_SysWMmsg * message)
 {
-	int posted;
+    int posted;
 
-	posted = 0;
-	if ( SDL_ProcessEvents[SDL_SYSWMEVENT] == SDL_ENABLE ) {
-		SDL_Event event;
-		SDL_memset(&event, 0, sizeof(event));
-		event.type = SDL_SYSWMEVENT;
-		event.syswm.msg = message;
-		if ( (SDL_EventOK == NULL) || (*SDL_EventOK)(&event) ) {
-			posted = 1;
-			SDL_PushEvent(&event);
-		}
-	}
-	/* Update internal event state */
-	return(posted);
+    posted = 0;
+    if (SDL_ProcessEvents[SDL_SYSWMEVENT] == SDL_ENABLE) {
+        SDL_Event event;
+        SDL_memset(&event, 0, sizeof(event));
+        event.type = SDL_SYSWMEVENT;
+        event.syswm.msg = message;
+        posted = (SDL_PushEvent(&event) > 0);
+    }
+    /* Update internal event state */
+    return (posted);
 }
+
+/* vi: set ts=4 sw=4 expandtab: */