[mutter/wip/carlosg/grabs-pt1: 36/42] clutter: Propagate events only inside the grab




commit 7180f9ab161066e021e826da7b07dced6a50f768
Author: Carlos Garnacho <carlosg gnome org>
Date:   Wed Oct 27 00:13:35 2021 +0200

    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.

 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 9dc010b415..98f64eeb6e 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 513aadf494..14d37f20da 100644
--- a/clutter/clutter/clutter-stage.c
+++ b/clutter/clutter/clutter-stage.c
@@ -3745,3 +3745,15 @@ clutter_ungrab (ClutterGrab *grab)
 
   g_free (grab);
 }
+
+ClutterActor *
+clutter_stage_get_grab_actor (ClutterStage *stage)
+{
+  ClutterStagePrivate *priv = stage->priv;
+
+  if (!priv->grabs)
+    return NULL;
+
+  /* Return active grab */
+  return priv->grabs->actor;
+}
diff --git a/clutter/clutter/clutter-stage.h b/clutter/clutter/clutter-stage.h
index efb788e70a..e9a9ab89bf 100644
--- a/clutter/clutter/clutter-stage.h
+++ b/clutter/clutter/clutter-stage.h
@@ -269,6 +269,9 @@ ClutterActor * clutter_stage_get_device_actor (ClutterStage         *stage,
                                                ClutterInputDevice   *device,
                                                ClutterEventSequence *sequence);
 
+CLUTTER_EXPORT
+ClutterActor * clutter_stage_get_grab_actor (ClutterStage *stage);
+
 G_END_DECLS
 
 #endif /* __CLUTTER_STAGE_H__ */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]