2008-05-07 Emmanuele Bassi <ebassi@openedhand.com>

* 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.
This commit is contained in:
Emmanuele Bassi 2008-05-07 15:03:59 +00:00
parent 0782e7d635
commit fabed98362
4 changed files with 63 additions and 8 deletions

View File

@ -1,3 +1,23 @@
2008-05-07 Emmanuele Bassi <ebassi@openedhand.com>
* 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 <mallum@openedhand.com> 2008-05-06 Matthew Allum <mallum@openedhand.com>
* clutter/glx/clutter-glx-texture-pixmap.c: * clutter/glx/clutter-glx-texture-pixmap.c:

View File

@ -143,6 +143,12 @@ clutter_backend_sdl_dispose (GObject *gobject)
backend_sdl->stage = NULL; 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); 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_resolution (backend, 96.0);
clutter_backend_set_double_click_time (backend, 250); clutter_backend_set_double_click_time (backend, 250);
clutter_backend_set_double_click_distance (backend, 5); clutter_backend_set_double_click_distance (backend, 5);
backend_sdl->timer = g_timer_new ();
} }
GType GType

View File

@ -49,6 +49,9 @@ struct _ClutterBackendSDL
/* event source */ /* event source */
GSource *event_source; GSource *event_source;
/* our own timer for events */
GTimer *timer;
/*< private >*/ /*< private >*/
}; };

View File

@ -62,6 +62,19 @@ static GSourceFuncs event_funcs = {
NULL 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 * static GSource *
clutter_event_source_new (ClutterBackend *backend) clutter_event_source_new (ClutterBackend *backend)
{ {
@ -80,6 +93,11 @@ _clutter_events_init (ClutterBackend *backend)
ClutterEventSource *event_source; ClutterEventSource *event_source;
ClutterBackendSDL *backend_sdl = CLUTTER_BACKEND_SDL (backend); 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); source = backend_sdl->event_source = clutter_event_source_new (backend);
event_source = (ClutterEventSource *) source; event_source = (ClutterEventSource *) source;
g_source_set_priority (source, CLUTTER_PRIORITY_EVENTS); g_source_set_priority (source, CLUTTER_PRIORITY_EVENTS);
@ -97,8 +115,10 @@ _clutter_events_uninit (ClutterBackend *backend)
if (backend_sdl->event_source) 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, event_sources = g_list_remove (event_sources,
backend_sdl->event_source); backend_sdl->event_source);
@ -168,7 +188,7 @@ static void
key_event_translate (ClutterEvent *event, key_event_translate (ClutterEvent *event,
SDL_Event *sdl_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. /* 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 * 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) * 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_UP: event->key.keyval = CLUTTER_Up; break;
case SDLK_DOWN: event->key.keyval = CLUTTER_Down; break; case SDLK_DOWN: event->key.keyval = CLUTTER_Down; break;
@ -212,8 +232,11 @@ event_translate (ClutterBackend *backend,
ClutterEvent *event, ClutterEvent *event,
SDL_Event *sdl_event) SDL_Event *sdl_event)
{ {
ClutterBackendSDL *backend_sdl;
gboolean res; gboolean res;
backend_sdl = CLUTTER_BACKEND_SDL (clutter_get_default_backend ());
res = TRUE; res = TRUE;
switch (sdl_event->type) switch (sdl_event->type)
@ -246,15 +269,16 @@ event_translate (ClutterBackend *backend,
else else
event->scroll.direction = CLUTTER_SCROLL_RIGHT; 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.x = sdl_event->button.x;
event->scroll.y = sdl_event->button.y; event->scroll.y = sdl_event->button.y;
event->scroll.modifier_state = sdl_event->button.state; event->scroll.modifier_state = sdl_event->button.state;
break; break;
default: default:
event->button.type = event->type = CLUTTER_BUTTON_PRESS; 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.x = sdl_event->button.x;
event->button.y = sdl_event->button.y; event->button.y = sdl_event->button.y;
event->button.modifier_state = sdl_event->button.state; 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.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.x = sdl_event->button.x;
event->button.y = sdl_event->button.y; event->button.y = sdl_event->button.y;
event->button.modifier_state = sdl_event->button.state; event->button.modifier_state = sdl_event->button.state;
@ -284,10 +308,10 @@ event_translate (ClutterBackend *backend,
case SDL_MOUSEMOTION: case SDL_MOUSEMOTION:
event->motion.type = event->type = CLUTTER_MOTION; 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.x = sdl_event->motion.x;
event->motion.y = sdl_event->motion.y; event->motion.y = sdl_event->motion.y;
event->motion.modifier_state = sdl_event->motion.state;; event->motion.modifier_state = sdl_event->motion.state;
break; break;
default: default: