[gtk/wip/baedert/for-master] window: Restructure gtk_window_destroy()
- From: Timm Bäder <baedert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/baedert/for-master] window: Restructure gtk_window_destroy()
- Date: Wed, 13 May 2020 10:20:44 +0000 (UTC)
commit 9149c79f250c03e16631262209633f9d93c3c032
Author: Timm Bäder <mail baedert org>
Date: Wed May 13 11:34:33 2020 +0200
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));
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]