From ec3b8fe85b56f9b791506d5bd9b6dcf4d1b49250 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Wed, 27 Oct 2021 00:13:35 +0200 Subject: [PATCH] clutter: Propagate events only inside the grab The grab actor becomes the "root" of the events being handled, events inside propagate normally, but become silenced when falling outside the grab area. Part-of: --- clutter/clutter/clutter-main.c | 4 +++- clutter/clutter/clutter-stage.c | 12 ++++++++++++ clutter/clutter/clutter-stage.h | 3 +++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/clutter/clutter/clutter-main.c b/clutter/clutter/clutter-main.c index 132576e67..f80fbae9b 100644 --- a/clutter/clutter/clutter-main.c +++ b/clutter/clutter/clutter-main.c @@ -683,7 +683,9 @@ emit_event_chain (ClutterEvent *event) return; } - _clutter_actor_handle_event (event->any.source, NULL, event); + _clutter_actor_handle_event (event->any.source, + clutter_stage_get_grab_actor (event->any.stage), + event); } /* diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c index ce44b3bcc..fd280dbee 100644 --- a/clutter/clutter/clutter-stage.c +++ b/clutter/clutter/clutter-stage.c @@ -3846,3 +3846,15 @@ clutter_grab_dismiss (ClutterGrab *grab) g_free (grab); } + +ClutterActor * +clutter_stage_get_grab_actor (ClutterStage *stage) +{ + ClutterStagePrivate *priv = stage->priv; + + if (!priv->topmost_grab) + return NULL; + + /* Return active grab */ + return priv->topmost_grab->actor; +} diff --git a/clutter/clutter/clutter-stage.h b/clutter/clutter/clutter-stage.h index b45c50ccd..fc90f6910 100644 --- a/clutter/clutter/clutter-stage.h +++ b/clutter/clutter/clutter-stage.h @@ -274,6 +274,9 @@ CLUTTER_EXPORT ClutterGrab * clutter_stage_grab (ClutterStage *stage, ClutterActor *actor); +CLUTTER_EXPORT +ClutterActor * clutter_stage_get_grab_actor (ClutterStage *stage); + G_END_DECLS #endif /* __CLUTTER_STAGE_H__ */