From 9149c79f250c03e16631262209633f9d93c3c032 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Wed, 13 May 2020 11:34:33 +0200 Subject: [PATCH] window: Restructure gtk_window_destroy() The previous code was unreffing the window twice, which caused problems during dialog destruction. Move to g_list_store_find instead of iterating manually. ref() the window before and unref() after. g_list_store_remove will actually unref() the window, since the toplevel_list owns its own reference. Fixes #2741 Fixes #2742 --- gtk/gtkwindow.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index 266aeda851..c8e51c5073 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -7483,23 +7483,19 @@ gtk_window_get_child (GtkWindow *window) void gtk_window_destroy (GtkWindow *window) { - int i; + guint i; g_return_if_fail (GTK_IS_WINDOW (window)); + /* If gtk_window_destroy() has been called before. Can happen + * when destroying a dialog manually in a ::close handler for example. */ + if (!g_list_store_find (toplevel_list, window, &i)) + return; + + g_object_ref (window); gtk_tooltip_unset_surface (GTK_NATIVE (window)); - for (i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (toplevel_list)); i++) - { - gpointer item = g_list_model_get_item (G_LIST_MODEL (toplevel_list), i); - if (item == window) - { - g_list_store_remove (toplevel_list, i); - break; - } - else - g_object_unref (item); - } + g_list_store_remove (toplevel_list, i); gtk_window_hide (GTK_WIDGET (window)); gtk_widget_unrealize (GTK_WIDGET (window));