Mercurial > sdl-ios-xcode
changeset 3072:9da8f57ab92c
Fixed bug #684
Reworked Pierre's patch a little bit, which added SDL_WaitEventTimeout()
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Tue, 17 Feb 2009 05:59:40 +0000 |
parents | 6f3308d4b6cd |
children | c5280d33c32a |
files | include/SDL_events.h src/events/SDL_events.c |
diffstat | 2 files changed, 30 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/include/SDL_events.h Tue Feb 17 05:57:54 2009 +0000 +++ b/include/SDL_events.h Tue Feb 17 05:59:40 2009 +0000 @@ -412,6 +412,14 @@ */ extern DECLSPEC int SDLCALL SDL_WaitEvent(SDL_Event * event); +/* Waits until the specified timeout (in milliseconds) for the next available + event, returning 1, or 0 if there was an error while waiting for events. If + 'event' is not NULL, the next event is removed from the queue and stored in + that area. + */ +extern DECLSPEC int SDLCALL SDL_WaitEventTimeout(SDL_Event * event, + int timeout); + /* Add an event to the event queue. This function returns 1 on success, 0 if the event was filtered, or -1 if the event queue was full or there was some other error.
--- a/src/events/SDL_events.c Tue Feb 17 05:57:54 2009 +0000 +++ b/src/events/SDL_events.c Tue Feb 17 05:59:40 2009 +0000 @@ -399,18 +399,24 @@ int SDL_PollEvent(SDL_Event * event) { - 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; + return SDL_WaitEventTimeout(event, 0); } int SDL_WaitEvent(SDL_Event * event) { - while (1) { + return SDL_WaitEventTimeout(event, -1); +} + +int +SDL_WaitEventTimeout(SDL_Event * event, int timeout) +{ + Uint32 expiration = 0; + + if (timeout > 0) + expiration = SDL_GetTicks() + timeout; + + for (;;) { SDL_PumpEvents(); switch (SDL_PeepEvents(event, 1, SDL_GETEVENT, SDL_ALLEVENTS)) { case -1: @@ -418,7 +424,16 @@ case 1: return 1; case 0: + if (timeout == 0) { + /* Polling and no events, just return */ + return 0; + } + if (timeout > 0 && ((int) (SDL_GetTicks() - expiration) >= 0)) { + /* Timeout expired and no events */ + return 0; + } SDL_Delay(10); + break; } } }