[gtk+] gtkmenubutton: remove weak pointer when needed
- From: Paolo Borelli <pborelli src gnome org>
- To: commits-list gnome org
- Cc: 
- Subject: [gtk+] gtkmenubutton: remove weak pointer when needed
- Date: Sun,  4 Nov 2012 16:12:44 +0000 (UTC)
commit 1beb9db7b09483cf9b71be733f73d02cb7adc666
Author: Paolo Borelli <pborelli gnome org>
Date:   Sun Nov 4 16:46:35 2012 +0100
    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.
 gtk/gtkmenubutton.c |   24 ++++++++++++++++++++----
 1 files changed, 20 insertions(+), 4 deletions(-)
---
diff --git a/gtk/gtkmenubutton.c b/gtk/gtkmenubutton.c
index 5416d37..dd4a3bb 100644
--- a/gtk/gtkmenubutton.c
+++ b/gtk/gtkmenubutton.c
@@ -791,6 +791,23 @@ gtk_menu_button_get_menu_model (GtkMenuButton *menu_button)
   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:
  * @menu_button: a #GtkMenuButton
@@ -817,10 +834,7 @@ gtk_menu_button_set_align_widget (GtkMenuButton *menu_button,
   if (priv->align_widget == align_widget)
     return;
 
-  priv->align_widget = align_widget;
-
-  if (priv->align_widget)
-    g_object_add_weak_pointer (G_OBJECT (priv->align_widget), (gpointer *) &priv->align_widget);
+  set_align_widget_pointer (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;
     }
 
+  set_align_widget_pointer (GTK_MENU_BUTTON (object), NULL);
+
   g_clear_object (&priv->model);
 
   G_OBJECT_CLASS (gtk_menu_button_parent_class)->dispose (object);
[
Date Prev][
Date Next]   [
Thread Prev][
Thread Next]   
[
Thread Index]
[
Date Index]
[
Author Index]