evdev: update the state of the core pointer and core keyboard for all events

These two devices are logically tied togheter, and their state
should always be the same. Also, we need to update them after
the event is queued, as the current modifier state (as opposed to the
modifier mask in the event) should include also the effect of the last
key press/release.

https://bugzilla.gnome.org/show_bug.cgi?id=706494
This commit is contained in:
Giovanni Campagna 2013-09-04 13:36:41 +02:00
parent 0db9075562
commit dd940a71b1

View File

@ -544,9 +544,21 @@ clutter_event_dispatch (GSource *g_source,
if (event) if (event)
{ {
ClutterModifierType event_state;
ClutterInputDevice *input_device;
ClutterDeviceManagerEvdev *manager_evdev;
input_device = CLUTTER_INPUT_DEVICE (source->device);
manager_evdev = CLUTTER_DEVICE_MANAGER_EVDEV (input_device->device_manager);
/* 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);
/* update the device states *after* the event */
event_state = xkb_state_serialize_mods (manager_evdev->priv->xkb, XKB_STATE_MODS_EFFECTIVE);
_clutter_input_device_set_state (manager_evdev->priv->core_pointer, event_state);
_clutter_input_device_set_state (manager_evdev->priv->core_keyboard, event_state);
} }
out: out: