clutter/stage: Update stored pointer coordinates in fast paths

If we are still under the "clear area" of the pick actor, we forget
to update the coordinates. This is usually not needed, unless we
need to repick again for non-event circumstances (e.g. pick actor
is destroyed). This will ensure the right pointer coordinates are
used afterwards in those situations.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1915>
This commit is contained in:
Carlos Garnacho 2021-08-25 16:37:23 +02:00 committed by Marge Bot
parent 9475b872c0
commit 757d595fa3

View File

@ -3440,6 +3440,24 @@ clutter_stage_get_device_coords (ClutterStage *stage,
*coords = entry->coords;
}
static void
clutter_stage_set_device_coords (ClutterStage *stage,
ClutterInputDevice *device,
ClutterEventSequence *sequence,
graphene_point_t coords)
{
ClutterStagePrivate *priv = stage->priv;
PointerDeviceEntry *entry = NULL;
if (sequence != NULL)
entry = g_hash_table_lookup (priv->touch_sequences, sequence);
else
entry = g_hash_table_lookup (priv->pointer_devices, device);
if (entry)
entry->coords = coords;
}
static void
create_crossing_event (ClutterStage *stage,
ClutterInputDevice *device,
@ -3587,8 +3605,12 @@ clutter_stage_pick_and_update_device (ClutterStage *stage,
{
if (clutter_stage_check_in_clear_area (stage, device,
sequence, point))
{
clutter_stage_set_device_coords (stage, device,
sequence, point);
return clutter_stage_get_device_actor (stage, device, sequence);
}
}
new_actor = _clutter_stage_do_pick (stage,
point.x,