Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Commit

Permalink
Fixed bug #684
Browse files Browse the repository at this point in the history
Reworked Pierre's patch a little bit, which added SDL_WaitEventTimeout()
  • Loading branch information
slouken committed Feb 17, 2009
1 parent 431768b commit 8de4855
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 7 deletions.
8 changes: 8 additions & 0 deletions include/SDL_events.h
Expand Up @@ -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.
Expand Down
29 changes: 22 additions & 7 deletions src/events/SDL_events.c
Expand Up @@ -399,26 +399,41 @@ 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:
return 0;
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;
}
}
}
Expand Down

0 comments on commit 8de4855

Please sign in to comment.