From 70f0cde730d29e311e5870cef482df22da2dee61 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 16 Jan 2024 06:22:43 +0100 Subject: [PATCH 1/3] tests: Fix gio API usage Related: glib!3261 --- tests/testcolumnview.c | 7 ++++++- tests/testlistview.c | 6 +++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/tests/testcolumnview.c b/tests/testcolumnview.c index 932de560aa..d97da1f879 100644 --- a/tests/testcolumnview.c +++ b/tests/testcolumnview.c @@ -119,10 +119,15 @@ row_data_update_info (RowData *data, icon = g_file_icon_new (thumbnail_file); g_object_unref (thumbnail_file); } - else + else if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_ICON)) { icon = g_file_info_get_icon (info); } + else + { + icon = NULL; + } + gtk_widget_set_visible (data->icon, icon != NULL); gtk_image_set_from_gicon (GTK_IMAGE (data->icon), icon); diff --git a/tests/testlistview.c b/tests/testlistview.c index cab7bc9a7e..f4cbd377a3 100644 --- a/tests/testlistview.c +++ b/tests/testlistview.c @@ -376,10 +376,14 @@ row_data_update_info (RowData *data, icon = g_file_icon_new (thumbnail_file); g_object_unref (thumbnail_file); } - else + else if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_ICON)) { icon = g_file_info_get_icon (info); } + else + { + icon = NULL; + } gtk_widget_set_visible (data->icon, icon != NULL); gtk_image_set_from_gicon (GTK_IMAGE (data->icon), icon); From 323adf9aa8a3025ae1c1518c1dab73f65294bb7d Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 16 Jan 2024 06:59:15 +0100 Subject: [PATCH 2/3] Revert "gtkcolumnviewcellwidget: move cleanup from dispose to unroot" This reverts commit ff262c081ef2b4bd2bcda3b52a5d8a53935ab470. This is a wrong fix because it triggers when the columnview gets unrooted but the cell keeps existing. Later, when the columnview gets re-rooted, the cell is still there but thinks it has no column. And that's bad. --- gtk/gtkcolumnviewcellwidget.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/gtk/gtkcolumnviewcellwidget.c b/gtk/gtkcolumnviewcellwidget.c index 9b9ff79050..eb3ab7835e 100644 --- a/gtk/gtkcolumnviewcellwidget.c +++ b/gtk/gtkcolumnviewcellwidget.c @@ -270,9 +270,9 @@ gtk_column_view_cell_widget_size_allocate (GtkWidget *widget, } static void -gtk_column_view_cell_widget_unroot (GtkWidget *widget) +gtk_column_view_cell_widget_dispose (GObject *object) { - GtkColumnViewCellWidget *self = GTK_COLUMN_VIEW_CELL_WIDGET (widget); + GtkColumnViewCellWidget *self = GTK_COLUMN_VIEW_CELL_WIDGET (object); if (self->column) { @@ -289,7 +289,7 @@ gtk_column_view_cell_widget_unroot (GtkWidget *widget) g_clear_object (&self->column); } - GTK_WIDGET_CLASS (gtk_column_view_cell_widget_parent_class)->unroot (widget); + G_OBJECT_CLASS (gtk_column_view_cell_widget_parent_class)->dispose (object); } static GtkSizeRequestMode @@ -308,6 +308,7 @@ gtk_column_view_cell_widget_class_init (GtkColumnViewCellWidgetClass *klass) { GtkListFactoryWidgetClass *factory_class = GTK_LIST_FACTORY_WIDGET_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); factory_class->create_object = gtk_column_view_cell_widget_create_object; factory_class->setup_object = gtk_column_view_cell_widget_setup_object; @@ -319,8 +320,8 @@ gtk_column_view_cell_widget_class_init (GtkColumnViewCellWidgetClass *klass) widget_class->measure = gtk_column_view_cell_widget_measure; widget_class->size_allocate = gtk_column_view_cell_widget_size_allocate; widget_class->get_request_mode = gtk_column_view_cell_widget_get_request_mode; - widget_class->unroot = gtk_column_view_cell_widget_unroot; + gobject_class->dispose = gtk_column_view_cell_widget_dispose; gtk_widget_class_set_css_name (widget_class, I_("cell")); gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_GRID_CELL); From 3c451b3ec77775ea16d198ccdbb96e16d707f15a Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 16 Jan 2024 07:11:02 +0100 Subject: [PATCH 3/3] columnview: Make sure cells disconnect from their column When a cell is removed from the columnview, we need to make sure it s not just removed from the cell (via unset_parent()) but also from the column. Previously, we were doing this from dispose(), but this is broken because dispose() only runs when the refcount goes to zero. But if some code still has a reference for whatever reason, this won't happen. So now we do it explicitly together with unset_parent(). --- gtk/gtkcolumnviewcellwidget.c | 18 ++++++++++++++---- gtk/gtkcolumnviewcellwidgetprivate.h | 1 + gtk/gtkcolumnviewrowwidget.c | 3 +++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/gtk/gtkcolumnviewcellwidget.c b/gtk/gtkcolumnviewcellwidget.c index eb3ab7835e..a528752ccd 100644 --- a/gtk/gtkcolumnviewcellwidget.c +++ b/gtk/gtkcolumnviewcellwidget.c @@ -269,11 +269,12 @@ gtk_column_view_cell_widget_size_allocate (GtkWidget *widget, } } -static void -gtk_column_view_cell_widget_dispose (GObject *object) +/* This should be to be called when unsetting the parent, but we have no + * set_parent vfunc(). + */ +void +gtk_column_view_cell_widget_unset_column (GtkColumnViewCellWidget *self) { - GtkColumnViewCellWidget *self = GTK_COLUMN_VIEW_CELL_WIDGET (object); - if (self->column) { gtk_column_view_column_remove_cell (self->column, self); @@ -288,6 +289,15 @@ gtk_column_view_cell_widget_dispose (GObject *object) g_clear_object (&self->column); } +} + +static void +gtk_column_view_cell_widget_dispose (GObject *object) +{ + GtkColumnViewCellWidget *self = GTK_COLUMN_VIEW_CELL_WIDGET (object); + + /* unset_parent() forgot to call this. Be very angry. */ + g_warn_if_fail (self->column == NULL); G_OBJECT_CLASS (gtk_column_view_cell_widget_parent_class)->dispose (object); } diff --git a/gtk/gtkcolumnviewcellwidgetprivate.h b/gtk/gtkcolumnviewcellwidgetprivate.h index 57632adf9b..51d0cd2679 100644 --- a/gtk/gtkcolumnviewcellwidgetprivate.h +++ b/gtk/gtkcolumnviewcellwidgetprivate.h @@ -46,5 +46,6 @@ void gtk_column_view_cell_widget_remove ( GtkColumnViewCellWidget * gtk_column_view_cell_widget_get_next (GtkColumnViewCellWidget *self); GtkColumnViewCellWidget * gtk_column_view_cell_widget_get_prev (GtkColumnViewCellWidget *self); GtkColumnViewColumn * gtk_column_view_cell_widget_get_column (GtkColumnViewCellWidget *self); +void gtk_column_view_cell_widget_unset_column (GtkColumnViewCellWidget *self); G_END_DECLS diff --git a/gtk/gtkcolumnviewrowwidget.c b/gtk/gtkcolumnviewrowwidget.c index 3febbf813c..4254fb2694 100644 --- a/gtk/gtkcolumnviewrowwidget.c +++ b/gtk/gtkcolumnviewrowwidget.c @@ -592,6 +592,9 @@ void gtk_column_view_row_widget_remove_child (GtkColumnViewRowWidget *self, GtkWidget *child) { + if (GTK_IS_COLUMN_VIEW_CELL_WIDGET (child)) + gtk_column_view_cell_widget_unset_column (GTK_COLUMN_VIEW_CELL_WIDGET (child)); + gtk_widget_unparent (child); }