From 677bfe6857869de90ca2f68302ec9b49e61be2e8 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 20 Jun 2020 08:48:29 -0400 Subject: [PATCH 1/4] gtk-demo: Clean up initial selection handling We call selection_cb now, so we don't need to manually do part of what that call does ahead of time. This should have been noticed in 10bcbae68c3faf8ae. --- demos/gtk-demo/main.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/demos/gtk-demo/main.c b/demos/gtk-demo/main.c index f0a3f78efb..f727233353 100644 --- a/demos/gtk-demo/main.c +++ b/demos/gtk-demo/main.c @@ -1035,8 +1035,6 @@ activate (GApplication *app) listview = GTK_WIDGET (gtk_builder_get_object (builder, "listview")); g_signal_connect (listview, "activate", G_CALLBACK (activate_cb), window); - load_file (gtk_demos[0].name, gtk_demos[0].filename); - listmodel = create_demo_model (); treemodel = gtk_tree_list_model_new (FALSE, G_LIST_MODEL (listmodel), From 7c2d21892fca112cbb4c1744460adff5f3661571 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sat, 20 Jun 2020 12:08:46 -0400 Subject: [PATCH 2/4] gridview: Compute right amount of items to skip We only want to skip the remaining items in the current row, not since the start of the widget. --- gtk/gtkgridview.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gtk/gtkgridview.c b/gtk/gtkgridview.c index 5531b5c53c..b9c2c9a87c 100644 --- a/gtk/gtkgridview.c +++ b/gtk/gtkgridview.c @@ -269,7 +269,8 @@ gtk_grid_view_get_cell_at_y (GtkGridView *self, /* skip remaining items at end of row */ if (pos % self->n_columns) { - skip = pos - pos % self->n_columns; + skip = self->n_columns - pos % self->n_columns; + g_assert (n_items > skip); n_items -= skip; pos += skip; } From 2842030e59692e7e943c6db246485711e02e3883 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 20 Jun 2020 12:11:59 -0400 Subject: [PATCH 3/4] gridview: Don't assert on a condition that can happen We are currently not robust against model changes or widget invalidations, so we can actually end up in situations where we run out of items here. Handle the failure a bit more gracefully, by returning NULL. This is good enough to make scrolling work okish most of the time. We still need a proper fix to handle other situations. --- gtk/gtkgridview.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/gtk/gtkgridview.c b/gtk/gtkgridview.c index b9c2c9a87c..5b2a381c69 100644 --- a/gtk/gtkgridview.c +++ b/gtk/gtkgridview.c @@ -270,7 +270,17 @@ gtk_grid_view_get_cell_at_y (GtkGridView *self, if (pos % self->n_columns) { skip = self->n_columns - pos % self->n_columns; - g_assert (n_items > skip); + if (n_items <= skip) + { + g_warning ("ran out of items"); + if (position) + *position = 0; + if (offset) + *offset = 0; + if (size) + *size = 0; + return NULL; + } n_items -= skip; pos += skip; } From 3fab2b55ccd43111f0ab8f839d03de5ebd75beda Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 20 Jun 2020 12:18:17 -0400 Subject: [PATCH 4/4] gtk-demo: Clean up memory handling in the weather demo gtk_weather_info_new was consuming the info, but not the timestamp, which confused me. Make it not consume either, and be more explicit about where the unrefs happen. --- demos/gtk-demo/listview_weather.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/demos/gtk-demo/listview_weather.c b/demos/gtk-demo/listview_weather.c index c373e43686..4fa83721f4 100644 --- a/demos/gtk-demo/listview_weather.c +++ b/demos/gtk-demo/listview_weather.c @@ -70,7 +70,6 @@ gtk_weather_info_new (GDateTime *timestamp, { result->temperature = copy_from->temperature; result->weather_type = copy_from->weather_type; - g_object_unref (copy_from); } return result; @@ -161,6 +160,7 @@ create_weather_model (void) timestamp = g_date_time_new (utc, 2011, 1, 1, 0, 0, 0); info = gtk_weather_info_new (timestamp, NULL); g_list_store_append (store, info); + g_object_unref (info); for (i = 0; lines[i] != NULL && *lines[i]; i++) { @@ -176,6 +176,7 @@ create_weather_model (void) timestamp = new_timestamp; info = gtk_weather_info_new (timestamp, info); g_list_store_append (store, info); + g_object_unref (info); } info->temperature = parse_temperature (fields[1], info->temperature); @@ -184,6 +185,7 @@ create_weather_model (void) g_strfreev (fields); } + g_date_time_unref (timestamp); g_strfreev (lines); g_bytes_unref (data); g_time_zone_unref (utc);