From 8de4855a589613464914ce83b3a9c6ff43db702a Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Tue, 17 Feb 2009 05:59:40 +0000 Subject: [PATCH] Fixed bug #684 Reworked Pierre's patch a little bit, which added SDL_WaitEventTimeout() --- include/SDL_events.h | 8 ++++++++ src/events/SDL_events.c | 29 ++++++++++++++++++++++------- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/include/SDL_events.h b/include/SDL_events.h index 13672f2e4..34c2a1242 100644 --- a/include/SDL_events.h +++ b/include/SDL_events.h @@ -412,6 +412,14 @@ extern DECLSPEC int SDLCALL SDL_PollEvent(SDL_Event * event); */ 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. diff --git a/src/events/SDL_events.c b/src/events/SDL_events.c index 94c6d7e9b..6944940ec 100644 --- a/src/events/SDL_events.c +++ b/src/events/SDL_events.c @@ -399,18 +399,24 @@ SDL_PumpEvents(void) 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 @@ SDL_WaitEvent(SDL_Event * event) 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; } } }