[mutter/wip/carlosg/grabs-pt1: 48/59] clutter: Add parameter to control the event emission root
- From: Marge Bot <marge-bot src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/wip/carlosg/grabs-pt1: 48/59] clutter: Add parameter to control the event emission root
- Date: Tue, 11 Jan 2022 16:13:45 +0000 (UTC)
commit a60658f15e9823047f8eec9a22b9c4d659f5d35d
Author: Carlos Garnacho <carlosg gnome org>
Date: Tue Oct 26 16:21:41 2021 +0200
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: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2068>
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 54371c6dde..a803166ace 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 4b1c0813ba..c43b8a4fb5 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 100061923b..132576e67c 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);
}
/*
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]