]> Pileus Git - ~andy/gtk/commitdiff
widget: Get rid of parent_sensitive flag
authorBenjamin Otte <otte@redhat.com>
Wed, 30 Mar 2011 14:15:21 +0000 (16:15 +0200)
committerBenjamin Otte <otte@redhat.com>
Wed, 30 Mar 2011 14:40:06 +0000 (16:40 +0200)
Instead rely on state_flags & GTK_STATE_FLAG_INSENSITIVE to tell us if a
widget is sensitive.
This has the huge benefit that the way the widget is actually rendered
corresponds to the return value of gtk_widget_is_sensitive().

As a side effect, we do not ever allow unsetting the
GTK_STATE_FLAG_INSENSITIVE for a widget the is set to not be sensitive
(via gtk_widget_set_sensitive()). This way we stop propagation of making
stuff sensitive at insensitive widgets.

https://bugzilla.gnome.org/show_bug.cgi?id=642918

gtk/gtkwidget.c

index 46c9526b6f00ee169aeba8d05e53640b65cdf1e9..b39bb2148694aed59e4c5b273554711d0677947a 100644 (file)
@@ -321,7 +321,6 @@ struct _GtkWidgetPrivate
   guint mapped                : 1;
   guint visible               : 1;
   guint sensitive             : 1;
-  guint parent_sensitive      : 1;
   guint can_focus             : 1;
   guint has_focus             : 1;
   guint can_default           : 1;
@@ -524,7 +523,6 @@ struct _GtkStateData
 {
   guint         flags : 6;
   guint         operation : 2;
-  guint         parent_sensitive : 1;
   guint                use_forall : 1;
 };
 
@@ -3514,7 +3512,6 @@ gtk_widget_init (GtkWidget *widget)
   priv->parent = NULL;
 
   priv->sensitive = TRUE;
-  priv->parent_sensitive = TRUE;
   priv->composite_child = composite_child_stack != 0;
   priv->double_buffered = TRUE;
   priv->redraw_on_alloc = TRUE;
@@ -6997,11 +6994,6 @@ _gtk_widget_update_state_flags (GtkWidget     *widget,
       data.operation = operation;
       data.use_forall = FALSE;
 
-      if (priv->parent)
-       data.parent_sensitive = (gtk_widget_is_sensitive (priv->parent) != FALSE);
-      else
-       data.parent_sensitive = TRUE;
-
       gtk_widget_propagate_state (widget, &data);
 
       gtk_widget_queue_resize (widget);
@@ -7088,9 +7080,6 @@ gtk_widget_get_state_flags (GtkWidget *widget)
 
   flags = widget->priv->state_flags;
 
-  if (!gtk_widget_is_sensitive (widget))
-    flags |= GTK_STATE_FLAG_INSENSITIVE;
-
   if (gtk_widget_has_focus (widget))
     flags |= GTK_STATE_FLAG_FOCUSED;
 
@@ -7600,11 +7589,6 @@ gtk_widget_set_sensitive (GtkWidget *widget,
 
   data.use_forall = TRUE;
 
-  if (priv->parent)
-    data.parent_sensitive = gtk_widget_is_sensitive (priv->parent);
-  else
-    data.parent_sensitive = TRUE;
-
   gtk_widget_propagate_state (widget, &data);
 
   gtk_widget_queue_resize (widget);
@@ -7650,7 +7634,7 @@ gtk_widget_is_sensitive (GtkWidget *widget)
 {
   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
 
-  return widget->priv->sensitive && widget->priv->parent_sensitive;
+  return !(widget->priv->state_flags & GTK_STATE_FLAG_INSENSITIVE);
 }
 
 static void
@@ -7720,7 +7704,6 @@ gtk_widget_set_parent (GtkWidget *widget,
   data.flags |= priv->state_flags;
 
   data.operation = STATE_CHANGE_REPLACE;
-  data.parent_sensitive = (gtk_widget_is_sensitive (parent) != FALSE);
   data.use_forall = gtk_widget_is_sensitive (parent) != gtk_widget_is_sensitive (widget);
   gtk_widget_propagate_state (widget, &data);
 
@@ -11178,11 +11161,6 @@ gtk_widget_propagate_state (GtkWidget    *widget,
 
   old_state = gtk_widget_get_state (widget);
 
-  if (!priv->parent_sensitive)
-    old_flags |= GTK_STATE_FLAG_INSENSITIVE;
-
-  priv->parent_sensitive = data->parent_sensitive;
-
   switch (data->operation)
     {
     case STATE_CHANGE_REPLACE:
@@ -11196,6 +11174,10 @@ gtk_widget_propagate_state (GtkWidget    *widget,
       break;
     }
 
+  /* make insensitivity unoverridable */
+  if (!priv->sensitive)
+    priv->state_flags |= GTK_STATE_FLAG_INSENSITIVE;
+
   if (gtk_widget_is_focus (widget) && !gtk_widget_is_sensitive (widget))
     {
       GtkWidget *window;
@@ -11206,7 +11188,7 @@ gtk_widget_propagate_state (GtkWidget    *widget,
         gtk_window_set_focus (GTK_WINDOW (window), NULL);
     }
 
-  new_flags = gtk_widget_get_state_flags (widget);
+  new_flags = priv->state_flags;
 
   if (old_flags != new_flags)
     {
@@ -11258,8 +11240,6 @@ gtk_widget_propagate_state (GtkWidget    *widget,
         {
           GtkStateData child_data = *data;
 
-          child_data.parent_sensitive = gtk_widget_is_sensitive (widget);
-
           /* Do not propagate focused state further */
           child_data.flags &= ~GTK_STATE_FLAG_FOCUSED;