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
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);
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);
}
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);
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
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
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);
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;
}