diff --git a/ChangeLog b/ChangeLog index 3684e18d8..d9543fd4a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,23 @@ +2008-05-07 Emmanuele Bassi + + * clutter/sdl/clutter-backend-sdl.c: + (clutter_backend_sdl_dispose): Destroy the timer that we created... + (clutter_backend_sdl_init): ... here. + + * clutter/sdl/clutter-backend-sdl.h: Add a GTimer for time-based + operations, like the event time. + + * clutter/sdl/clutter-event-sdl.c: + (get_backend_time): Get the elapsed milliseconds for the SDL + backend. + + (_clutter_events_init): Start the timer provided by the backend... + (_clutter_events_uninit): ... and the stop it. + + (key_event_translate), (event_translate): Use the backend time + to fill out the time field of the event structures. This fixes + the motion notification throttling on the SDL backend. + 2008-05-06 Matthew Allum * clutter/glx/clutter-glx-texture-pixmap.c: diff --git a/clutter/sdl/clutter-backend-sdl.c b/clutter/sdl/clutter-backend-sdl.c index 5297a85c2..c443e547b 100644 --- a/clutter/sdl/clutter-backend-sdl.c +++ b/clutter/sdl/clutter-backend-sdl.c @@ -143,6 +143,12 @@ clutter_backend_sdl_dispose (GObject *gobject) backend_sdl->stage = NULL; } + if (backend_sdl->timer) + { + g_timer_destroy (backend_sdl->timer); + backend_sdl->timer = NULL; + } + G_OBJECT_CLASS (clutter_backend_sdl_parent_class)->dispose (gobject); } @@ -203,6 +209,8 @@ clutter_backend_sdl_init (ClutterBackendSDL *backend_sdl) clutter_backend_set_resolution (backend, 96.0); clutter_backend_set_double_click_time (backend, 250); clutter_backend_set_double_click_distance (backend, 5); + + backend_sdl->timer = g_timer_new (); } GType diff --git a/clutter/sdl/clutter-backend-sdl.h b/clutter/sdl/clutter-backend-sdl.h index a76cc4100..a8abcb116 100644 --- a/clutter/sdl/clutter-backend-sdl.h +++ b/clutter/sdl/clutter-backend-sdl.h @@ -49,6 +49,9 @@ struct _ClutterBackendSDL /* event source */ GSource *event_source; + /* our own timer for events */ + GTimer *timer; + /*< private >*/ }; diff --git a/clutter/sdl/clutter-event-sdl.c b/clutter/sdl/clutter-event-sdl.c index a64b31369..2f80034e3 100644 --- a/clutter/sdl/clutter-event-sdl.c +++ b/clutter/sdl/clutter-event-sdl.c @@ -62,6 +62,19 @@ static GSourceFuncs event_funcs = { NULL }; +static guint32 +get_backend_time (void) +{ + ClutterBackendSDL *backend_sdl; + gdouble elapsed; + + backend_sdl = CLUTTER_BACKEND_SDL (clutter_get_default_backend ()); + + elapsed = g_timer_elapsed (backend_sdl->timer, NULL); + + return (elapsed * 1000.0); +} + static GSource * clutter_event_source_new (ClutterBackend *backend) { @@ -80,6 +93,11 @@ _clutter_events_init (ClutterBackend *backend) ClutterEventSource *event_source; ClutterBackendSDL *backend_sdl = CLUTTER_BACKEND_SDL (backend); + CLUTTER_NOTE (EVENT, "Starting timer"); + g_assert (backend_sdl->timer != NULL); + g_timer_start (backend_sdl->timer); + + CLUTTER_NOTE (EVENT, "Creating event source"); source = backend_sdl->event_source = clutter_event_source_new (backend); event_source = (ClutterEventSource *) source; g_source_set_priority (source, CLUTTER_PRIORITY_EVENTS); @@ -97,8 +115,10 @@ _clutter_events_uninit (ClutterBackend *backend) if (backend_sdl->event_source) { - CLUTTER_NOTE (EVENT, "Destroying the event source"); + CLUTTER_NOTE (EVENT, "Stopping the timer"); + g_timer_stop (backend_sdl->timer); + CLUTTER_NOTE (EVENT, "Destroying the event source"); event_sources = g_list_remove (event_sources, backend_sdl->event_source); @@ -168,7 +188,7 @@ static void key_event_translate (ClutterEvent *event, SDL_Event *sdl_event) { - event->key.time = 0; + event->key.time = get_backend_time (); /* FIXME: This is just a quick hack to make SDL keys roughly work. * Fixing it properly is left as a exercise to someone who enjoys @@ -180,7 +200,7 @@ key_event_translate (ClutterEvent *event, * SDL in the first place (More portability than just GLX) */ - switch(sdl_event->key.keysym.sym) + switch (sdl_event->key.keysym.sym) { case SDLK_UP: event->key.keyval = CLUTTER_Up; break; case SDLK_DOWN: event->key.keyval = CLUTTER_Down; break; @@ -212,8 +232,11 @@ event_translate (ClutterBackend *backend, ClutterEvent *event, SDL_Event *sdl_event) { + ClutterBackendSDL *backend_sdl; gboolean res; + backend_sdl = CLUTTER_BACKEND_SDL (clutter_get_default_backend ()); + res = TRUE; switch (sdl_event->type) @@ -246,15 +269,16 @@ event_translate (ClutterBackend *backend, else event->scroll.direction = CLUTTER_SCROLL_RIGHT; - event->scroll.time = 0; + event->scroll.time = get_backend_time (); event->scroll.x = sdl_event->button.x; event->scroll.y = sdl_event->button.y; event->scroll.modifier_state = sdl_event->button.state; break; + default: event->button.type = event->type = CLUTTER_BUTTON_PRESS; - event->button.time = 0; + event->button.time = get_backend_time (); event->button.x = sdl_event->button.x; event->button.y = sdl_event->button.y; event->button.modifier_state = sdl_event->button.state; @@ -275,7 +299,7 @@ event_translate (ClutterBackend *backend, } event->button.type = event->type = CLUTTER_BUTTON_RELEASE; - event->button.time = 0; + event->button.time = get_backend_time (); event->button.x = sdl_event->button.x; event->button.y = sdl_event->button.y; event->button.modifier_state = sdl_event->button.state; @@ -284,10 +308,10 @@ event_translate (ClutterBackend *backend, case SDL_MOUSEMOTION: event->motion.type = event->type = CLUTTER_MOTION; - event->motion.time = 0; + event->motion.time = get_backend_time (); event->motion.x = sdl_event->motion.x; event->motion.y = sdl_event->motion.y; - event->motion.modifier_state = sdl_event->motion.state;; + event->motion.modifier_state = sdl_event->motion.state; break; default: