mirror of
https://github.com/brl/mutter.git
synced 2025-06-13 08:49:30 +00:00
2007-05-28 Matthew Allum <mallum@openedhand.com>
* clutter/clutter-backend.c: * clutter/clutter-backend.h: * clutter/glx/clutter-stage-glx.c: * clutter/glx/clutter-backend-glx.c: Fix up rendering pipeline removing clutter_backend_XXX_stage_paint and adding clutter_backend_XXX_redraw instead. Duplicates less code in backends, avoids clutter_actor_paint() getting called before stage is set up (viewport wise) and unbreaks things like picking. * clutter/clutter-actor.c: * clutter/clutter-actor.h: * clutter/clutter-main.c: * clutter/clutter-private.h: * clutter/clutter-stage.c: (clutter_stage_get_actor_at_pos): Redo picking functionality a different way (via color indexing) as to provide more flexibility, possibly speed and more likely work with GL/ES (doesn't currently however - not sure why). * clutter/clutter-group.c: Add groups own 'pick' method. * clutter/cogl/cogl.h: * clutter/cogl/gl/cogl.c: * clutter/cogl/gles/cogl.c: Move clipping funtionality into cogl. * clutter/cogl/gles/cogl-defines.h: Hack around missing BGR format in GL/ES. * clutter/egl/clutter-backend-egl.c: * clutter/egl/clutter-backend-egl.h: * clutter/egl/clutter-stage-egl.c: * clutter/sdl/clutter-backend-sdl.c: * clutter/sdl/clutter-backend-sdl.h: * clutter/sdl/clutter-event-sdl.c: * clutter/sdl/clutter-stage-sdl.c: Update backends to newer API. Add basic mouse event translation to SDL.
This commit is contained in:
@ -123,6 +123,91 @@ clutter_event_check (GSource *source)
|
||||
return SDL_PeepEvents(&events, 1, SDL_PEEKEVENT, SDL_ALLEVENTS);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
event_translate (ClutterBackend *backend,
|
||||
ClutterEvent *event,
|
||||
SDL_Event *sdl_event)
|
||||
{
|
||||
/* FIXME: Complete */
|
||||
gboolean res;
|
||||
|
||||
res = TRUE;
|
||||
|
||||
switch (sdl_event->type)
|
||||
{
|
||||
|
||||
case SDL_MOUSEBUTTONDOWN:
|
||||
switch (sdl_event->button.button)
|
||||
{
|
||||
case 4: /* up */
|
||||
case 5: /* down */
|
||||
case 6: /* left */
|
||||
case 7: /* right */
|
||||
event->scroll.type = event->type = CLUTTER_SCROLL;
|
||||
|
||||
if (sdl_event->button.button == 4)
|
||||
event->scroll.direction = CLUTTER_SCROLL_UP;
|
||||
else if (sdl_event->button.button == 5)
|
||||
event->scroll.direction = CLUTTER_SCROLL_DOWN;
|
||||
else if (sdl_event->button.button == 6)
|
||||
event->scroll.direction = CLUTTER_SCROLL_LEFT;
|
||||
else
|
||||
event->scroll.direction = CLUTTER_SCROLL_RIGHT;
|
||||
|
||||
event->scroll.time = 0;
|
||||
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.x = sdl_event->button.x;
|
||||
event->button.y = sdl_event->button.y;
|
||||
event->button.modifier_state = sdl_event->button.state;
|
||||
event->button.button = sdl_event->button.button;
|
||||
_clutter_event_button_generate (backend, event);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case SDL_MOUSEBUTTONUP:
|
||||
/* scroll events don't have a corresponding release */
|
||||
if (sdl_event->button.button == 4 ||
|
||||
sdl_event->button.button == 5 ||
|
||||
sdl_event->button.button == 6 ||
|
||||
sdl_event->button.button == 7)
|
||||
{
|
||||
res = FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
event->button.type = event->type = CLUTTER_BUTTON_RELEASE;
|
||||
event->button.time = 0;
|
||||
event->button.x = sdl_event->button.x;
|
||||
event->button.y = sdl_event->button.y;
|
||||
event->button.modifier_state = sdl_event->button.state;
|
||||
event->button.button = sdl_event->button.button;
|
||||
break;
|
||||
|
||||
case SDL_MOUSEMOTION:
|
||||
event->motion.type = event->type = CLUTTER_MOTION;
|
||||
event->motion.time = 0;
|
||||
event->motion.x = sdl_event->motion.x;
|
||||
event->motion.y = sdl_event->motion.y;
|
||||
event->motion.modifier_state = sdl_event->motion.state;;
|
||||
break;
|
||||
|
||||
default:
|
||||
res = FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
static gboolean
|
||||
clutter_event_dispatch (GSource *source,
|
||||
GSourceFunc callback,
|
||||
@ -130,6 +215,10 @@ clutter_event_dispatch (GSource *source,
|
||||
{
|
||||
SDL_Event sdl_event;
|
||||
ClutterEvent *event = NULL;
|
||||
ClutterBackend *backend = ((ClutterEventSource *) source)->backend;
|
||||
ClutterMainContext *clutter_context;
|
||||
|
||||
clutter_context = clutter_context_get_default ();
|
||||
|
||||
while (SDL_PollEvent(&sdl_event))
|
||||
{
|
||||
@ -141,11 +230,22 @@ clutter_event_dispatch (GSource *source,
|
||||
SDL_Quit();
|
||||
exit(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
event = clutter_event_new (CLUTTER_NOTHING);
|
||||
|
||||
if (event_translate (backend, event, &sdl_event))
|
||||
{
|
||||
/* push directly here to avoid copy of queue_put */
|
||||
g_queue_push_head (clutter_context->events_queue, event);
|
||||
}
|
||||
else
|
||||
{
|
||||
clutter_event_free (event);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
||||
event = clutter_event_get ();
|
||||
|
||||
if (event)
|
||||
|
Reference in New Issue
Block a user