[gtk/wip/carlosg/for-master: 2/2] gtk/main: Stack ::active calls




commit 80de00a248d3addb8b78483d5d610dec03f62cdc
Author: Carlos Garnacho <carlosg gnome org>
Date:   Fri Nov 13 00:23:52 2020 +0100

    gtk/main: Stack ::active calls
    
    We may have the situation of multiple touchpoints in the same
    widget, or combinations with other devices. Stack those ::active
    states are preserved on widgets on all but the last pointer/touch
    going away.

 gtk/gtkmain.c          |  4 ++--
 gtk/gtkwidget.c        | 26 ++++++++++++++++++++++++++
 gtk/gtkwidgetprivate.h |  5 +++++
 3 files changed, 33 insertions(+), 2 deletions(-)
---
diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c
index 96ff1e69ad..72941e8620 100644
--- a/gtk/gtkmain.c
+++ b/gtk/gtkmain.c
@@ -1362,9 +1362,9 @@ set_widget_active_state (GtkWidget       *target,
   while (w)
     {
       if (release)
-        gtk_widget_unset_state_flags (w, GTK_STATE_FLAG_ACTIVE);
+        gtk_widget_set_active_state (w, FALSE);
       else
-        gtk_widget_set_state_flags (w, GTK_STATE_FLAG_ACTIVE, FALSE);
+        gtk_widget_set_active_state (w, TRUE);
 
       w = _gtk_widget_get_parent (w);
     }
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index 861d87a0cf..b71ae1a822 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -12663,3 +12663,29 @@ gtk_widget_class_get_accessible_role (GtkWidgetClass *widget_class)
   priv = widget_class->priv;
   return priv->accessible_role;
 }
+
+void
+gtk_widget_set_active_state (GtkWidget *widget,
+                             gboolean   active)
+{
+  GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
+
+  if (active)
+    {
+      priv->n_active++;
+      gtk_widget_set_state_flags (widget, GTK_STATE_FLAG_ACTIVE, FALSE);
+    }
+  else
+    {
+      if (priv->n_active == 0)
+        {
+          g_warning ("Broken accounting of active state for widget %p(%s)",
+                     widget, G_OBJECT_TYPE_NAME (widget));
+        }
+      else
+        priv->n_active--;
+
+      if (priv->n_active == 0)
+        gtk_widget_unset_state_flags (widget, GTK_STATE_FLAG_ACTIVE);
+    }
+}
diff --git a/gtk/gtkwidgetprivate.h b/gtk/gtkwidgetprivate.h
index 761a190e1d..138f0137d9 100644
--- a/gtk/gtkwidgetprivate.h
+++ b/gtk/gtkwidgetprivate.h
@@ -115,6 +115,8 @@ struct _GtkWidgetPrivate
   guint8 verifying_invariants_count;
 #endif
 
+  guint8 n_active;
+
   int width_request;
   int height_request;
 
@@ -324,6 +326,9 @@ void              gtk_widget_get_surface_allocation         (GtkWidget *widget,
 GtkWidget *       gtk_widget_common_ancestor               (GtkWidget *widget_a,
                                                             GtkWidget *widget_b);
 
+void              gtk_widget_set_active_state              (GtkWidget *widget,
+                                                            gboolean   active);
+
 void              gtk_widget_cancel_event_sequence         (GtkWidget             *widget,
                                                             GtkGesture            *gesture,
                                                             GdkEventSequence      *sequence,


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