From e58f716fb174fc657aa78ea4ac451f68156bae85 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Wed, 1 Feb 2023 17:37:59 +0100 Subject: [PATCH] clutter: Pass source device onto crossing event generation machinery For motion-induced crossing events, this will be the device that generated the motion. For code-induced crossing events (e.g. grabs or actors disappearing) this will be none. Part-of: --- clutter/clutter/clutter-main.c | 3 +++ clutter/clutter/clutter-mutter.h | 1 + clutter/clutter/clutter-stage-private.h | 1 + clutter/clutter/clutter-stage.c | 16 +++++++++++++--- 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/clutter/clutter/clutter-main.c b/clutter/clutter/clutter-main.c index 9be960f5e..837bfced9 100644 --- a/clutter/clutter/clutter-main.c +++ b/clutter/clutter/clutter-main.c @@ -696,6 +696,7 @@ update_device_for_event (ClutterStage *stage, gboolean emit_crossing) { ClutterInputDevice *device = clutter_event_get_device (event); + ClutterInputDevice *source_device = clutter_event_get_source_device (event); ClutterEventSequence *sequence = clutter_event_get_event_sequence (event); ClutterDeviceUpdateFlags flags = CLUTTER_DEVICE_UPDATE_NONE; graphene_point_t point; @@ -710,6 +711,7 @@ update_device_for_event (ClutterStage *stage, return clutter_stage_pick_and_update_device (stage, device, sequence, + source_device, flags, point, time_ms); @@ -743,6 +745,7 @@ maybe_remove_device_for_event (ClutterStage *stage, clutter_stage_update_device (stage, device, sequence, + NULL, point, time, NULL, diff --git a/clutter/clutter/clutter-mutter.h b/clutter/clutter/clutter-mutter.h index 04efa5d86..d700b26a6 100644 --- a/clutter/clutter/clutter-mutter.h +++ b/clutter/clutter/clutter-mutter.h @@ -110,6 +110,7 @@ CLUTTER_EXPORT void clutter_stage_update_device (ClutterStage *stage, ClutterInputDevice *device, ClutterEventSequence *sequence, + ClutterInputDevice *source_device, graphene_point_t point, uint32_t time, ClutterActor *new_actor, diff --git a/clutter/clutter/clutter-stage-private.h b/clutter/clutter/clutter-stage-private.h index 677aa6ede..271e17c86 100644 --- a/clutter/clutter/clutter-stage-private.h +++ b/clutter/clutter/clutter-stage-private.h @@ -155,6 +155,7 @@ void clutter_stage_remove_device_entry (ClutterStage *self, ClutterActor * clutter_stage_pick_and_update_device (ClutterStage *stage, ClutterInputDevice *device, ClutterEventSequence *sequence, + ClutterInputDevice *source_device, ClutterDeviceUpdateFlags flags, graphene_point_t point, uint32_t time_ms); diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c index 33fda971b..b61659ce4 100644 --- a/clutter/clutter/clutter-stage.c +++ b/clutter/clutter/clutter-stage.c @@ -946,7 +946,7 @@ clutter_stage_update_devices (ClutterStage *stage, clutter_stage_pick_and_update_device (stage, device, - NULL, + NULL, NULL, CLUTTER_DEVICE_UPDATE_IGNORE_CACHE | CLUTTER_DEVICE_UPDATE_EMIT_CROSSING, entry->coords, @@ -3199,7 +3199,7 @@ clutter_stage_maybe_invalidate_focus (ClutterStage *self, clutter_stage_pick_and_update_device (self, entry->device, - NULL, + NULL, NULL, CLUTTER_DEVICE_UPDATE_IGNORE_CACHE | CLUTTER_DEVICE_UPDATE_EMIT_CROSSING, entry->coords, @@ -3217,6 +3217,7 @@ clutter_stage_maybe_invalidate_focus (ClutterStage *self, clutter_stage_pick_and_update_device (self, entry->device, entry->sequence, + NULL, CLUTTER_DEVICE_UPDATE_IGNORE_CACHE | CLUTTER_DEVICE_UPDATE_EMIT_CROSSING, entry->coords, @@ -3426,6 +3427,7 @@ static ClutterEvent * create_crossing_event (ClutterStage *stage, ClutterInputDevice *device, ClutterEventSequence *sequence, + ClutterInputDevice *source_device, ClutterEventType event_type, ClutterEventFlags flags, ClutterActor *source, @@ -3445,6 +3447,7 @@ create_crossing_event (ClutterStage *stage, event->crossing.related = related; event->crossing.sequence = sequence; clutter_event_set_device (event, device); + clutter_event_set_source_device (event, source_device); return event; } @@ -3640,6 +3643,7 @@ sync_crossings_on_implicit_grab_end (ClutterStage *self, crossing = create_crossing_event (self, entry->device, entry->sequence, + NULL, CLUTTER_ENTER, CLUTTER_EVENT_FLAG_GRAB_NOTIFY, entry->current_actor, @@ -3662,6 +3666,7 @@ void clutter_stage_update_device (ClutterStage *stage, ClutterInputDevice *device, ClutterEventSequence *sequence, + ClutterInputDevice *source_device, graphene_point_t point, uint32_t time_ms, ClutterActor *new_actor, @@ -3723,6 +3728,7 @@ clutter_stage_update_device (ClutterStage *stage, { event = create_crossing_event (stage, device, sequence, + source_device, CLUTTER_LEAVE, CLUTTER_EVENT_NONE, old_actor, new_actor, @@ -3742,6 +3748,7 @@ clutter_stage_update_device (ClutterStage *stage, { event = create_crossing_event (stage, device, sequence, + source_device, CLUTTER_ENTER, CLUTTER_EVENT_NONE, new_actor, old_actor, @@ -3768,7 +3775,7 @@ clutter_stage_repick_device (ClutterStage *stage, clutter_stage_get_device_coords (stage, device, NULL, &point); clutter_stage_pick_and_update_device (stage, device, - NULL, + NULL, NULL, CLUTTER_DEVICE_UPDATE_IGNORE_CACHE | CLUTTER_DEVICE_UPDATE_EMIT_CROSSING, point, @@ -3805,6 +3812,7 @@ ClutterActor * clutter_stage_pick_and_update_device (ClutterStage *stage, ClutterInputDevice *device, ClutterEventSequence *sequence, + ClutterInputDevice *source_device, ClutterDeviceUpdateFlags flags, graphene_point_t point, uint32_t time_ms) @@ -3834,6 +3842,7 @@ clutter_stage_pick_and_update_device (ClutterStage *stage, clutter_stage_update_device (stage, device, sequence, + source_device, point, time_ms, new_actor, @@ -4007,6 +4016,7 @@ clutter_stage_notify_grab_on_pointer_entry (ClutterStage *stage, event = create_crossing_event (stage, entry->device, entry->sequence, + NULL, event_type, CLUTTER_EVENT_FLAG_GRAB_NOTIFY, entry->current_actor,