From a78f58617582520d57f4b20f8440000158eb79fd Mon Sep 17 00:00:00 2001 From: Corey Berla Date: Sun, 15 Jan 2023 15:26:35 -0800 Subject: [PATCH 1/3] star-cell: Remove unused variable --- src/nautilus-star-cell.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/nautilus-star-cell.c b/src/nautilus-star-cell.c index 9f21028089..ed6969f211 100644 --- a/src/nautilus-star-cell.c +++ b/src/nautilus-star-cell.c @@ -79,7 +79,6 @@ on_file_changed (NautilusStarCell *self) { g_autoptr (NautilusViewItem) item = NULL; NautilusFile *file; - g_autofree gchar *string = NULL; item = nautilus_view_cell_get_item (NAUTILUS_VIEW_CELL (self)); g_return_if_fail (item != NULL); -- GitLab From 47b48cb8d1b8d9252c85e814dbc305a125b0b7ec Mon Sep 17 00:00:00 2001 From: Corey Berla Date: Sun, 15 Jan 2023 15:24:30 -0800 Subject: [PATCH 2/3] view-item: Make item_ui a weak pointer view-item holds a reference for the cell and the cell holds a ref to the item. In order to break this cycle, let's make item_ui a weak pointer in view-item. The cell will get freed by the list factory. --- src/nautilus-view-item.c | 21 ++------------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/src/nautilus-view-item.c b/src/nautilus-view-item.c index 31c11e3fef..aafea37637 100644 --- a/src/nautilus-view-item.c +++ b/src/nautilus-view-item.c @@ -27,7 +27,6 @@ enum PROP_IS_CUT, PROP_DRAG_ACCEPT, PROP_IS_LOADING, - PROP_ITEM_UI, N_PROPS }; @@ -46,7 +45,7 @@ nautilus_view_item_dispose (GObject *object) { NautilusViewItem *self = NAUTILUS_VIEW_ITEM (object); - g_clear_object (&self->item_ui); + g_clear_weak_pointer (&self->item_ui); G_OBJECT_CLASS (nautilus_view_item_parent_class)->dispose (object); } @@ -101,12 +100,6 @@ nautilus_view_item_get_property (GObject *object, } break; - case PROP_ITEM_UI: - { - g_value_set_object (value, self->item_ui); - } - break; - default: { G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -154,12 +147,6 @@ nautilus_view_item_set_property (GObject *object, } break; - case PROP_ITEM_UI: - { - g_set_object (&self->item_ui, g_value_get_object (value)); - } - break; - default: { G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -204,10 +191,6 @@ nautilus_view_item_class_init (NautilusViewItemClass *klass) "", "", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); - properties[PROP_ITEM_UI] = g_param_spec_object ("item-ui", - "", "", - GTK_TYPE_WIDGET, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); g_object_class_install_properties (object_class, N_PROPS, properties); signals[FILE_CHANGED] = g_signal_new ("file-changed", @@ -295,7 +278,7 @@ nautilus_view_item_set_item_ui (NautilusViewItem *self, { g_return_if_fail (NAUTILUS_IS_VIEW_ITEM (self)); - g_object_set (self, "item-ui", item_ui, NULL); + g_set_weak_pointer (&self->item_ui, item_ui); } void -- GitLab From 109cd125a73793b99060fca6c07faf37a90e27a3 Mon Sep 17 00:00:00 2001 From: Corey Berla Date: Sun, 15 Jan 2023 15:27:25 -0800 Subject: [PATCH 3/3] general: Stop leaking NautilusViewItem We are still leaking NautilusViewItem in several places. Essentially every NautilusViewItem (and thus every NautilusFile) ever created is leaked. In list-base, the queue in real_add_files is freed, but not the items themselves. Make sure to also free the results of g_list_model_get_item() and our macro listitem_get_view_item which now calls gtk_tree_list_row_get_item. --- src/nautilus-grid-view.c | 4 ++-- src/nautilus-list-base.c | 6 ++++-- src/nautilus-list-view.c | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/nautilus-grid-view.c b/src/nautilus-grid-view.c index 7a2e2f90c1..269e570723 100644 --- a/src/nautilus-grid-view.c +++ b/src/nautilus-grid-view.c @@ -441,7 +441,7 @@ bind_cell (GtkSignalListItemFactory *factory, gpointer user_data) { GtkWidget *cell; - NautilusViewItem *item; + g_autoptr (NautilusViewItem) item = NULL; cell = gtk_list_item_get_child (listitem); item = listitem_get_view_item (listitem); @@ -475,7 +475,7 @@ unbind_cell (GtkSignalListItemFactory *factory, GtkListItem *listitem, gpointer user_data) { - NautilusViewItem *item; + g_autoptr (NautilusViewItem) item = NULL; item = listitem_get_view_item (listitem); diff --git a/src/nautilus-list-base.c b/src/nautilus-list-base.c index 46d28e8826..05385f561b 100644 --- a/src/nautilus-list-base.c +++ b/src/nautilus-list-base.c @@ -1468,7 +1468,7 @@ real_add_files (NautilusFilesView *files_view, NautilusListBase *self = NAUTILUS_LIST_BASE (files_view); NautilusListBasePrivate *priv = nautilus_list_base_get_instance_private (self); g_autoptr (GQueue) files_queue = NULL; - g_autoptr (GQueue) items = NULL; + g_autoqueue (NautilusViewItem) items = NULL; files_queue = convert_glist_to_queue (files); items = convert_files_to_items (self, files_queue); @@ -1562,6 +1562,7 @@ real_preview_selection_event (NautilusFilesView *files_view, { NautilusListBase *self = NAUTILUS_LIST_BASE (files_view); NautilusListBasePrivate *priv = nautilus_list_base_get_instance_private (self); + g_autoptr (NautilusViewItem) item = NULL; guint i; gboolean rtl = (gtk_widget_get_direction (GTK_WIDGET (self)) == GTK_TEXT_DIR_RTL); @@ -1587,7 +1588,8 @@ real_preview_selection_event (NautilusFilesView *files_view, } gtk_selection_model_select_item (GTK_SELECTION_MODEL (priv->model), i, TRUE); - set_focus_item (self, g_list_model_get_item (G_LIST_MODEL (priv->model), i)); + item = g_list_model_get_item (G_LIST_MODEL (priv->model), i); + set_focus_item (self, item); } static void diff --git a/src/nautilus-list-view.c b/src/nautilus-list-view.c index 97257bea47..92fe422506 100644 --- a/src/nautilus-list-view.c +++ b/src/nautilus-list-view.c @@ -1189,7 +1189,7 @@ bind_name_cell (GtkSignalListItemFactory *factory, { GtkWidget *cell; NautilusListView *self = user_data; - NautilusViewItem *item; + g_autoptr (NautilusViewItem) item = NULL; cell = gtk_list_item_get_child (listitem); item = listitem_get_view_item (listitem); @@ -1232,7 +1232,7 @@ unbind_name_cell (GtkSignalListItemFactory *factory, gpointer user_data) { NautilusListView *self = user_data; - NautilusViewItem *item; + g_autoptr (NautilusViewItem) item = NULL; item = listitem_get_view_item (listitem); if (item == NULL) -- GitLab