[empathy: 1/2] Fix leaked GtkMenu
- From: Xavier Claessens <xclaesse src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [empathy: 1/2] Fix leaked GtkMenu
- Date: Wed, 10 Feb 2010 19:14:58 +0000 (UTC)
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]