Fixed bug #684
authorSam Lantinga <slouken@libsdl.org>
Tue, 17 Feb 2009 05:59:40 +0000
changeset 3072 9da8f57ab92c
parent 3071 6f3308d4b6cd
child 3073 c5280d33c32a
Fixed bug #684 Reworked Pierre's patch a little bit, which added SDL_WaitEventTimeout()
include/SDL_events.h
src/events/SDL_events.c
--- 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;
         }
     }
 }