From a60658f15e9823047f8eec9a22b9c4d659f5d35d Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Tue, 26 Oct 2021 16:21:41 +0200 Subject: [PATCH] clutter: Add parameter to control the event emission root Grabs will alter the topmost actor from where it makes sense to emit events, add infrastructure so we can tell which actor is that when emitting a ClutterEvent. Part-of: --- clutter/clutter/clutter-actor-private.h | 1 + clutter/clutter/clutter-actor.c | 20 +++++++++++++++++++- clutter/clutter/clutter-main.c | 2 +- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/clutter/clutter/clutter-actor-private.h b/clutter/clutter/clutter-actor-private.h index 54371c6dd..a803166ac 100644 --- a/clutter/clutter/clutter-actor-private.h +++ b/clutter/clutter/clutter-actor-private.h @@ -246,6 +246,7 @@ void _clutter_actor_pop_clone_paint ClutterActorAlign _clutter_actor_get_effective_x_align (ClutterActor *self); void _clutter_actor_handle_event (ClutterActor *actor, + ClutterActor *root, const ClutterEvent *event); void _clutter_actor_attach_clone (ClutterActor *actor, diff --git a/clutter/clutter/clutter-actor.c b/clutter/clutter/clutter-actor.c index 4b1c0813b..c43b8a4fb 100644 --- a/clutter/clutter/clutter-actor.c +++ b/clutter/clutter/clutter-actor.c @@ -18992,11 +18992,12 @@ clutter_actor_get_content_repeat (ClutterActor *self) void _clutter_actor_handle_event (ClutterActor *self, + ClutterActor *root, const ClutterEvent *event) { GPtrArray *event_tree; ClutterActor *iter; - gboolean is_key_event; + gboolean is_key_event, in_root = FALSE; gint i = 0; /* XXX - for historical reasons that are now lost in the mists of time, @@ -19025,9 +19026,26 @@ _clutter_actor_handle_event (ClutterActor *self, g_ptr_array_add (event_tree, g_object_ref (iter)); } + if (iter == root) + { + in_root = TRUE; + break; + } + iter = parent; } + /* The grab root conceptually extends infinitely in all + * directions, so it handles the events that fall outside of + * the actor. + */ + if (root && !in_root) + { + if (!clutter_actor_event (root, event, TRUE)) + clutter_actor_event (root, event, FALSE); + goto done; + } + /* Capture: from top-level downwards */ for (i = event_tree->len - 1; i >= 0; i--) if (clutter_actor_event (g_ptr_array_index (event_tree, i), event, TRUE)) diff --git a/clutter/clutter/clutter-main.c b/clutter/clutter/clutter-main.c index 100061923..132576e67 100644 --- a/clutter/clutter/clutter-main.c +++ b/clutter/clutter/clutter-main.c @@ -683,7 +683,7 @@ emit_event_chain (ClutterEvent *event) return; } - _clutter_actor_handle_event (event->any.source, event); + _clutter_actor_handle_event (event->any.source, NULL, event); } /*