diff --git a/gtk/gtkstack.c b/gtk/gtkstack.c index 7752689991..e1e4f3b444 100644 --- a/gtk/gtkstack.c +++ b/gtk/gtkstack.c @@ -141,6 +141,8 @@ typedef struct { gint last_visible_widget_height; GtkStackTransitionType active_transition_type; + + gboolean destroying; } GtkStackPrivate; static GParamSpec *stack_props[LAST_PROP] = { NULL, }; @@ -174,6 +176,7 @@ static void gtk_stack_get_preferred_width_for_height (GtkWidget *widget, gint height, gint *minimum_width, gint *natural_width); +static void gtk_stack_destroy (GtkWidget *widget); static void gtk_stack_finalize (GObject *obj); static void gtk_stack_get_property (GObject *object, guint property_id, @@ -399,6 +402,7 @@ gtk_stack_class_init (GtkStackClass *klass) widget_class->get_preferred_width = gtk_stack_get_preferred_width; widget_class->get_preferred_width_for_height = gtk_stack_get_preferred_width_for_height; widget_class->compute_expand = gtk_stack_compute_expand; + widget_class->destroy = gtk_stack_destroy; container_class->add = gtk_stack_add; container_class->remove = gtk_stack_remove; @@ -1012,6 +1016,11 @@ set_visible_child (GtkStack *stack, GtkWidget *focus; gboolean contains_focus = FALSE; + /* if we are being destroyed, do not bother with transitions + * and notifications */ + if (priv->destroying) + return; + /* If none, pick first visible */ if (child_info == NULL) { @@ -1842,6 +1851,17 @@ gtk_stack_compute_expand (GtkWidget *widget, *vexpand_p = vexpand; } +static void +gtk_stack_destroy (GtkWidget *widget) +{ + GtkStack *stack = GTK_STACK (widget); + GtkStackPrivate *priv = gtk_stack_get_instance_private (stack); + + priv->destroying = TRUE; + + GTK_WIDGET_CLASS (gtk_stack_parent_class)->destroy (widget); +} + static void gtk_stack_draw_crossfade (GtkWidget *widget, cairo_t *cr)