[mutter] clutter/actor: Make has_pointer a counter instead of a bool



commit f4416fa662c13c2e1077c2abc3e1d4d0c84a1930
Author: Jonas Dreßler <verdre v0yd nl>
Date:   Wed May 11 15:29:12 2022 +0200

    clutter/actor: Make has_pointer a counter instead of a bool
    
    Somewhat long overdue... We've been supporting more than a single
    pointer for quite a long time now, let's make sure things don't break if
    two pointer devices enter the same ClutterActor: Count the number of
    pointers an actor has instead of using a simple boolean value.
    
    Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2348>

 clutter/clutter/clutter-actor.c | 28 +++++++++++++++++++---------
 1 file changed, 19 insertions(+), 9 deletions(-)
---
diff --git a/clutter/clutter/clutter-actor.c b/clutter/clutter/clutter-actor.c
index 51a8868cc8..502e0a7f36 100644
--- a/clutter/clutter/clutter-actor.c
+++ b/clutter/clutter/clutter-actor.c
@@ -808,6 +808,8 @@ struct _ClutterActorPrivate
   GList *stage_views;
   GList *grabs;
 
+  unsigned int n_pointers;
+
   /* bitfields: KEEP AT THE END */
 
   /* fixed position and sizes */
@@ -827,7 +829,6 @@ struct _ClutterActorPrivate
   guint clip_to_allocation          : 1;
   guint enable_model_view_transform : 1;
   guint enable_paint_unmapped       : 1;
-  guint has_pointer                 : 1;
   guint has_key_focus               : 1;
   guint propagated_one_redraw       : 1;
   guint paint_volume_valid          : 1;
@@ -1708,7 +1709,7 @@ clutter_actor_real_unmap (ClutterActor *self)
    */
   g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_MAPPED]);
 
-  if (priv->has_pointer)
+  if (priv->n_pointers > 0)
     {
       ClutterActor *stage = _clutter_actor_get_stage_internal (self);
 
@@ -5426,7 +5427,7 @@ clutter_actor_get_property (GObject    *object,
       break;
 
     case PROP_HAS_POINTER:
-      g_value_set_boolean (value, priv->has_pointer);
+      g_value_set_boolean (value, priv->n_pointers > 0);
       break;
 
     case PROP_LAYOUT_MANAGER:
@@ -12485,7 +12486,7 @@ clutter_actor_set_reactive (ClutterActor *actor,
 
   g_object_notify_by_pspec (G_OBJECT (actor), obj_props[PROP_REACTIVE]);
 
-  if (!CLUTTER_ACTOR_IS_REACTIVE (actor) && priv->has_pointer)
+  if (!CLUTTER_ACTOR_IS_REACTIVE (actor) && priv->n_pointers > 0)
     {
       ClutterActor *stage = _clutter_actor_get_stage_internal (actor);
 
@@ -12508,7 +12509,7 @@ clutter_actor_set_reactive (ClutterActor *actor,
           parent = parent->priv->parent;
         }
 
-      if (parent && parent->priv->has_pointer)
+      if (parent && parent->priv->n_pointers > 0)
         {
           ClutterActor *stage = _clutter_actor_get_stage_internal (actor);
 
@@ -14716,12 +14717,21 @@ _clutter_actor_set_has_pointer (ClutterActor *self,
 {
   ClutterActorPrivate *priv = self->priv;
 
-  if (priv->has_pointer != has_pointer)
+  if (has_pointer)
+    {
+      g_assert (CLUTTER_IS_STAGE (self) || CLUTTER_ACTOR_IS_MAPPED (self));
+
+      priv->n_pointers++;
+    }
+  else
     {
-      priv->has_pointer = has_pointer;
+      g_assert (priv->n_pointers > 0);
 
-      g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_HAS_POINTER]);
+      priv->n_pointers--;
     }
+
+  if (priv->n_pointers == 0 || priv->n_pointers == 1)
+    g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_HAS_POINTER]);
 }
 
 void
@@ -14792,7 +14802,7 @@ clutter_actor_has_pointer (ClutterActor *self)
 {
   g_return_val_if_fail (CLUTTER_IS_ACTOR (self), FALSE);
 
-  return self->priv->has_pointer;
+  return self->priv->n_pointers > 0;
 }
 
 /**


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