diff options
Diffstat (limited to 'gtk/gtkwidget.c')
-rw-r--r-- | gtk/gtkwidget.c | 38 |
1 files changed, 15 insertions, 23 deletions
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 480b3ce2e0..e6741e45de 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -7561,36 +7561,28 @@ static void gtk_widget_propagate_state (GtkWidget *widget, GtkStateData *data) { - guint8 old_state; + guint8 old_state = GTK_WIDGET_STATE (widget); + guint8 old_saved_state = GTK_WIDGET_SAVED_STATE (widget); /* don't call this function with state==GTK_STATE_INSENSITIVE, * parent_sensitive==TRUE on a sensitive widget */ - old_state = GTK_WIDGET_STATE (widget); if (data->parent_sensitive) - { - GTK_WIDGET_SET_FLAGS (widget, GTK_PARENT_SENSITIVE); + GTK_WIDGET_SET_FLAGS (widget, GTK_PARENT_SENSITIVE); + else + GTK_WIDGET_UNSET_FLAGS (widget, GTK_PARENT_SENSITIVE); - if (GTK_WIDGET_IS_SENSITIVE (widget)) - { - if (data->state_restoration) - GTK_WIDGET_STATE (widget) = GTK_WIDGET_SAVED_STATE (widget); - else - GTK_WIDGET_STATE (widget) = data->state; - } + if (GTK_WIDGET_IS_SENSITIVE (widget)) + { + if (data->state_restoration) + GTK_WIDGET_STATE (widget) = GTK_WIDGET_SAVED_STATE (widget); else - { - GTK_WIDGET_STATE (widget) = GTK_STATE_INSENSITIVE; - if (!data->state_restoration && - data->state != GTK_STATE_INSENSITIVE) - GTK_WIDGET_SAVED_STATE (widget) = data->state; - } + GTK_WIDGET_STATE (widget) = data->state; } else { - GTK_WIDGET_UNSET_FLAGS (widget, GTK_PARENT_SENSITIVE); if (!data->state_restoration) { if (data->state != GTK_STATE_INSENSITIVE) @@ -7610,19 +7602,19 @@ gtk_widget_propagate_state (GtkWidget *widget, gtk_window_set_focus (GTK_WINDOW (window), NULL); } - if (old_state != GTK_WIDGET_STATE (widget)) + if (old_state != GTK_WIDGET_STATE (widget) || + old_saved_state != GTK_WIDGET_SAVED_STATE (widget)) { g_object_ref (widget); - + if (!GTK_WIDGET_IS_SENSITIVE (widget) && GTK_WIDGET_HAS_GRAB (widget)) gtk_grab_remove (widget); - + g_signal_emit (widget, widget_signals[STATE_CHANGED], 0, old_state); - + if (GTK_IS_CONTAINER (widget)) { data->parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget) != FALSE); - data->state = GTK_WIDGET_STATE (widget); if (data->use_forall) gtk_container_forall (GTK_CONTAINER (widget), (GtkCallback) gtk_widget_propagate_state, |