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.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user