[gtk/wip/carlosg/for-master: 2/2] gtk/main: Stack ::active calls
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/carlosg/for-master: 2/2] gtk/main: Stack ::active calls
- Date: Thu, 12 Nov 2020 23:40:01 +0000 (UTC)
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]