diff options
Diffstat (limited to 'libwinnie/src/sdl/event.cc')
-rw-r--r-- | libwinnie/src/sdl/event.cc | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/libwinnie/src/sdl/event.cc b/libwinnie/src/sdl/event.cc index 91b12b2..889e153 100644 --- a/libwinnie/src/sdl/event.cc +++ b/libwinnie/src/sdl/event.cc @@ -28,6 +28,10 @@ Author: Eleni Maria Stea <elene.mst@gmail.com> #include "mouse.h" #include "wm.h" +enum { + TIMER_EVENT = SDL_USEREVENT +}; + SDL_Event sdl_event; void process_events() { @@ -49,10 +53,57 @@ void process_events() break; case SDL_QUIT: exit(0); + + case TIMER_EVENT: + { + Window *win = (Window*)sdl_event.user.data1; + TimerFuncType func = win->get_timer_callback(); + if(func) { + func(win); + } else { + fprintf(stderr, "timer gone off but window has no timer callback!\n"); + } + } + break; + default: break; } } while(SDL_PollEvent(&sdl_event)); } +struct TimerData { + SDL_TimerID sdl_timer; + Window *win; + TimerMode mode; +}; + +static unsigned int timer_callback(unsigned int interval, void *cls) +{ + TimerData *td = (TimerData*)cls; + + SDL_Event ev; + ev.type = TIMER_EVENT; + ev.user.data1 = td->win; + SDL_PushEvent(&ev); + + if(td->mode == TIMER_ONESHOT) { + delete td; + return 0; + } + return interval; // repeat at same interval +} + +void set_window_timer(Window *win, unsigned int msec, TimerMode mode) +{ + if(!win->get_timer_callback()) { + fprintf(stderr, "trying to start a timer without having a timer callback!\n"); + return; + } + TimerData *td = new TimerData; + td->win = win; + td->mode = mode; + td->sdl_timer = SDL_AddTimer(msec, timer_callback, td); +} + #endif // WINNIE_SDL |