]> git.0d.be Git - empathy.git/commitdiff
Fix leaked GtkMenu
authorXavier Claessens <xclaesse@gmail.com>
Wed, 10 Feb 2010 17:51:53 +0000 (18:51 +0100)
committerXavier Claessens <xclaesse@gmail.com>
Wed, 10 Feb 2010 19:14:20 +0000 (20:14 +0100)
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
libempathy-gtk/empathy-contact-menu.c
libempathy-gtk/empathy-contact-widget.c
libempathy-gtk/empathy-theme-adium.c
src/empathy-debug-window.c
src/empathy-map-view.c

index 958aaf0fd4befdc7bcc8c583b27ef59051ec58ba..0ed24bdf8c292535f3cccfa13bec741213971623 100644 (file)
@@ -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);
 }
index 3fdaf6d4bbd957e551487e342ef6495afdae4b19..3d194fced1897270b28e4a34697bf26b2eb2f3bd 100644 (file)
@@ -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);
index 3e8ed843075b8a0636090cf9820ca209ce71ae44..f55e814051e2292f4b5aa4684fc09c1c1aab0bf1 100644 (file)
@@ -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
index 62734ff93fa1710df7438dc43693bdbbc3f56786..5c67af8571a89ad4c8f76a40dbf7eaf0ee037e31 100644 (file)
@@ -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
index e411fcd731a177441224fc4c5d69a57f89f557da..da2c0e079810c00cc69730efe8f7434b9d2ba3f8 100644 (file)
@@ -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);
 
index b7b37549f8cd9eb313aac944feba783d0949e8b1..fd6106c95ef9c632eaa60e8926130d7c8dc7602f 100644 (file)
@@ -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;
 }