gtkmenubutton: remove weak pointer when needed

We must make sure to remove the weak pointer when disposing the widget
or when resetting the align widget otherwise glib will try to nullify
invalid memory.
This commit is contained in:
Paolo Borelli 2012-11-04 16:46:35 +01:00
parent 5830363787
commit 1beb9db7b0

View File

@ -791,6 +791,23 @@ gtk_menu_button_get_menu_model (GtkMenuButton *menu_button)
return menu_button->priv->model; return menu_button->priv->model;
} }
static void
set_align_widget_pointer (GtkMenuButton *menu_button,
GtkWidget *align_widget)
{
GtkMenuButtonPrivate *priv;
priv = menu_button->priv;
if (priv->align_widget)
g_object_remove_weak_pointer (G_OBJECT (priv->align_widget), (gpointer *) &priv->align_widget);
priv->align_widget = align_widget;
if (align_widget)
g_object_add_weak_pointer (G_OBJECT (priv->align_widget), (gpointer *) &priv->align_widget);
}
/** /**
* gtk_menu_button_set_align_widget: * gtk_menu_button_set_align_widget:
* @menu_button: a #GtkMenuButton * @menu_button: a #GtkMenuButton
@ -817,10 +834,7 @@ gtk_menu_button_set_align_widget (GtkMenuButton *menu_button,
if (priv->align_widget == align_widget) if (priv->align_widget == align_widget)
return; return;
priv->align_widget = align_widget; set_align_widget_pointer (menu_button, align_widget);
if (priv->align_widget)
g_object_add_weak_pointer (G_OBJECT (priv->align_widget), (gpointer *) &priv->align_widget);
g_object_notify (G_OBJECT (menu_button), "align-widget"); g_object_notify (G_OBJECT (menu_button), "align-widget");
} }
@ -914,6 +928,8 @@ gtk_menu_button_dispose (GObject *object)
priv->popup = NULL; priv->popup = NULL;
} }
set_align_widget_pointer (GTK_MENU_BUTTON (object), NULL);
g_clear_object (&priv->model); g_clear_object (&priv->model);
G_OBJECT_CLASS (gtk_menu_button_parent_class)->dispose (object); G_OBJECT_CLASS (gtk_menu_button_parent_class)->dispose (object);