diff options
author | Emmanuele Bassi <ebassi@linux.intel.com> | 2011-07-20 12:09:54 +0100 |
---|---|---|
committer | Emmanuele Bassi <ebassi@linux.intel.com> | 2011-07-20 12:12:09 +0100 |
commit | 9d9c78a60a265e600ddf76d533bf88c755b49d15 (patch) | |
tree | 276eeaaee5937c23923df1c36e726ae3613a114b | |
parent | c89de4324e2f9581c4825183c155862148dd7061 (diff) | |
download | clutter-pick-each-frame.tar.gz |
Update the devices inside a stage on every framepick-each-frame
This will update the actor underneath the pointer each time a new frame
is started, thus allowing the emission of crossing event pairs if the
scene changes without the pointer devices moving.
http://bugzilla.clutter-project.org/show_bug.cgi?id=1273
-rw-r--r-- | clutter/clutter-main.c | 6 | ||||
-rw-r--r-- | clutter/clutter-master-clock.c | 5 | ||||
-rw-r--r-- | clutter/clutter-stage.c | 19 |
3 files changed, 26 insertions, 4 deletions
diff --git a/clutter/clutter-main.c b/clutter/clutter-main.c index 3a6bb1122..49009e5ad 100644 --- a/clutter/clutter-main.c +++ b/clutter/clutter-main.c @@ -2085,7 +2085,7 @@ _clutter_process_event_details (ClutterActor *stage, emit_pointer_event (event, device); - actor = _clutter_input_device_update (device, FALSE); + actor = device->cursor_actor; if (actor != stage) { ClutterEvent *crossing; @@ -2218,8 +2218,8 @@ _clutter_process_event_details (ClutterActor *stage, * already have everything we need to update it and * get the actor underneath */ - if (device != NULL) - actor = _clutter_input_device_update (device, TRUE); + if (G_LIKELY (device != NULL)) + actor = device->cursor_actor; else { CLUTTER_NOTE (EVENT, "No device found: picking"); diff --git a/clutter/clutter-master-clock.c b/clutter/clutter-master-clock.c index 1d679243d..5f9112d1d 100644 --- a/clutter/clutter-master-clock.c +++ b/clutter/clutter-master-clock.c @@ -357,7 +357,10 @@ clutter_clock_dispatch (GSource *source, * motion compression, and avoid multiple picks per frame. */ if (_clutter_stage_get_pending_swaps (l->data) == 0) - _clutter_stage_process_queued_events (l->data); + { + _clutter_stage_update_input_devices (l->data); + _clutter_stage_process_queued_events (l->data); + } } CLUTTER_TIMER_STOP (_clutter_uprof_context, master_event_process); diff --git a/clutter/clutter-stage.c b/clutter/clutter-stage.c index 7e9beb389..173915366 100644 --- a/clutter/clutter-stage.c +++ b/clutter/clutter-stage.c @@ -4022,6 +4022,25 @@ _clutter_stage_has_device (ClutterStage *stage, return g_hash_table_lookup (priv->devices, device) != NULL; } +void +_clutter_stage_update_input_devices (ClutterStage *stage) +{ + ClutterStagePrivate *priv = stage->priv; + GHashTableIter iter; + gpointer key, value; + + if (!priv->motion_events_enabled) + return; + + g_hash_table_iter_init (&iter, priv->devices); + while (g_hash_table_iter_next (&iter, &key, &value)) + { + ClutterInputDevice *device = key; + + _clutter_input_device_update (device, TRUE); + } +} + /** * clutter_stage_set_motion_events_enabled: * @stage: a #ClutterStage |