[empathy: 1/2] Fix leaked GtkMenu



commit 41f9f0a717f8519cf8c69cb043198980fe503ebc
Author: Xavier Claessens <xclaesse gmail com>
Date:   Wed Feb 10 18:51:53 2010 +0100

    Fix leaked GtkMenu
    
    GtkMenu is initially unowned, which means ref_count is 1 and floating flag is set.
    gtk_menu_popup temporarily adds a ref, that will be dropped when the menu is popped
    down. So once the menu is popped up, we call g_object_ref_sink() to clear the floating
    flag, and g_object_unref() to drop the initial ref. Only the ref from gtk_menu_popup
    stay, and the menu will be finalized when it is popped down.
    
    Fixes bug #609567

 libempathy-gtk/empathy-contact-list-view.c |    4 ++++
 libempathy-gtk/empathy-contact-menu.c      |    1 -
 libempathy-gtk/empathy-contact-widget.c    |    3 ++-
 libempathy-gtk/empathy-theme-adium.c       |    2 ++
 src/empathy-debug-window.c                 |    2 ++
 src/empathy-map-view.c                     |    2 ++
 6 files changed, 12 insertions(+), 2 deletions(-)
---
diff --git a/libempathy-gtk/empathy-contact-list-view.c b/libempathy-gtk/empathy-contact-list-view.c
index 958aaf0..0ed24bd 100644
--- a/libempathy-gtk/empathy-contact-list-view.c
+++ b/libempathy-gtk/empathy-contact-list-view.c
@@ -683,6 +683,8 @@ contact_list_view_popup_menu_idle_cb (gpointer user_data)
 		gtk_menu_popup (GTK_MENU (menu),
 				NULL, NULL, NULL, NULL,
 				data->button, data->time);
+		g_object_ref_sink (menu);
+		g_object_unref (menu);
 	}
 
 	g_slice_free (MenuPopupData, data);
@@ -795,6 +797,8 @@ contact_list_view_call_activated_cb (
 	gtk_widget_show (menu);
 	gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL,
 			event->button, event->time);
+	g_object_ref_sink (menu);
+	g_object_unref (menu);
 
 	g_object_unref (contact);
 }
diff --git a/libempathy-gtk/empathy-contact-menu.c b/libempathy-gtk/empathy-contact-menu.c
index 3fdaf6d..3d194fc 100644
--- a/libempathy-gtk/empathy-contact-menu.c
+++ b/libempathy-gtk/empathy-contact-menu.c
@@ -475,7 +475,6 @@ room_sub_menu_data_new (EmpathyContact *contact,
 static void
 room_sub_menu_data_free (RoomSubMenuData *data)
 {
-	/* FIXME: seems this is never called... */
 	g_object_unref (data->contact);
 	g_object_unref (data->chatroom);
 	g_slice_free (RoomSubMenuData, data);
diff --git a/libempathy-gtk/empathy-contact-widget.c b/libempathy-gtk/empathy-contact-widget.c
index 3e8ed84..f55e814 100644
--- a/libempathy-gtk/empathy-contact-widget.c
+++ b/libempathy-gtk/empathy-contact-widget.c
@@ -826,9 +826,10 @@ popup_avatar_menu (EmpathyContactWidget *information,
       event_time = gtk_get_current_event_time ();
     }
 
-  gtk_menu_attach_to_widget (GTK_MENU (menu), parent, NULL);
   gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL,
       button, event_time);
+  g_object_ref_sink (menu);
+  g_object_unref (menu);
 }
 
 static gboolean
diff --git a/libempathy-gtk/empathy-theme-adium.c b/libempathy-gtk/empathy-theme-adium.c
index 62734ff..5c67af8 100644
--- a/libempathy-gtk/empathy-theme-adium.c
+++ b/libempathy-gtk/empathy-theme-adium.c
@@ -842,6 +842,8 @@ theme_adium_context_menu_for_event (EmpathyThemeAdium *theme, GdkEventButton *ev
 	gtk_widget_show_all (menu);
 	gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL,
 			event->button, event->time);
+	g_object_ref_sink (menu);
+	g_object_unref (menu);
 }
 
 static gboolean
diff --git a/src/empathy-debug-window.c b/src/empathy-debug-window.c
index e411fcd..da2c0e0 100644
--- a/src/empathy-debug-window.c
+++ b/src/empathy-debug-window.c
@@ -889,6 +889,8 @@ debug_window_show_menu (gpointer user_data)
 
   gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL,
      data->button, data->time);
+  g_object_ref_sink (menu);
+  g_object_unref (menu);
 
   g_slice_free (MenuPopupData, user_data);
 
diff --git a/src/empathy-map-view.c b/src/empathy-map-view.c
index b7b3754..fd6106c 100644
--- a/src/empathy-map-view.c
+++ b/src/empathy-map-view.c
@@ -175,6 +175,8 @@ marker_clicked_cb (ChamplainMarker *marker,
   gtk_widget_show (menu);
   gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL,
       event->button, event->time);
+  g_object_ref_sink (menu);
+  g_object_unref (menu);
 
   return FALSE;
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]