Fixed handling of enter and leave events in clutter_x11_handle_event()
When processing a motion event, we need to spin the event loop two extra times to ensure that any enter/leave events that might have been synthesized are pumped through (otherwise they end up being pushed down the queue and never processed).
This commit is contained in:
parent
7233ca48a8
commit
c1de33fafe
@ -864,6 +864,7 @@ clutter_x11_handle_event (XEvent *xevent)
|
|||||||
ClutterEvent *event;
|
ClutterEvent *event;
|
||||||
ClutterMainContext *clutter_context;
|
ClutterMainContext *clutter_context;
|
||||||
ClutterX11FilterReturn result;
|
ClutterX11FilterReturn result;
|
||||||
|
gint spin = 1;
|
||||||
|
|
||||||
/* The return values here are someone approximate; we return
|
/* The return values here are someone approximate; we return
|
||||||
* CLUTTER_X11_FILTER_REMOVE if and only if a clutter event is
|
* CLUTTER_X11_FILTER_REMOVE if and only if a clutter event is
|
||||||
@ -895,13 +896,21 @@ clutter_x11_handle_event (XEvent *xevent)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
event = clutter_event_get ();
|
/*
|
||||||
|
* Motion events can generate synthetic enter and leave events, so if we
|
||||||
|
* are processing a motion event, we need to spin the event loop at least
|
||||||
|
* two extra times to pump the enter/leave events through (otherwise they
|
||||||
|
* just get pushed down the queue and never processed).
|
||||||
|
*/
|
||||||
|
if (event->type == CLUTTER_MOTION)
|
||||||
|
spin += 2;
|
||||||
|
|
||||||
if (event)
|
while (spin > 0 && (event = clutter_event_get ()))
|
||||||
{
|
{
|
||||||
/* forward the event into clutter for emission etc. */
|
/* forward the event into clutter for emission etc. */
|
||||||
clutter_do_event (event);
|
clutter_do_event (event);
|
||||||
clutter_event_free (event);
|
clutter_event_free (event);
|
||||||
|
--spin;
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
Loading…
Reference in New Issue
Block a user