From 94f00eb04dd1433cf1cc9a3341f485124e38abd1 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Thu, 15 Dec 2011 20:32:54 +0100 Subject: [PATCH] widget: Don't change sensitive state with insensitve parent This way child.set_sensitive(True) with an insensitive parent doesn't cause child to become sensitive. --- gtk/gtkwidget.c | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 47887470e0..7c189c4271 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -7663,7 +7663,6 @@ gtk_widget_set_sensitive (GtkWidget *widget, gboolean sensitive) { GtkWidgetPrivate *priv; - GtkStateData data; g_return_if_fail (GTK_IS_WIDGET (widget)); @@ -7674,24 +7673,30 @@ gtk_widget_set_sensitive (GtkWidget *widget, if (priv->sensitive == sensitive) return; - data.flags = GTK_STATE_FLAG_INSENSITIVE; - - if (sensitive) + if (priv->parent == NULL + || gtk_widget_is_sensitive (priv->parent)) { - priv->sensitive = TRUE; - data.operation = STATE_CHANGE_UNSET; + GtkStateData data; + + data.flags = GTK_STATE_FLAG_INSENSITIVE; + + if (sensitive) + { + priv->sensitive = TRUE; + data.operation = STATE_CHANGE_UNSET; + } + else + { + priv->sensitive = FALSE; + data.operation = STATE_CHANGE_SET; + } + + data.use_forall = TRUE; + + gtk_widget_propagate_state (widget, &data); + + gtk_widget_queue_resize (widget); } - else - { - priv->sensitive = FALSE; - data.operation = STATE_CHANGE_SET; - } - - data.use_forall = TRUE; - - gtk_widget_propagate_state (widget, &data); - - gtk_widget_queue_resize (widget); g_object_notify (G_OBJECT (widget), "sensitive"); }