summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErnestas Kulik <ekulik@redhat.com>2018-12-16 11:41:47 +0100
committerErnestas Kulik <ekulik@redhat.com>2019-05-27 17:01:30 +0200
commit9c5ce0dd1043ae9c0cd8e32bcbadcd2ef58b522e (patch)
tree09c5be396d63df66ee73dc71f6ca46da10262c4f
parent0c769dd6cfd5fd39a351fd9c8d41e9ad9ec2b6f4 (diff)
downloadnautilus-9c5ce0dd1043ae9c0cd8e32bcbadcd2ef58b522e.tar.gz
files-view: Stop leaking context menus
Currently, the context menus are created on the spot and attached to the view widget, which, somehow, does not mean that it will get detached after being closed. This commit makes the GtkMenu objects permanent. Fixes https://gitlab.gnome.org/GNOME/nautilus/issues/791
-rw-r--r--src/nautilus-files-view.c75
1 files changed, 49 insertions, 26 deletions
diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c
index 5b2fea566..666fcf365 100644
--- a/src/nautilus-files-view.c
+++ b/src/nautilus-files-view.c
@@ -235,8 +235,11 @@ typedef struct
GList *subdirectory_list;
- GMenu *selection_menu;
- GMenu *background_menu;
+ GMenu *selection_menu_model;
+ GMenu *background_menu_model;
+
+ GtkWidget *selection_menu;
+ GtkWidget *background_menu;
GActionGroup *view_action_group;
@@ -3253,8 +3256,8 @@ nautilus_files_view_finalize (GObject *object)
priv = nautilus_files_view_get_instance_private (view);
g_clear_object (&priv->view_action_group);
- g_clear_object (&priv->background_menu);
- g_clear_object (&priv->selection_menu);
+ g_clear_object (&priv->background_menu_model);
+ g_clear_object (&priv->selection_menu_model);
g_clear_object (&priv->toolbar_menu_sections->zoom_section);
g_clear_object (&priv->toolbar_menu_sections->extended_section);
g_clear_object (&priv->extensions_background_menu);
@@ -5019,7 +5022,7 @@ update_extensions_menus (NautilusFilesView *view)
selection_menu = build_menu_for_extension_menu_items (view, "extensions",
selection_items);
- nautilus_gmenu_merge (priv->selection_menu,
+ nautilus_gmenu_merge (priv->selection_menu_model,
selection_menu,
"extensions",
FALSE);
@@ -5032,7 +5035,7 @@ update_extensions_menus (NautilusFilesView *view)
background_menu = build_menu_for_extension_menu_items (view, "extensions",
background_items);
- nautilus_gmenu_merge (priv->background_menu,
+ nautilus_gmenu_merge (priv->background_menu_model,
background_menu,
"extensions",
FALSE);
@@ -5527,7 +5530,7 @@ update_scripts_menu (NautilusFilesView *view)
submenu = update_directory_in_scripts_menu (view, directory);
if (submenu != NULL)
{
- nautilus_gmenu_merge (priv->selection_menu,
+ nautilus_gmenu_merge (priv->selection_menu_model,
submenu,
"scripts-submenu",
TRUE);
@@ -5788,7 +5791,7 @@ update_templates_menu (NautilusFilesView *view)
submenu = update_directory_in_templates_menu (view, directory);
if (submenu != NULL)
{
- nautilus_gmenu_merge (priv->background_menu,
+ nautilus_gmenu_merge (priv->background_menu_model,
submenu,
"templates-submenu",
FALSE);
@@ -7775,7 +7778,7 @@ update_selection_menu (NautilusFilesView *view)
selection_count);
menu_item = g_menu_item_new (item_label, "view.new-folder-with-selection");
g_menu_item_set_attribute (menu_item, "hidden-when", "s", "action-disabled");
- nautilus_gmenu_add_item_in_submodel (priv->selection_menu,
+ nautilus_gmenu_add_item_in_submodel (priv->selection_menu_model,
menu_item,
"new-folder-with-selection-section",
FALSE);
@@ -7860,7 +7863,7 @@ update_selection_menu (NautilusFilesView *view)
g_menu_item_set_icon (menu_item, app_icon);
}
- nautilus_gmenu_add_item_in_submodel (priv->selection_menu,
+ nautilus_gmenu_add_item_in_submodel (priv->selection_menu_model,
menu_item,
"open-with-default-application-section",
FALSE);
@@ -7933,7 +7936,7 @@ update_selection_menu (NautilusFilesView *view)
}
menu_item = g_menu_item_new (item_label, "view.start-volume");
- nautilus_gmenu_add_item_in_submodel (priv->selection_menu,
+ nautilus_gmenu_add_item_in_submodel (priv->selection_menu_model,
menu_item,
"drive-section",
FALSE);
@@ -7977,7 +7980,7 @@ update_selection_menu (NautilusFilesView *view)
}
menu_item = g_menu_item_new (item_label, "view.stop-volume");
- nautilus_gmenu_add_item_in_submodel (priv->selection_menu,
+ nautilus_gmenu_add_item_in_submodel (priv->selection_menu_model,
menu_item,
"drive-section",
FALSE);
@@ -8008,14 +8011,14 @@ real_update_context_menus (NautilusFilesView *view)
priv = nautilus_files_view_get_instance_private (view);
builder = gtk_builder_new_from_resource ("/org/gnome/nautilus/ui/nautilus-files-view-context-menus.ui");
- g_clear_object (&priv->background_menu);
- g_clear_object (&priv->selection_menu);
+ g_clear_object (&priv->background_menu_model);
+ g_clear_object (&priv->selection_menu_model);
object = gtk_builder_get_object (builder, "background-menu");
- priv->background_menu = g_object_ref (G_MENU (object));
+ priv->background_menu_model = g_object_ref (G_MENU (object));
object = gtk_builder_get_object (builder, "selection-menu");
- priv->selection_menu = g_object_ref (G_MENU (object));
+ priv->selection_menu_model = g_object_ref (G_MENU (object));
update_selection_menu (view);
update_background_menu (view);
@@ -8121,7 +8124,6 @@ nautilus_files_view_pop_up_selection_context_menu (NautilusFilesView *view,
const GdkEvent *event)
{
NautilusFilesViewPrivate *priv;
- g_autoptr (GtkWidget) gtk_menu = NULL;
g_assert (NAUTILUS_IS_FILES_VIEW (view));
@@ -8132,11 +8134,23 @@ nautilus_files_view_pop_up_selection_context_menu (NautilusFilesView *view,
*/
update_context_menus_if_pending (view);
- gtk_menu = g_object_ref_sink (gtk_menu_new_from_model (G_MENU_MODEL (priv->selection_menu)));
- gtk_menu_attach_to_widget (GTK_MENU (gtk_menu), GTK_WIDGET (view), NULL);
+ if (NULL == priv->selection_menu)
+ {
+ priv->selection_menu = gtk_menu_new ();
+
+ gtk_menu_attach_to_widget (GTK_MENU (priv->selection_menu),
+ GTK_WIDGET (view),
+ NULL);
+ }
+
+ gtk_menu_shell_bind_model (GTK_MENU_SHELL (priv->selection_menu),
+ G_MENU_MODEL (priv->selection_menu_model),
+ NULL,
+ TRUE);
+
if (event != NULL)
{
- gtk_menu_popup_at_pointer (GTK_MENU (gtk_menu), event);
+ gtk_menu_popup_at_pointer (GTK_MENU (priv->selection_menu), event);
}
else
{
@@ -8146,7 +8160,7 @@ nautilus_files_view_pop_up_selection_context_menu (NautilusFilesView *view,
rectangle = nautilus_files_view_reveal_for_selection_context_menu (view);
g_return_if_fail (rectangle != NULL);
- gtk_menu_popup_at_rect (GTK_MENU (gtk_menu),
+ gtk_menu_popup_at_rect (GTK_MENU (priv->selection_menu),
gtk_widget_get_window (GTK_WIDGET (view)),
rectangle,
GDK_GRAVITY_SOUTH_WEST,
@@ -8167,7 +8181,6 @@ nautilus_files_view_pop_up_background_context_menu (NautilusFilesView *view,
const GdkEvent *event)
{
NautilusFilesViewPrivate *priv;
- g_autoptr (GtkWidget) gtk_menu = NULL;
g_assert (NAUTILUS_IS_FILES_VIEW (view));
@@ -8178,17 +8191,27 @@ nautilus_files_view_pop_up_background_context_menu (NautilusFilesView *view,
*/
update_context_menus_if_pending (view);
- gtk_menu = g_object_ref_sink (gtk_menu_new_from_model (G_MENU_MODEL (priv->background_menu)));
- gtk_menu_attach_to_widget (GTK_MENU (gtk_menu), GTK_WIDGET (view), NULL);
+ if (NULL == priv->background_menu)
+ {
+ priv->background_menu = gtk_menu_new ();
+
+ gtk_menu_attach_to_widget (GTK_MENU (priv->background_menu),
+ GTK_WIDGET (view),
+ NULL);
+ }
+ gtk_menu_shell_bind_model (GTK_MENU_SHELL (priv->background_menu),
+ G_MENU_MODEL (priv->background_menu_model),
+ NULL,
+ TRUE);
if (event != NULL)
{
- gtk_menu_popup_at_pointer (GTK_MENU (gtk_menu), event);
+ gtk_menu_popup_at_pointer (GTK_MENU (priv->background_menu), event);
}
else
{
/* It was triggered from the keyboard, so pop up from the center of view.
*/
- gtk_menu_popup_at_widget (GTK_MENU (gtk_menu),
+ gtk_menu_popup_at_widget (GTK_MENU (priv->background_menu),
GTK_WIDGET (view),
GDK_GRAVITY_CENTER,
GDK_GRAVITY_CENTER,