diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c index 107da475d5c0e948a106d754329ae701dec5efe7..eece2450b0fbe333dc21b5212c21dfe74f7635eb 100644 --- a/clutter/clutter/clutter-stage.c +++ b/clutter/clutter/clutter-stage.c @@ -875,15 +875,6 @@ _clutter_stage_queue_event (ClutterStage *stage, if (copy_event) event = clutter_event_copy (event); - g_queue_push_tail (priv->event_queue, event); - - if (first_event) - { - ClutterMasterClock *master_clock = _clutter_master_clock_get_default (); - _clutter_master_clock_start_running (master_clock); - _clutter_stage_schedule_update (stage); - } - /* if needed, update the state of the input device of the event. * we do it here to avoid calling the same code from every backend * event processing function @@ -904,6 +895,28 @@ _clutter_stage_queue_event (ClutterStage *stage, _clutter_input_device_set_state (device, event_state); _clutter_input_device_set_time (device, event_time); } + + if (first_event) + { + gboolean compressible = event->type == CLUTTER_MOTION || + event->type == CLUTTER_TOUCH_UPDATE; + + if (!compressible) + { + _clutter_process_event (event); + clutter_event_free (event); + return; + } + } + + g_queue_push_tail (priv->event_queue, event); + + if (first_event) + { + ClutterMasterClock *master_clock = _clutter_master_clock_get_default (); + _clutter_master_clock_start_running (master_clock); + _clutter_stage_schedule_update (stage); + } } gboolean diff --git a/clutter/clutter/evdev/clutter-device-manager-evdev.c b/clutter/clutter/evdev/clutter-device-manager-evdev.c index 84b0aad490a18c265dfeb81600e41e93c7f9ca7d..dc8d4fb054385ff22ce58659d1540aa4a45f41d9 100644 --- a/clutter/clutter/evdev/clutter-device-manager-evdev.c +++ b/clutter/clutter/evdev/clutter-device-manager-evdev.c @@ -701,14 +701,14 @@ clutter_event_dispatch (GSource *g_source, if (!_clutter_input_device_get_stage (input_device)) goto out; - /* forward the event into clutter for emission etc. */ - _clutter_stage_queue_event (event->any.stage, event, FALSE); - - /* update the device states *after* the event */ + /* update the device states *before* the event */ event_state = seat->button_state | xkb_state_serialize_mods (seat->xkb, XKB_STATE_MODS_EFFECTIVE); _clutter_input_device_set_state (seat->core_pointer, event_state); _clutter_input_device_set_state (seat->core_keyboard, event_state); + + /* forward the event into clutter for emission etc. */ + _clutter_stage_queue_event (event->any.stage, event, FALSE); } out: