aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXavier Claessens <xclaesse@gmail.com>2010-02-11 01:51:53 +0800
committerXavier Claessens <xclaesse@gmail.com>2010-02-11 03:14:20 +0800
commit41f9f0a717f8519cf8c69cb043198980fe503ebc (patch)
tree3cff33d8c48cc69a2778f27f56b15372416decba
parentddbfc6ec6a3b2ffab1f83471dbf1f82630292f8a (diff)
downloadgsoc2013-empathy-41f9f0a717f8519cf8c69cb043198980fe503ebc.tar
gsoc2013-empathy-41f9f0a717f8519cf8c69cb043198980fe503ebc.tar.gz
gsoc2013-empathy-41f9f0a717f8519cf8c69cb043198980fe503ebc.tar.bz2
gsoc2013-empathy-41f9f0a717f8519cf8c69cb043198980fe503ebc.tar.lz
gsoc2013-empathy-41f9f0a717f8519cf8c69cb043198980fe503ebc.tar.xz
gsoc2013-empathy-41f9f0a717f8519cf8c69cb043198980fe503ebc.tar.zst
gsoc2013-empathy-41f9f0a717f8519cf8c69cb043198980fe503ebc.zip
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
-rw-r--r--libempathy-gtk/empathy-contact-list-view.c4
-rw-r--r--libempathy-gtk/empathy-contact-menu.c1
-rw-r--r--libempathy-gtk/empathy-contact-widget.c3
-rw-r--r--libempathy-gtk/empathy-theme-adium.c2
-rw-r--r--src/empathy-debug-window.c2
-rw-r--r--src/empathy-map-view.c2
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 958aaf0fd..0ed24bdf8 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 3fdaf6d4b..3d194fced 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 3e8ed8430..f55e81405 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 62734ff93..5c67af857 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 e411fcd73..da2c0e079 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 b7b37549f..fd6106c95 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;
}