* clutter/clutter-main.c: (generate_enter_leave_events),

(clutter_do_event): moved the generation of enter/leave events
to a utility function.
This commit is contained in:
Øyvind Kolås 2007-11-15 17:30:30 +00:00
parent 35cecde0c8
commit 266315c486
2 changed files with 53 additions and 36 deletions

View File

@ -1,3 +1,9 @@
2007-11-15 Øyvind Kolås <pippin@o-hand.com>
* clutter/clutter-main.c: (generate_enter_leave_events),
(clutter_do_event): moved the generation of enter/leave events
to a utility function.
2007-11-15 Neil J. Patel <njp@o-hand.com> 2007-11-15 Neil J. Patel <njp@o-hand.com>
* clutter/clutter-model.c: * clutter/clutter-model.c:

View File

@ -1203,6 +1203,46 @@ done:
#undef MAX_EVENT_DEPTH #undef MAX_EVENT_DEPTH
} }
static void generate_enter_leave_events (ClutterMainContext *context,
ClutterActor *motion_current_actor,
ClutterEvent *event)
{
static ClutterActor *motion_last_actor = NULL;
if (motion_last_actor != motion_current_actor)
{
if (motion_last_actor && motion_current_actor)
{
ClutterEvent cev;
cev.crossing.type = CLUTTER_LEAVE;
cev.crossing.time = event->any.time;
cev.crossing.flags = 0;
cev.crossing.x = event->motion.x;
cev.crossing.y = event->motion.y;
cev.crossing.source = motion_last_actor;
/* unref in free */
cev.crossing.related = g_object_ref (motion_current_actor);
g_queue_push_head (context->events_queue,
clutter_event_copy (&cev));
cev.crossing.type = CLUTTER_ENTER;
cev.crossing.time = event->any.time;
cev.crossing.flags = 0;
cev.crossing.x = event->motion.x;
cev.crossing.y = event->motion.y;
cev.crossing.source = motion_current_actor;
cev.crossing.related = g_object_ref (motion_last_actor);
g_queue_push_head (context->events_queue,
clutter_event_copy (&cev));
}
}
motion_last_actor = motion_current_actor;
}
/** /**
* clutter_do_event * clutter_do_event
* @event: a #ClutterEvent. * @event: a #ClutterEvent.
@ -1222,7 +1262,6 @@ clutter_do_event (ClutterEvent *event)
ClutterBackend *backend; ClutterBackend *backend;
ClutterActor *stage; ClutterActor *stage;
static ClutterActor *motion_last_actor = NULL;
context = clutter_context_get_default (); context = clutter_context_get_default ();
backend = context->backend; backend = context->backend;
@ -1341,50 +1380,22 @@ clutter_do_event (ClutterEvent *event)
x, y, actor); x, y, actor);
/* Motion enter leave events */
if (event->type == CLUTTER_MOTION) if (event->type == CLUTTER_MOTION)
{ {
if (motion_last_actor != actor) /* Generate enter leave events (if any) */
{ generate_enter_leave_events (context, actor, event);
if (motion_last_actor && actor)
{
ClutterEvent cev;
cev.crossing.type = CLUTTER_LEAVE;
cev.crossing.time = event->any.time;
cev.crossing.flags = 0;
cev.crossing.x = x;
cev.crossing.y = y;
cev.crossing.source = motion_last_actor;
/* unref in free */
cev.crossing.related = g_object_ref (actor);
g_queue_push_head (context->events_queue,
clutter_event_copy (&cev));
cev.crossing.type = CLUTTER_ENTER;
cev.crossing.time = event->any.time;
cev.crossing.flags = 0;
cev.crossing.x = x;
cev.crossing.y = y;
cev.crossing.source = actor;
cev.crossing.related = g_object_ref (motion_last_actor);
g_queue_push_head (context->events_queue,
clutter_event_copy (&cev));
}
}
motion_last_actor = actor;
} }
else else /* (button event) */
event_click_count_generate (event); {
/* Generate click count */
event_click_count_generate (event);
}
if (context->pointer_grab_actor != NULL) if (context->pointer_grab_actor != NULL)
{ {
clutter_actor_event (context->pointer_grab_actor, event, FALSE); clutter_actor_event (context->pointer_grab_actor, event, FALSE);
return; return;
} }
deliver_event (event); deliver_event (event);
} }
break; break;