summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@linux.intel.com>2011-07-20 12:09:54 +0100
committerEmmanuele Bassi <ebassi@linux.intel.com>2011-07-20 12:12:09 +0100
commit9d9c78a60a265e600ddf76d533bf88c755b49d15 (patch)
tree276eeaaee5937c23923df1c36e726ae3613a114b
parentc89de4324e2f9581c4825183c155862148dd7061 (diff)
downloadclutter-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.c6
-rw-r--r--clutter/clutter-master-clock.c5
-rw-r--r--clutter/clutter-stage.c19
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