sdlterm/src/sdlterm.cc
changeset 57 911927edbdde
parent 55 1ab0edd5d784
child 58 50308ed5e4f9
--- a/sdlterm/src/sdlterm.cc	Mon Jan 07 23:15:17 2013 +0100
+++ b/sdlterm/src/sdlterm.cc	Tue Jan 08 01:12:07 2013 +0100
@@ -310,7 +310,7 @@
  : _screen(), _attr(7), _cursor_x(0), _cursor_y(0), _cursor_visible(false),
    _mousemove_last_x(-1), _mousemove_last_y(-1)
 {
-    if (SDL_Init(SDL_INIT_VIDEO) == -1)
+    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) == -1)
     {
         fprintf(stderr, "Unable to initialize SDL: %s\n", SDL_GetError());
         throw std::exception();
@@ -341,22 +341,41 @@
     }
 }
 
-void Terminal::get_next_event(Event &event)
+
+bool Terminal::wait_event(Event &event, Uint32 timeout)
 {
     static SDL_Event sdl_event;
 
+    // use timer to simulate SDL_WaitEventTimeout, which is not available in SDL 1.2
+    SDL_TimerID timer_id = NULL;
+    if (timeout)
+    {
+        timer_id = SDL_AddTimer(timeout, _wait_event_callback, NULL);
+    }
+
     while (SDL_WaitEvent(&sdl_event))
     {
+        if (timer_id)
+        {
+            if (sdl_event.type == SDL_USEREVENT && sdl_event.user.code == 1)
+            {
+                // timeout
+                return false;
+            }
+            // some event came before timeout...
+            SDL_RemoveTimer(timer_id);
+            timer_id = NULL;
+        }
         switch (sdl_event.type)
         {
             case SDL_QUIT:
                 event.type = Event::QUIT;
-                return;
+                return true;
 
             case SDL_VIDEORESIZE:
                 event.type = Event::RESIZE;
                 _screen.resize(sdl_event.resize.w, sdl_event.resize.h);
-                return;
+                return true;
 
             case SDL_VIDEOEXPOSE:
                 _screen.redraw();
@@ -380,7 +399,7 @@
                     if (!event.key.unicode)
                         break; // continue loop (unknown key)
                 }
-                return;
+                return true;
             }
 
             case SDL_MOUSEBUTTONDOWN:
@@ -396,7 +415,7 @@
                     event.type = Event::MOUSEWHEEL;
                 }
                 _mousemove_last_x = -1;
-                return;
+                return true;
 
             case SDL_MOUSEMOTION:
                 if (sdl_event.motion.state == 0)
@@ -409,7 +428,7 @@
                 {
                     _mousemove_last_x = event.mouse.x;
                     _mousemove_last_y = event.mouse.y;
-                    return;
+                    return true;
                 }
                 break; // continue loop when mouse position did not change
 
@@ -417,6 +436,8 @@
                 break; // continue loop
         }
     }
+    fprintf(stderr, "SDL_WaitEvent error: %s\n", SDL_GetError());
+    throw std::exception();
 }
 
 
@@ -458,3 +479,13 @@
     }
 }
 
+
+Uint32 Terminal::_wait_event_callback(Uint32 interval, void *param)
+{
+    SDL_Event event;
+    event.type = SDL_USEREVENT;
+    event.user.code = 1;
+    SDL_PushEvent(&event);
+    return 0;
+}
+