[mutter/wip/carlosg/grabs-pt1: 11/17] clutter: Only emit regular crossing events in the actors they make sense




commit d45701c05420d48a8d77af7c2f276000ab734015
Author: Carlos Garnacho <carlosg gnome org>
Date:   Wed Oct 27 18:14:22 2021 +0200

    clutter: Only emit regular crossing events in the actors they make sense
    
    Instead of propagating ENTER/LEAVE all the way from the stage, emit those
    events only in the actors that are actually entered or left.

 clutter/clutter/clutter-stage.c | 34 +++++++++++++++++++++++++++++++---
 1 file changed, 31 insertions(+), 3 deletions(-)
---
diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c
index d5b483d672..991c73b1b0 100644
--- a/clutter/clutter/clutter-stage.c
+++ b/clutter/clutter/clutter-stage.c
@@ -3453,6 +3453,27 @@ common_root_actor (ClutterStage *stage,
   return CLUTTER_ACTOR (stage);
 }
 
+static ClutterActor *
+crossing_event_root (ClutterStage *stage,
+                     ClutterActor *root,
+                     ClutterActor *actor)
+{
+  if (root == actor)
+    return actor;
+
+  while (actor)
+    {
+      ClutterActor *parent;
+
+      parent = clutter_actor_get_parent (actor);
+      if (parent == root)
+        return actor;
+      actor = parent;
+    }
+
+  g_assert_not_reached ();
+}
+
 static ClutterEvent *
 create_crossing_event (ClutterStage         *stage,
                        ClutterInputDevice   *device,
@@ -3489,7 +3510,7 @@ clutter_stage_update_device (ClutterStage         *stage,
                              gboolean              emit_crossing)
 {
   ClutterInputDeviceType device_type;
-  ClutterActor *old_actor;
+  ClutterActor *old_actor, *root;
   gboolean device_actor_changed;
   ClutterEvent *event;
 
@@ -3515,6 +3536,9 @@ clutter_stage_update_device (ClutterStage         *stage,
                     point.y,
                     _clutter_actor_get_debug_name (new_actor));
 
+      if (emit_crossing)
+        root = common_root_actor (stage, new_actor, old_actor);
+
       if (old_actor && emit_crossing)
         {
           event = create_crossing_event (stage,
@@ -3522,7 +3546,9 @@ clutter_stage_update_device (ClutterStage         *stage,
                                          CLUTTER_LEAVE,
                                          old_actor, new_actor,
                                          point, time);
-          _clutter_process_event (event);
+          _clutter_actor_handle_event (old_actor,
+                                       crossing_event_root (stage, root, old_actor),
+                                       event);
           clutter_event_free (event);
         }
 
@@ -3533,7 +3559,9 @@ clutter_stage_update_device (ClutterStage         *stage,
                                          CLUTTER_ENTER,
                                          new_actor, old_actor,
                                          point, time);
-          _clutter_process_event (event);
+          _clutter_actor_handle_event (new_actor,
+                                       crossing_event_root (stage, root, new_actor),
+                                       event);
           clutter_event_free (event);
         }
     }


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