[gtk/window-destroy: 2/18] Stop using gtk_widget_destroyed



commit 99c936107fa5b8dc26073302feb5a9810eed1780
Author: Matthias Clasen <mclasen redhat com>
Date:   Sat May 9 12:03:11 2020 -0400

    Stop using gtk_widget_destroyed
    
    Replace all internal use of gtk_widget_destroyed
    by g_object_add_weak_pointer.

 demos/gtk-demo/assistant.c             |   3 +-
 demos/gtk-demo/builder.c               |   3 +-
 demos/gtk-demo/clipboard.c             |   4 +-
 demos/gtk-demo/combobox.c              |   4 +-
 demos/gtk-demo/constraints.c           |   3 +-
 demos/gtk-demo/constraints2.c          |   3 +-
 demos/gtk-demo/constraints3.c          |   3 +-
 demos/gtk-demo/css_accordion.c         |   3 +-
 demos/gtk-demo/css_basics.c            |   3 +-
 demos/gtk-demo/css_blendmodes.c        |   2 +-
 demos/gtk-demo/css_multiplebgs.c       |   3 +-
 demos/gtk-demo/css_pixbufs.c           |   3 +-
 demos/gtk-demo/css_shadows.c           |   3 +-
 demos/gtk-demo/dialog.c                |   4 +-
 demos/gtk-demo/dnd.c                   |   4 +-
 demos/gtk-demo/editable_cells.c        |   3 +-
 demos/gtk-demo/entry_completion.c      |   4 +-
 demos/gtk-demo/entry_undo.c            |   3 +-
 demos/gtk-demo/filtermodel.c           |   3 +-
 demos/gtk-demo/fishbowl.c              |   6 +-
 demos/gtk-demo/flowbox.c               |   4 +-
 demos/gtk-demo/font_features.c         |   3 +-
 demos/gtk-demo/gears.c                 |   2 +-
 demos/gtk-demo/gestures.c              |   3 +-
 demos/gtk-demo/headerbar.c             |   4 +-
 demos/gtk-demo/hypertext.c             |   4 +-
 demos/gtk-demo/iconscroll.c            |   6 +-
 demos/gtk-demo/iconview_edit.c         |   4 +-
 demos/gtk-demo/images.c                |   3 +-
 demos/gtk-demo/infobar.c               |   3 +-
 demos/gtk-demo/links.c                 |   3 +-
 demos/gtk-demo/list_store.c            |   4 +-
 demos/gtk-demo/listbox.c               |   9 +-
 demos/gtk-demo/markup.c                |   3 +-
 demos/gtk-demo/modelbutton.c           |   3 +-
 demos/gtk-demo/overlay.c               |   4 +-
 demos/gtk-demo/overlay2.c              |   4 +-
 demos/gtk-demo/pagesetup.c             |   2 +-
 demos/gtk-demo/paint.c                 |   5 +-
 demos/gtk-demo/panes.c                 |   4 +-
 demos/gtk-demo/password_entry.c        |   3 +-
 demos/gtk-demo/peg_solitaire.c         |   3 +-
 demos/gtk-demo/pickers.c               |   4 +-
 demos/gtk-demo/pixbufs.c               |   4 +-
 demos/gtk-demo/rotated_text.c          |   3 +-
 demos/gtk-demo/scale.c                 |   3 +-
 demos/gtk-demo/search_entry2.c         |   4 +-
 demos/gtk-demo/shortcut_triggers.c     |   4 +-
 demos/gtk-demo/shortcuts.c             |   3 +-
 demos/gtk-demo/sidebar.c               |   4 +-
 demos/gtk-demo/sizegroup.c             |   3 +-
 demos/gtk-demo/sliding_puzzle.c        |   3 +-
 demos/gtk-demo/spinbutton.c            |   3 +-
 demos/gtk-demo/spinner.c               |   3 +-
 demos/gtk-demo/stack.c                 |   3 +-
 demos/gtk-demo/tabs.c                  |   4 +-
 demos/gtk-demo/tagged_entry.c          |   3 +-
 demos/gtk-demo/textmask.c              |   4 +-
 demos/gtk-demo/textscroll.c            |   3 +-
 demos/gtk-demo/textundo.c              |   7 +-
 demos/gtk-demo/textview.c              |   7 +-
 demos/gtk-demo/themes.c                |   6 +-
 demos/gtk-demo/theming_style_classes.c |   3 +-
 demos/gtk-demo/transparent.c           |   4 +-
 demos/gtk-demo/tree_store.c            |   3 +-
 demos/gtk-demo/video_player.c          |   3 +-
 gtk/gtkmountoperation.c                |  14 ++-
 gtk/gtkwindow.c                        | 124 ++++++------------
 tests/testgtk.c                        | 222 ++++++++++-----------------------
 69 files changed, 187 insertions(+), 414 deletions(-)
---
diff --git a/demos/gtk-demo/assistant.c b/demos/gtk-demo/assistant.c
index b1c285f0e89..13011caa4e3 100644
--- a/demos/gtk-demo/assistant.c
+++ b/demos/gtk-demo/assistant.c
@@ -178,8 +178,7 @@ do_assistant (GtkWidget *do_widget)
 
       gtk_window_set_display (GTK_WINDOW (assistant),
                               gtk_widget_get_display (do_widget));
-      g_signal_connect (assistant, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &assistant);
+      g_object_add_weak_pointer (G_OBJECT (assistant), (gpointer *)&assistant);
 
       create_page1 (assistant);
       create_page2 (assistant);
diff --git a/demos/gtk-demo/builder.c b/demos/gtk-demo/builder.c
index 35714f23516..709e1465e6d 100644
--- a/demos/gtk-demo/builder.c
+++ b/demos/gtk-demo/builder.c
@@ -74,8 +74,7 @@ do_builder (GtkWidget *do_widget)
       window = GTK_WIDGET (gtk_builder_get_object (builder, "window1"));
       gtk_window_set_display (GTK_WINDOW (window),
                               gtk_widget_get_display (do_widget));
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
       actions = (GActionGroup*)g_simple_action_group_new ();
       g_action_map_add_action_entries (G_ACTION_MAP (actions),
                                        win_entries, G_N_ELEMENTS (win_entries),
diff --git a/demos/gtk-demo/clipboard.c b/demos/gtk-demo/clipboard.c
index 801baaa173d..c00f95f0f6b 100644
--- a/demos/gtk-demo/clipboard.c
+++ b/demos/gtk-demo/clipboard.c
@@ -108,9 +108,7 @@ do_clipboard (GtkWidget *do_widget)
       gtk_window_set_display (GTK_WINDOW (window),
                               gtk_widget_get_display (do_widget));
       gtk_window_set_title (GTK_WINDOW (window), "Clipboard");
-
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
       gtk_widget_set_margin_start (vbox, 8);
diff --git a/demos/gtk-demo/combobox.c b/demos/gtk-demo/combobox.c
index 946267cc661..318f8bdfd0c 100644
--- a/demos/gtk-demo/combobox.c
+++ b/demos/gtk-demo/combobox.c
@@ -315,9 +315,7 @@ do_combobox (GtkWidget *do_widget)
     gtk_window_set_display (GTK_WINDOW (window),
                             gtk_widget_get_display (do_widget));
     gtk_window_set_title (GTK_WINDOW (window), "Combo Boxes");
-
-    g_signal_connect (window, "destroy",
-                      G_CALLBACK (gtk_widget_destroyed), &window);
+    g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
     vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2);
     gtk_widget_set_margin_start (vbox, 10);
diff --git a/demos/gtk-demo/constraints.c b/demos/gtk-demo/constraints.c
index 306d4b340ca..23aa0c57d09 100644
--- a/demos/gtk-demo/constraints.c
+++ b/demos/gtk-demo/constraints.c
@@ -263,8 +263,7 @@ do_constraints (GtkWidget *do_widget)
      header = gtk_header_bar_new ();
      gtk_header_bar_set_show_title_buttons (GTK_HEADER_BAR (header), FALSE);
      gtk_window_set_titlebar (GTK_WINDOW (window), header);
-     g_signal_connect (window, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed), &window);
+     g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
      box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
      gtk_window_set_child (GTK_WINDOW (window), box);
diff --git a/demos/gtk-demo/constraints2.c b/demos/gtk-demo/constraints2.c
index bd2f373e0f7..e11d9a3f590 100644
--- a/demos/gtk-demo/constraints2.c
+++ b/demos/gtk-demo/constraints2.c
@@ -219,8 +219,7 @@ do_constraints2 (GtkWidget *do_widget)
      header = gtk_header_bar_new ();
      gtk_header_bar_set_show_title_buttons (GTK_HEADER_BAR (header), FALSE);
      gtk_window_set_titlebar (GTK_WINDOW (window), header);
-     g_signal_connect (window, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed), &window);
+     g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
      box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
      gtk_window_set_child (GTK_WINDOW (window), box);
diff --git a/demos/gtk-demo/constraints3.c b/demos/gtk-demo/constraints3.c
index a534a905f7f..a92153633b4 100644
--- a/demos/gtk-demo/constraints3.c
+++ b/demos/gtk-demo/constraints3.c
@@ -139,8 +139,7 @@ do_constraints3 (GtkWidget *do_widget)
      header = gtk_header_bar_new ();
      gtk_header_bar_set_show_title_buttons (GTK_HEADER_BAR (header), FALSE);
      gtk_window_set_titlebar (GTK_WINDOW (window), header);
-     g_signal_connect (window, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed), &window);
+     g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
      box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
      gtk_window_set_child (GTK_WINDOW (window), box);
diff --git a/demos/gtk-demo/css_accordion.c b/demos/gtk-demo/css_accordion.c
index d28262def01..18d50f9cafb 100644
--- a/demos/gtk-demo/css_accordion.c
+++ b/demos/gtk-demo/css_accordion.c
@@ -28,8 +28,7 @@ do_css_accordion (GtkWidget *do_widget)
       gtk_window_set_title (GTK_WINDOW (window), "CSS Accordion");
       gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
       gtk_window_set_default_size (GTK_WINDOW (window), 600, 300);
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       container = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
       gtk_widget_set_halign (container, GTK_ALIGN_CENTER);
diff --git a/demos/gtk-demo/css_basics.c b/demos/gtk-demo/css_basics.c
index 2f46c4f38b1..bba89fcddcd 100644
--- a/demos/gtk-demo/css_basics.c
+++ b/demos/gtk-demo/css_basics.c
@@ -76,8 +76,7 @@ do_css_basics (GtkWidget *do_widget)
       gtk_window_set_title (GTK_WINDOW (window), "CSS Basics");
       gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
       gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       text = gtk_text_buffer_new (NULL);
       gtk_text_buffer_create_tag (text,
diff --git a/demos/gtk-demo/css_blendmodes.c b/demos/gtk-demo/css_blendmodes.c
index 86fc0ecc91b..6f2b576f183 100644
--- a/demos/gtk-demo/css_blendmodes.c
+++ b/demos/gtk-demo/css_blendmodes.c
@@ -125,7 +125,7 @@ do_css_blendmodes (GtkWidget *do_widget)
 
       window = WID ("window");
       gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
-      g_signal_connect (window, "destroy", G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       /* Setup the CSS provider for window */
       provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
diff --git a/demos/gtk-demo/css_multiplebgs.c b/demos/gtk-demo/css_multiplebgs.c
index 5e29060d85d..d3436bf6c26 100644
--- a/demos/gtk-demo/css_multiplebgs.c
+++ b/demos/gtk-demo/css_multiplebgs.c
@@ -90,8 +90,7 @@ do_css_multiplebgs (GtkWidget *do_widget)
       gtk_window_set_title (GTK_WINDOW (window), "Multiple Backgrounds");
       gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
       gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       container = gtk_overlay_new ();
       gtk_window_set_child (GTK_WINDOW (window), container);
diff --git a/demos/gtk-demo/css_pixbufs.c b/demos/gtk-demo/css_pixbufs.c
index 9d88ef76fa5..a12142dd47d 100644
--- a/demos/gtk-demo/css_pixbufs.c
+++ b/demos/gtk-demo/css_pixbufs.c
@@ -76,8 +76,7 @@ do_css_pixbufs (GtkWidget *do_widget)
       gtk_window_set_title (GTK_WINDOW (window), "Animated Backgrounds");
       gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
       gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       paned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
       gtk_window_set_child (GTK_WINDOW (window), paned);
diff --git a/demos/gtk-demo/css_shadows.c b/demos/gtk-demo/css_shadows.c
index de21cfae292..db2f5ac521e 100644
--- a/demos/gtk-demo/css_shadows.c
+++ b/demos/gtk-demo/css_shadows.c
@@ -95,8 +95,7 @@ do_css_shadows (GtkWidget *do_widget)
       gtk_window_set_title (GTK_WINDOW (window), "Shadows");
       gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
       gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       paned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
       gtk_window_set_child (GTK_WINDOW (window), paned);
diff --git a/demos/gtk-demo/dialog.c b/demos/gtk-demo/dialog.c
index 6b965b9d84f..ec42d4ee85b 100644
--- a/demos/gtk-demo/dialog.c
+++ b/demos/gtk-demo/dialog.c
@@ -109,9 +109,7 @@ do_dialog (GtkWidget *do_widget)
       gtk_window_set_display (GTK_WINDOW (window),
                               gtk_widget_get_display (do_widget));
       gtk_window_set_title (GTK_WINDOW (window), "Dialogs and Message Boxes");
-
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       frame = gtk_frame_new ("Dialogs");
       gtk_widget_set_margin_start (frame, 8);
diff --git a/demos/gtk-demo/dnd.c b/demos/gtk-demo/dnd.c
index 30bae48e17e..fd26c9e77a9 100644
--- a/demos/gtk-demo/dnd.c
+++ b/demos/gtk-demo/dnd.c
@@ -438,9 +438,7 @@ do_dnd (GtkWidget *do_widget)
                               gtk_widget_get_display (do_widget));
       gtk_window_set_title (GTK_WINDOW (window), "Drag-and-Drop");
       gtk_window_set_default_size (GTK_WINDOW (window), 640, 480);
-
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
       gtk_window_set_child (GTK_WINDOW (window), box);
diff --git a/demos/gtk-demo/editable_cells.c b/demos/gtk-demo/editable_cells.c
index cb0ff0abfa2..7c28dc20603 100644
--- a/demos/gtk-demo/editable_cells.c
+++ b/demos/gtk-demo/editable_cells.c
@@ -352,8 +352,7 @@ do_editable_cells (GtkWidget *do_widget)
       gtk_window_set_display (GTK_WINDOW (window),
                               gtk_widget_get_display (do_widget));
       gtk_window_set_title (GTK_WINDOW (window), "Editable Cells");
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
       gtk_widget_set_margin_start (vbox, 5);
diff --git a/demos/gtk-demo/entry_completion.c b/demos/gtk-demo/entry_completion.c
index d371afc4512..27ad6730d9e 100644
--- a/demos/gtk-demo/entry_completion.c
+++ b/demos/gtk-demo/entry_completion.c
@@ -50,9 +50,7 @@ do_entry_completion (GtkWidget *do_widget)
                               gtk_widget_get_display (do_widget));
       gtk_window_set_title (GTK_WINDOW (window), "Entry Completion");
       gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
-
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
       gtk_widget_set_margin_start (vbox, 5);
diff --git a/demos/gtk-demo/entry_undo.c b/demos/gtk-demo/entry_undo.c
index 9d069aeafb7..cab5ac0291a 100644
--- a/demos/gtk-demo/entry_undo.c
+++ b/demos/gtk-demo/entry_undo.c
@@ -25,8 +25,7 @@ do_entry_undo (GtkWidget *do_widget)
                               gtk_widget_get_display (do_widget));
       gtk_window_set_title (GTK_WINDOW (window), "Entry Undo");
       gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
       gtk_widget_set_margin_start (vbox, 5);
diff --git a/demos/gtk-demo/filtermodel.c b/demos/gtk-demo/filtermodel.c
index 0cb87d6a4e1..6933cc57a24 100644
--- a/demos/gtk-demo/filtermodel.c
+++ b/demos/gtk-demo/filtermodel.c
@@ -125,8 +125,7 @@ do_filtermodel (GtkWidget *do_widget)
       window = GTK_WIDGET (gtk_builder_get_object (builder, "window1"));
       gtk_window_set_display (GTK_WINDOW (window),
                               gtk_widget_get_display (do_widget));
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       store = (GtkListStore*)gtk_builder_get_object (builder, "liststore1");
 
diff --git a/demos/gtk-demo/fishbowl.c b/demos/gtk-demo/fishbowl.c
index 60ec2b5c280..195746d91c1 100644
--- a/demos/gtk-demo/fishbowl.c
+++ b/demos/gtk-demo/fishbowl.c
@@ -273,15 +273,13 @@ do_fishbowl (GtkWidget *do_widget)
 
       builder = gtk_builder_new_from_resource ("/fishbowl/fishbowl.ui");
       window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
+
       bowl = GTK_WIDGET (gtk_builder_get_object (builder, "bowl"));
       selected_widget_type = -1;
       set_widget_type (GTK_FISHBOWL (bowl), 0);
       gtk_window_set_display (GTK_WINDOW (window),
                               gtk_widget_get_display (do_widget));
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
 
       gtk_widget_realize (window);
       g_object_unref (builder);
diff --git a/demos/gtk-demo/flowbox.c b/demos/gtk-demo/flowbox.c
index fd87463b898..3d8641c90ef 100644
--- a/demos/gtk-demo/flowbox.c
+++ b/demos/gtk-demo/flowbox.c
@@ -724,9 +724,7 @@ do_flowbox (GtkWidget *do_widget)
                               gtk_widget_get_display (do_widget));
       gtk_window_set_title (GTK_WINDOW (window), "Flow Box");
       gtk_window_set_default_size (GTK_WINDOW (window), 400, 600);
-
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       scrolled = gtk_scrolled_window_new (NULL, NULL);
       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_NEVER, 
GTK_POLICY_AUTOMATIC);
diff --git a/demos/gtk-demo/font_features.c b/demos/gtk-demo/font_features.c
index f009da03f11..99cd083bac9 100644
--- a/demos/gtk-demo/font_features.c
+++ b/demos/gtk-demo/font_features.c
@@ -1333,8 +1333,7 @@ do_font_features (GtkWidget *do_widget)
 
       font_features_font_changed ();
 
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       g_object_unref (builder);
 
diff --git a/demos/gtk-demo/gears.c b/demos/gtk-demo/gears.c
index bf455b39019..e276d6209e8 100644
--- a/demos/gtk-demo/gears.c
+++ b/demos/gtk-demo/gears.c
@@ -85,7 +85,7 @@ do_gears (GtkWidget *do_widget)
       gtk_window_set_title (GTK_WINDOW (window), "Gears");
       gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
       gtk_window_set_default_size (GTK_WINDOW (window), 640, 640);
-      g_signal_connect (window, "destroy", G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       overlay = gtk_overlay_new ();
       gtk_widget_set_margin_start (overlay, 12);
diff --git a/demos/gtk-demo/gestures.c b/demos/gtk-demo/gestures.c
index f238da16668..a001b1908b0 100644
--- a/demos/gtk-demo/gestures.c
+++ b/demos/gtk-demo/gestures.c
@@ -149,8 +149,7 @@ do_gestures (GtkWidget *do_widget)
       window = gtk_window_new ();
       gtk_window_set_default_size (GTK_WINDOW (window), 400, 400);
       gtk_window_set_title (GTK_WINDOW (window), "Gestures");
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       drawing_area = gtk_drawing_area_new ();
       gtk_window_set_child (GTK_WINDOW (window), drawing_area);
diff --git a/demos/gtk-demo/headerbar.c b/demos/gtk-demo/headerbar.c
index e8a0ead1a9b..3a20d14ab3b 100644
--- a/demos/gtk-demo/headerbar.c
+++ b/demos/gtk-demo/headerbar.c
@@ -25,8 +25,8 @@ do_headerbar (GtkWidget *do_widget)
       window = gtk_window_new ();
       gtk_window_set_display (GTK_WINDOW (window),  gtk_widget_get_display (do_widget));
       gtk_window_set_title (GTK_WINDOW (window), "Welcome to Facebook - Log in, sign up or learn more");
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
+
       gtk_window_set_default_size (GTK_WINDOW (window), 600, 400);
 
       header = gtk_header_bar_new ();
diff --git a/demos/gtk-demo/hypertext.c b/demos/gtk-demo/hypertext.c
index 9191cabe492..e85da1b7767 100644
--- a/demos/gtk-demo/hypertext.c
+++ b/demos/gtk-demo/hypertext.c
@@ -237,9 +237,7 @@ do_hypertext (GtkWidget *do_widget)
       gtk_window_set_display (GTK_WINDOW (window),
                               gtk_widget_get_display (do_widget));
       gtk_window_set_default_size (GTK_WINDOW (window), 450, 450);
-
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       view = gtk_text_view_new ();
       gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (view), GTK_WRAP_WORD);
diff --git a/demos/gtk-demo/iconscroll.c b/demos/gtk-demo/iconscroll.c
index 2254aa0bef6..3ee06e6a21d 100644
--- a/demos/gtk-demo/iconscroll.c
+++ b/demos/gtk-demo/iconscroll.c
@@ -209,12 +209,10 @@ do_iconscroll (GtkWidget *do_widget)
 
       builder = gtk_builder_new_from_resource ("/iconscroll/iconscroll.ui");
       window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
       gtk_window_set_display (GTK_WINDOW (window),
                               gtk_widget_get_display (do_widget));
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+
       scrolledwindow = GTK_WIDGET (gtk_builder_get_object (builder, "scrolledwindow"));
       gtk_widget_realize (window);
       hadjustment = GTK_ADJUSTMENT (gtk_builder_get_object (builder, "hadjustment"));
diff --git a/demos/gtk-demo/iconview_edit.c b/demos/gtk-demo/iconview_edit.c
index 6e5c52d2a69..bba6a75c974 100644
--- a/demos/gtk-demo/iconview_edit.c
+++ b/demos/gtk-demo/iconview_edit.c
@@ -111,9 +111,7 @@ do_iconview_edit (GtkWidget *do_widget)
       gtk_window_set_display (GTK_WINDOW (window),
                               gtk_widget_get_display (do_widget));
       gtk_window_set_title (GTK_WINDOW (window), "Editing and Drag-and-Drop");
-
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       store = create_store ();
       fill_store (store);
diff --git a/demos/gtk-demo/images.c b/demos/gtk-demo/images.c
index b0efca8a1b9..72cd574ed67 100644
--- a/demos/gtk-demo/images.c
+++ b/demos/gtk-demo/images.c
@@ -335,9 +335,8 @@ do_images (GtkWidget *do_widget)
       gtk_window_set_display (GTK_WINDOW (window),
                               gtk_widget_get_display (do_widget));
       gtk_window_set_title (GTK_WINDOW (window), "Images");
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
       g_signal_connect (window, "destroy",
                         G_CALLBACK (cleanup_callback), NULL);
 
diff --git a/demos/gtk-demo/infobar.c b/demos/gtk-demo/infobar.c
index 92fc46b26c5..d3c1464ffac 100644
--- a/demos/gtk-demo/infobar.c
+++ b/demos/gtk-demo/infobar.c
@@ -58,8 +58,7 @@ do_infobar (GtkWidget *do_widget)
                               gtk_widget_get_display (do_widget));
       gtk_window_set_title (GTK_WINDOW (window), "Info Bars");
       gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
-
-      g_signal_connect (window, "destroy", G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
       gtk_widget_set_margin_start (vbox, 8);
diff --git a/demos/gtk-demo/links.c b/demos/gtk-demo/links.c
index 219f0963468..ae50f5a3891 100644
--- a/demos/gtk-demo/links.c
+++ b/demos/gtk-demo/links.c
@@ -59,8 +59,7 @@ do_links (GtkWidget *do_widget)
                               gtk_widget_get_display (do_widget));
       gtk_window_set_title (GTK_WINDOW (window), "Links");
       gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       label = gtk_label_new ("Some <a href=\"http://en.wikipedia.org/wiki/Text\"";
                              "title=\"plain text\">text</a> may be marked up "
diff --git a/demos/gtk-demo/list_store.c b/demos/gtk-demo/list_store.c
index 941548318c8..b96723d7eee 100644
--- a/demos/gtk-demo/list_store.c
+++ b/demos/gtk-demo/list_store.c
@@ -257,9 +257,7 @@ do_list_store (GtkWidget *do_widget)
       gtk_window_set_display (GTK_WINDOW (window),
                               gtk_widget_get_display (do_widget));
       gtk_window_set_title (GTK_WINDOW (window), "List Store");
-
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
       gtk_widget_set_margin_start (vbox, 8);
diff --git a/demos/gtk-demo/listbox.c b/demos/gtk-demo/listbox.c
index fe9c3e2fd39..92514082cda 100644
--- a/demos/gtk-demo/listbox.c
+++ b/demos/gtk-demo/listbox.c
@@ -351,13 +351,8 @@ do_listbox (GtkWidget *do_widget)
       gtk_window_set_display (GTK_WINDOW (window),
                               gtk_widget_get_display (do_widget));
       gtk_window_set_title (GTK_WINDOW (window), "List Box");
-      gtk_window_set_default_size (GTK_WINDOW (window),
-                                   400, 600);
-
-      /* NULL window variable when window is closed */
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed),
-                        &window);
+      gtk_window_set_default_size (GTK_WINDOW (window), 400, 600);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
       gtk_window_set_child (GTK_WINDOW (window), vbox);
diff --git a/demos/gtk-demo/markup.c b/demos/gtk-demo/markup.c
index 7b23ec92526..d21fba6ddfa 100644
--- a/demos/gtk-demo/markup.c
+++ b/demos/gtk-demo/markup.c
@@ -58,8 +58,7 @@ do_markup (GtkWidget *do_widget)
       gtk_window_set_display (GTK_WINDOW (window),
                               gtk_widget_get_display (do_widget));
       gtk_window_set_default_size (GTK_WINDOW (window), 450, 450);
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       stack = gtk_stack_new ();
       gtk_widget_show (stack);
diff --git a/demos/gtk-demo/modelbutton.c b/demos/gtk-demo/modelbutton.c
index a0299228b5b..01d321a2982 100644
--- a/demos/gtk-demo/modelbutton.c
+++ b/demos/gtk-demo/modelbutton.c
@@ -43,8 +43,7 @@ do_modelbutton (GtkWidget *do_widget)
       window = GTK_WIDGET (gtk_builder_get_object (builder, "window1"));
       gtk_window_set_display (GTK_WINDOW (window),
                               gtk_widget_get_display (do_widget));
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       actions = (GActionGroup*)g_simple_action_group_new ();
       g_action_map_add_action_entries (G_ACTION_MAP (actions),
diff --git a/demos/gtk-demo/overlay.c b/demos/gtk-demo/overlay.c
index ae1391a96d6..8b5a82b175f 100644
--- a/demos/gtk-demo/overlay.c
+++ b/demos/gtk-demo/overlay.c
@@ -79,9 +79,7 @@ do_overlay (GtkWidget *do_widget)
       gtk_container_add (GTK_CONTAINER (vbox), entry);
 
       gtk_window_set_child (GTK_WINDOW (window), overlay);
-
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
     }
 
   if (!gtk_widget_get_visible (window))
diff --git a/demos/gtk-demo/overlay2.c b/demos/gtk-demo/overlay2.c
index 1cfc2d17988..5746f377d5e 100644
--- a/demos/gtk-demo/overlay2.c
+++ b/demos/gtk-demo/overlay2.c
@@ -60,9 +60,7 @@ do_overlay2 (GtkWidget *do_widget)
       gtk_window_set_child (GTK_WINDOW (window), overlay);
       gtk_overlay_set_child (GTK_OVERLAY (overlay), sw);
       gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), text);
-
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       image = gtk_picture_new_for_resource ("/overlay2/decor1.png");
       gtk_overlay_add_overlay (GTK_OVERLAY (overlay), image);
diff --git a/demos/gtk-demo/pagesetup.c b/demos/gtk-demo/pagesetup.c
index f169bae5c5e..b440a1735a7 100644
--- a/demos/gtk-demo/pagesetup.c
+++ b/demos/gtk-demo/pagesetup.c
@@ -22,7 +22,7 @@ do_pagesetup (GtkWidget *do_widget)
   if (!window)
     {
       window = gtk_page_setup_unix_dialog_new ("Page Setup", GTK_WINDOW (do_widget));
-      g_signal_connect (window, "destroy", G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
       g_signal_connect (window, "response", G_CALLBACK (done_cb), NULL);
     }
 
diff --git a/demos/gtk-demo/paint.c b/demos/gtk-demo/paint.c
index a13750801ed..e25efc50953 100644
--- a/demos/gtk-demo/paint.c
+++ b/demos/gtk-demo/paint.c
@@ -405,10 +405,7 @@ do_paint (GtkWidget *toplevel)
       gtk_header_bar_pack_end (GTK_HEADER_BAR (headerbar), colorbutton);
       gtk_window_set_titlebar (GTK_WINDOW (window), headerbar);
       gtk_window_set_title (GTK_WINDOW (window), "Paint");
-
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
-
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
     }
 
   if (!gtk_widget_get_visible (window))
diff --git a/demos/gtk-demo/panes.c b/demos/gtk-demo/panes.c
index 6a5c9bc59ed..cca999a93bf 100644
--- a/demos/gtk-demo/panes.c
+++ b/demos/gtk-demo/panes.c
@@ -152,9 +152,7 @@ do_panes (GtkWidget *do_widget)
       window = gtk_window_new ();
       gtk_window_set_display (GTK_WINDOW (window),
                               gtk_widget_get_display (do_widget));
-
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       gtk_window_set_title (GTK_WINDOW (window), "Paned Widgets");
 
diff --git a/demos/gtk-demo/password_entry.c b/demos/gtk-demo/password_entry.c
index f8246dd4a4f..04867237c6f 100644
--- a/demos/gtk-demo/password_entry.c
+++ b/demos/gtk-demo/password_entry.c
@@ -45,8 +45,7 @@ do_password_entry (GtkWidget *do_widget)
       gtk_window_set_title (GTK_WINDOW (window), "Choose a Password");
       gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
       gtk_window_set_deletable (GTK_WINDOW (window), FALSE);
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
       gtk_widget_set_margin_start (box, 18);
diff --git a/demos/gtk-demo/peg_solitaire.c b/demos/gtk-demo/peg_solitaire.c
index 00fdca3d56c..a408d444bd8 100644
--- a/demos/gtk-demo/peg_solitaire.c
+++ b/demos/gtk-demo/peg_solitaire.c
@@ -284,8 +284,7 @@ do_peg_solitaire (GtkWidget *do_widget)
       gtk_window_set_title (GTK_WINDOW (window), "Peg Solitaire");
       gtk_window_set_titlebar (GTK_WINDOW (window), header);
       gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       grid = gtk_grid_new ();
       gtk_widget_set_halign (grid, GTK_ALIGN_CENTER);
diff --git a/demos/gtk-demo/pickers.c b/demos/gtk-demo/pickers.c
index 5f6b3f84971..f114538ca31 100644
--- a/demos/gtk-demo/pickers.c
+++ b/demos/gtk-demo/pickers.c
@@ -18,9 +18,7 @@ do_pickers (GtkWidget *do_widget)
     gtk_window_set_display (GTK_WINDOW (window),
                             gtk_widget_get_display (do_widget));
     gtk_window_set_title (GTK_WINDOW (window), "Pickers");
-
-    g_signal_connect (window, "destroy",
-                      G_CALLBACK (gtk_widget_destroyed), &window);
+    g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
     table = gtk_grid_new ();
     gtk_widget_set_margin_start (table, 20);
diff --git a/demos/gtk-demo/pixbufs.c b/demos/gtk-demo/pixbufs.c
index aece1dfb4a8..d6db9230e5e 100644
--- a/demos/gtk-demo/pixbufs.c
+++ b/demos/gtk-demo/pixbufs.c
@@ -179,9 +179,7 @@ do_pixbufs (GtkWidget *do_widget)
                               gtk_widget_get_display (do_widget));
       gtk_window_set_title (GTK_WINDOW (window), "Pixbufs");
       gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
-
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       error = NULL;
       if (!load_pixbufs (&error))
diff --git a/demos/gtk-demo/rotated_text.c b/demos/gtk-demo/rotated_text.c
index b86a5e69446..8a5a6c91e5a 100644
--- a/demos/gtk-demo/rotated_text.c
+++ b/demos/gtk-demo/rotated_text.c
@@ -180,8 +180,7 @@ do_rotated_text (GtkWidget *do_widget)
                               gtk_widget_get_display (do_widget));
       gtk_window_set_title (GTK_WINDOW (window), "Rotated Text");
       gtk_window_set_default_size (GTK_WINDOW (window), 4 * RADIUS, 2 * RADIUS);
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
       gtk_box_set_homogeneous (GTK_BOX (box), TRUE);
diff --git a/demos/gtk-demo/scale.c b/demos/gtk-demo/scale.c
index 55304e890e0..8c36e89f343 100644
--- a/demos/gtk-demo/scale.c
+++ b/demos/gtk-demo/scale.c
@@ -21,8 +21,7 @@ do_scale (GtkWidget *do_widget)
       window = GTK_WIDGET (gtk_builder_get_object (builder, "window1"));
       gtk_window_set_display (GTK_WINDOW (window),
                               gtk_widget_get_display (do_widget));
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       g_object_unref (builder);
     }
diff --git a/demos/gtk-demo/search_entry2.c b/demos/gtk-demo/search_entry2.c
index 5e8cb6ac8b2..73e65a37434 100644
--- a/demos/gtk-demo/search_entry2.c
+++ b/demos/gtk-demo/search_entry2.c
@@ -73,9 +73,7 @@ do_search_entry2 (GtkWidget *do_widget)
       gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
       gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
       gtk_widget_set_size_request (window, 200, -1);
-
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
       gtk_window_set_child (GTK_WINDOW (window), vbox);
diff --git a/demos/gtk-demo/shortcut_triggers.c b/demos/gtk-demo/shortcut_triggers.c
index 509a7f55143..114d8290b08 100644
--- a/demos/gtk-demo/shortcut_triggers.c
+++ b/demos/gtk-demo/shortcut_triggers.c
@@ -56,9 +56,7 @@ do_shortcut_triggers (GtkWidget *do_widget)
       gtk_window_set_display (GTK_WINDOW (window),
                               gtk_widget_get_display (do_widget));
       gtk_window_set_title (GTK_WINDOW (window), "Shortcuts");
-
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       list = gtk_list_box_new ();
       gtk_widget_set_margin_top (list, 6);
diff --git a/demos/gtk-demo/shortcuts.c b/demos/gtk-demo/shortcuts.c
index 81820354991..cfe53aa94e7 100644
--- a/demos/gtk-demo/shortcuts.c
+++ b/demos/gtk-demo/shortcuts.c
@@ -89,8 +89,7 @@ do_shortcuts (GtkWidget *do_widget)
       window = GTK_WIDGET (gtk_builder_get_object (builder, "window1"));
       gtk_window_set_display (GTK_WINDOW (window),
                               gtk_widget_get_display (do_widget));
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       g_object_unref (builder);
     }
diff --git a/demos/gtk-demo/sidebar.c b/demos/gtk-demo/sidebar.c
index 420861f2259..25bb7d9bc0c 100644
--- a/demos/gtk-demo/sidebar.c
+++ b/demos/gtk-demo/sidebar.c
@@ -43,9 +43,7 @@ do_sidebar (GtkWidget *do_widget)
       gtk_header_bar_set_show_title_buttons (GTK_HEADER_BAR(header), TRUE);
       gtk_window_set_titlebar (GTK_WINDOW(window), header);
       gtk_window_set_title (GTK_WINDOW(window), "Stack Sidebar");
-
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
       sidebar = gtk_stack_sidebar_new ();
diff --git a/demos/gtk-demo/sizegroup.c b/demos/gtk-demo/sizegroup.c
index 9d12dd35516..4958addee8e 100644
--- a/demos/gtk-demo/sizegroup.c
+++ b/demos/gtk-demo/sizegroup.c
@@ -104,8 +104,7 @@ do_sizegroup (GtkWidget *do_widget)
       gtk_window_set_display (GTK_WINDOW (window),  gtk_widget_get_display (do_widget));
       gtk_window_set_title (GTK_WINDOW (window), "Size Groups");
       gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
       gtk_widget_set_margin_start (vbox, 5);
diff --git a/demos/gtk-demo/sliding_puzzle.c b/demos/gtk-demo/sliding_puzzle.c
index b564e200b5f..b2739469562 100644
--- a/demos/gtk-demo/sliding_puzzle.c
+++ b/demos/gtk-demo/sliding_puzzle.c
@@ -460,8 +460,7 @@ do_sliding_puzzle (GtkWidget *do_widget)
       gtk_window_set_title (GTK_WINDOW (window), "Sliding Puzzle");
       gtk_window_set_titlebar (GTK_WINDOW (window), header);
       gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       frame = gtk_aspect_frame_new (0.5, 0.5, (float) gdk_paintable_get_intrinsic_aspect_ratio (puzzle), 
FALSE);
       gtk_window_set_child (GTK_WINDOW (window), frame);
diff --git a/demos/gtk-demo/spinbutton.c b/demos/gtk-demo/spinbutton.c
index e50379a8db0..8d998bb5f90 100644
--- a/demos/gtk-demo/spinbutton.c
+++ b/demos/gtk-demo/spinbutton.c
@@ -196,8 +196,7 @@ do_spinbutton (GtkWidget *do_widget)
                             gtk_widget_get_display (do_widget));
     gtk_window_set_title (GTK_WINDOW (window), "Spin Buttons");
     gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
-    g_signal_connect (window, "destroy",
-                      G_CALLBACK (gtk_widget_destroyed), &window);
+    g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
     adj = GTK_ADJUSTMENT (gtk_builder_get_object (builder, "basic_adjustment"));
     label = GTK_WIDGET (gtk_builder_get_object (builder, "basic_label"));
diff --git a/demos/gtk-demo/spinner.c b/demos/gtk-demo/spinner.c
index 563438a04c9..160e6477032 100644
--- a/demos/gtk-demo/spinner.c
+++ b/demos/gtk-demo/spinner.c
@@ -46,8 +46,7 @@ do_spinner (GtkWidget *do_widget)
 
     g_signal_connect (window, "response",
                       G_CALLBACK (gtk_widget_destroy), NULL);
-    g_signal_connect (window, "destroy",
-                      G_CALLBACK (gtk_widget_destroyed), &window);
+    g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
     content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
 
diff --git a/demos/gtk-demo/stack.c b/demos/gtk-demo/stack.c
index 22969906f08..1796094c1f3 100644
--- a/demos/gtk-demo/stack.c
+++ b/demos/gtk-demo/stack.c
@@ -21,8 +21,7 @@ do_stack (GtkWidget *do_widget)
       window = GTK_WIDGET (gtk_builder_get_object (builder, "window1"));
       gtk_window_set_display (GTK_WINDOW (window),
                               gtk_widget_get_display (do_widget));
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       g_object_unref (builder);
     }
diff --git a/demos/gtk-demo/tabs.c b/demos/gtk-demo/tabs.c
index 0a046a594e4..b54a955a237 100644
--- a/demos/gtk-demo/tabs.c
+++ b/demos/gtk-demo/tabs.c
@@ -23,9 +23,7 @@ do_tabs (GtkWidget *do_widget)
       gtk_window_set_display (GTK_WINDOW (window),
                               gtk_widget_get_display (do_widget));
       gtk_window_set_default_size (GTK_WINDOW (window), 450, 450);
-
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       view = gtk_text_view_new ();
       gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (view), GTK_WRAP_WORD);
diff --git a/demos/gtk-demo/tagged_entry.c b/demos/gtk-demo/tagged_entry.c
index 26795421bc9..69c48c619a4 100644
--- a/demos/gtk-demo/tagged_entry.c
+++ b/demos/gtk-demo/tagged_entry.c
@@ -72,8 +72,7 @@ do_tagged_entry (GtkWidget *do_widget)
       gtk_window_set_title (GTK_WINDOW (window), "A tagged entry");
       gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
       gtk_window_set_deletable (GTK_WINDOW (window), FALSE);
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
       gtk_widget_set_margin_start (box, 18);
diff --git a/demos/gtk-demo/textmask.c b/demos/gtk-demo/textmask.c
index ff66ce29619..b233f71e0a9 100644
--- a/demos/gtk-demo/textmask.c
+++ b/demos/gtk-demo/textmask.c
@@ -63,9 +63,7 @@ do_textmask (GtkWidget *do_widget)
       gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
       gtk_widget_set_size_request (window, 400, 200);
       gtk_window_set_title (GTK_WINDOW (window), "Text Mask");
-
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       da = gtk_drawing_area_new ();
 
diff --git a/demos/gtk-demo/textscroll.c b/demos/gtk-demo/textscroll.c
index 02df96c7a9a..6d470fe7ee1 100644
--- a/demos/gtk-demo/textscroll.c
+++ b/demos/gtk-demo/textscroll.c
@@ -182,8 +182,7 @@ do_textscroll (GtkWidget *do_widget)
 
       window = gtk_window_new ();
       gtk_window_set_title (GTK_WINDOW (window), "Automatic Scrolling");
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
       gtk_window_set_default_size (GTK_WINDOW (window), 600, 400);
 
       hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
diff --git a/demos/gtk-demo/textundo.c b/demos/gtk-demo/textundo.c
index d7e35e0851f..e6b99c202ea 100644
--- a/demos/gtk-demo/textundo.c
+++ b/demos/gtk-demo/textundo.c
@@ -26,11 +26,8 @@ do_textundo (GtkWidget *do_widget)
       window = gtk_window_new ();
       gtk_window_set_display (GTK_WINDOW (window),
                               gtk_widget_get_display (do_widget));
-      gtk_window_set_default_size (GTK_WINDOW (window),
-                                   450, 450);
-
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      gtk_window_set_default_size (GTK_WINDOW (window), 450, 450);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       gtk_window_set_title (GTK_WINDOW (window), "TextView Undo");
 
diff --git a/demos/gtk-demo/textview.c b/demos/gtk-demo/textview.c
index 68e0b35c202..d1c3c2fb7fd 100644
--- a/demos/gtk-demo/textview.c
+++ b/demos/gtk-demo/textview.c
@@ -477,11 +477,8 @@ do_textview (GtkWidget *do_widget)
       window = gtk_window_new ();
       gtk_window_set_display (GTK_WINDOW (window),
                               gtk_widget_get_display (do_widget));
-      gtk_window_set_default_size (GTK_WINDOW (window),
-                                   450, 450);
-
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      gtk_window_set_default_size (GTK_WINDOW (window), 450, 450);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       gtk_window_set_title (GTK_WINDOW (window), "Multiple Views");
 
diff --git a/demos/gtk-demo/themes.c b/demos/gtk-demo/themes.c
index 88191aa157a..8f6eeca0844 100644
--- a/demos/gtk-demo/themes.c
+++ b/demos/gtk-demo/themes.c
@@ -178,12 +178,10 @@ do_themes (GtkWidget *do_widget)
 
       builder = gtk_builder_new_from_resource ("/themes/themes.ui");
       window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
       gtk_window_set_display (GTK_WINDOW (window),
                               gtk_widget_get_display (do_widget));
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+
       header = GTK_WIDGET (gtk_builder_get_object (builder, "header"));
       gesture = gtk_gesture_click_new ();
       g_signal_connect (gesture, "pressed", G_CALLBACK (clicked), builder);
diff --git a/demos/gtk-demo/theming_style_classes.c b/demos/gtk-demo/theming_style_classes.c
index db91d92c5cb..ed0aef2dd0b 100644
--- a/demos/gtk-demo/theming_style_classes.c
+++ b/demos/gtk-demo/theming_style_classes.c
@@ -25,8 +25,7 @@ do_theming_style_classes (GtkWidget *do_widget)
                               gtk_widget_get_display (do_widget));
       gtk_window_set_title (GTK_WINDOW (window), "Style Classes");
       gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       builder = gtk_builder_new_from_resource ("/theming_style_classes/theming.ui");
 
diff --git a/demos/gtk-demo/transparent.c b/demos/gtk-demo/transparent.c
index 6d2c010c105..9f76e617847 100644
--- a/demos/gtk-demo/transparent.c
+++ b/demos/gtk-demo/transparent.c
@@ -22,9 +22,7 @@ do_transparent (GtkWidget *do_widget)
       gtk_window_set_display (GTK_WINDOW (window),
                               gtk_widget_get_display (do_widget));
       gtk_window_set_default_size (GTK_WINDOW (window), 450, 450);
-
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       gtk_window_set_title (GTK_WINDOW (window), "Transparency");
 
diff --git a/demos/gtk-demo/tree_store.c b/demos/gtk-demo/tree_store.c
index f39b409718a..2a37c30a426 100644
--- a/demos/gtk-demo/tree_store.c
+++ b/demos/gtk-demo/tree_store.c
@@ -394,8 +394,7 @@ do_tree_store (GtkWidget *do_widget)
       gtk_window_set_display (GTK_WINDOW (window),
                               gtk_widget_get_display (do_widget));
       gtk_window_set_title (GTK_WINDOW (window), "Tree Store");
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
       gtk_widget_set_margin_start (vbox, 8);
diff --git a/demos/gtk-demo/video_player.c b/demos/gtk-demo/video_player.c
index 6a40204c243..bf35eb6446a 100644
--- a/demos/gtk-demo/video_player.c
+++ b/demos/gtk-demo/video_player.c
@@ -67,8 +67,7 @@ do_video_player (GtkWidget *do_widget)
       gtk_window_set_display (GTK_WINDOW (window),
                               gtk_widget_get_display (do_widget));
       gtk_window_set_title (GTK_WINDOW (window), "Video Player");
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       video = gtk_video_new ();
       gtk_window_set_child (GTK_WINDOW (window), video);
diff --git a/gtk/gtkmountoperation.c b/gtk/gtkmountoperation.c
index e58bae6ac61..bd7105b9bd8 100644
--- a/gtk/gtkmountoperation.c
+++ b/gtk/gtkmountoperation.c
@@ -218,6 +218,13 @@ gtk_mount_operation_init (GtkMountOperation *operation)
     g_dbus_proxy_set_default_timeout (G_DBUS_PROXY (operation->priv->handler), G_MAXINT);
 }
 
+static void
+parent_destroyed (GtkWidget  *parent,
+                  gpointer  **pointer)
+{
+  *pointer = NULL;
+}
+
 static void
 gtk_mount_operation_finalize (GObject *object)
 {
@@ -230,7 +237,7 @@ gtk_mount_operation_finalize (GObject *object)
   if (priv->parent_window)
     {
       g_signal_handlers_disconnect_by_func (priv->parent_window,
-                                            gtk_widget_destroyed,
+                                            parent_destroyed,
                                             &priv->parent_window);
       g_object_unref (priv->parent_window);
     }
@@ -1835,7 +1842,7 @@ gtk_mount_operation_set_parent (GtkMountOperation *op,
   if (priv->parent_window)
     {
       g_signal_handlers_disconnect_by_func (priv->parent_window,
-                                            gtk_widget_destroyed,
+                                            parent_destroyed,
                                             &priv->parent_window);
       g_object_unref (priv->parent_window);
     }
@@ -1844,8 +1851,7 @@ gtk_mount_operation_set_parent (GtkMountOperation *op,
     {
       g_object_ref (priv->parent_window);
       g_signal_connect (priv->parent_window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed),
-                        &priv->parent_window);
+                        G_CALLBACK (parent_destroyed), &priv->parent_window);
     }
 
   if (priv->dialog)
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index fc949183cc5..decfa1778bf 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -2410,41 +2410,20 @@ gtk_window_dispose (GObject *object)
 }
 
 static void
-parent_destroyed_callback (GtkWindow *parent, GtkWindow *child)
+gtk_window_transient_parent_destroyed (GtkWindow *parent,
+                                       GtkWindow *window)
 {
-  gtk_widget_destroy (GTK_WIDGET (child));
-}
-
-static void
-connect_parent_destroyed (GtkWindow *window)
-{
-  GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
-
-  if (priv->transient_parent)
-    {
-      g_signal_connect (priv->transient_parent,
-                        "destroy",
-                        G_CALLBACK (parent_destroyed_callback),
-                        window);
-    }  
-}
-
-static void
-disconnect_parent_destroyed (GtkWindow *window)
-{
-  GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
+  GtkWindowPrivate *priv = gtk_window_get_instance_private (GTK_WINDOW (window));
 
-  if (priv->transient_parent)
-    {
-      g_signal_handlers_disconnect_by_func (priv->transient_parent,
-                                           parent_destroyed_callback,
-                                           window);
-    }
+  if (priv->destroy_with_parent)
+    gtk_widget_destroy (GTK_WIDGET (window));
+  else
+    priv->transient_parent = NULL;
 }
 
 static void
 gtk_window_transient_parent_realized (GtkWidget *parent,
-                                     GtkWidget *window)
+                                      GtkWidget *window)
 {
   GtkWindowPrivate *priv = gtk_window_get_instance_private (GTK_WINDOW (window));
   GtkWindowPrivate *parent_priv = gtk_window_get_instance_private (GTK_WINDOW (parent));
@@ -2454,7 +2433,7 @@ gtk_window_transient_parent_realized (GtkWidget *parent,
 
 static void
 gtk_window_transient_parent_unrealized (GtkWidget *parent,
-                                       GtkWidget *window)
+                                        GtkWidget *window)
 {
   GtkWindowPrivate *priv = gtk_window_get_instance_private (GTK_WINDOW (window));
   if (_gtk_widget_get_realized (window))
@@ -2462,7 +2441,7 @@ gtk_window_transient_parent_unrealized (GtkWidget *parent,
 }
 
 static void
-gtk_window_transient_parent_display_changed (GtkWindow *parent,
+gtk_window_transient_parent_display_changed (GtkWindow  *parent,
                                              GParamSpec *pspec,
                                              GtkWindow  *window)
 {
@@ -2471,7 +2450,7 @@ gtk_window_transient_parent_display_changed (GtkWindow    *parent,
   gtk_window_set_display (window, parent_priv->display);
 }
 
-static void       
+static void
 gtk_window_unset_transient_for (GtkWindow *window)
 {
   GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
@@ -2479,29 +2458,25 @@ gtk_window_unset_transient_for (GtkWindow *window)
   if (priv->transient_parent)
     {
       g_signal_handlers_disconnect_by_func (priv->transient_parent,
-                                           gtk_window_transient_parent_realized,
-                                           window);
+                                            gtk_window_transient_parent_realized,
+                                            window);
       g_signal_handlers_disconnect_by_func (priv->transient_parent,
-                                           gtk_window_transient_parent_unrealized,
-                                           window);
+                                            gtk_window_transient_parent_unrealized,
+                                            window);
       g_signal_handlers_disconnect_by_func (priv->transient_parent,
-                                           gtk_window_transient_parent_display_changed,
-                                           window);
+                                            gtk_window_transient_parent_display_changed,
+                                            window);
       g_signal_handlers_disconnect_by_func (priv->transient_parent,
-                                           gtk_widget_destroyed,
-                                           &priv->transient_parent);
-
-      if (priv->destroy_with_parent)
-        disconnect_parent_destroyed (window);
+                                            gtk_window_transient_parent_destroyed,
+                                            window);
 
       priv->transient_parent = NULL;
 
       if (priv->transient_parent_group)
-       {
-         priv->transient_parent_group = FALSE;
-         gtk_window_group_remove_window (priv->group,
-                                         window);
-       }
+        {
+          priv->transient_parent_group = FALSE;
+          gtk_window_group_remove_window (priv->group, window);
+        }
     }
 }
 
@@ -2524,8 +2499,8 @@ gtk_window_unset_transient_for (GtkWindow *window)
  * much as the window manager would have done on X.
  */
 void
-gtk_window_set_transient_for  (GtkWindow *window,
-                              GtkWindow *parent)
+gtk_window_set_transient_for (GtkWindow *window,
+                              GtkWindow *parent)
 {
   GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
 
@@ -2538,9 +2513,8 @@ gtk_window_set_transient_for  (GtkWindow *window,
       if (_gtk_widget_get_realized (GTK_WIDGET (window)) &&
           _gtk_widget_get_realized (GTK_WIDGET (priv->transient_parent)) &&
           (!parent || !_gtk_widget_get_realized (GTK_WIDGET (parent))))
-       gtk_window_transient_parent_unrealized (GTK_WIDGET (priv->transient_parent),
-                                               GTK_WIDGET (window));
-
+        gtk_window_transient_parent_unrealized (GTK_WIDGET (priv->transient_parent),
+                                                GTK_WIDGET (window));
       gtk_window_unset_transient_for (window);
     }
 
@@ -2549,34 +2523,27 @@ gtk_window_set_transient_for  (GtkWindow *window,
   if (parent)
     {
       GtkWindowPrivate *parent_priv = gtk_window_get_instance_private (parent);
-      g_signal_connect (parent, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &priv->transient_parent);
       g_signal_connect (parent, "realize",
-                       G_CALLBACK (gtk_window_transient_parent_realized),
-                       window);
+                        G_CALLBACK (gtk_window_transient_parent_realized), window);
       g_signal_connect (parent, "unrealize",
-                       G_CALLBACK (gtk_window_transient_parent_unrealized),
-                       window);
+                        G_CALLBACK (gtk_window_transient_parent_unrealized), window);
       g_signal_connect (parent, "notify::display",
-                       G_CALLBACK (gtk_window_transient_parent_display_changed),
-                       window);
+                        G_CALLBACK (gtk_window_transient_parent_display_changed), window);
+      g_signal_connect (parent, "destroy",
+                        G_CALLBACK (gtk_window_transient_parent_destroyed), window);
 
       gtk_window_set_display (window, parent_priv->display);
 
-      if (priv->destroy_with_parent)
-        connect_parent_destroyed (window);
-      
+
       if (_gtk_widget_get_realized (GTK_WIDGET (window)) &&
-         _gtk_widget_get_realized (GTK_WIDGET (parent)))
-       gtk_window_transient_parent_realized (GTK_WIDGET (parent),
-                                             GTK_WIDGET (window));
+          _gtk_widget_get_realized (GTK_WIDGET (parent)))
+        gtk_window_transient_parent_realized (GTK_WIDGET (parent), GTK_WIDGET (window));
 
       if (parent_priv->group)
-       {
-         gtk_window_group_add_window (parent_priv->group, window);
-         priv->transient_parent_group = TRUE;
-       }
+        {
+          gtk_window_group_add_window (parent_priv->group, window);
+          priv->transient_parent_group = TRUE;
+        }
     }
 
   update_window_actions (window);
@@ -2710,8 +2677,8 @@ gtk_window_set_application (GtkWindow      *window,
  * associated with, for example.
  **/
 void
-gtk_window_set_destroy_with_parent  (GtkWindow *window,
-                                     gboolean   setting)
+gtk_window_set_destroy_with_parent (GtkWindow *window,
+                                    gboolean   setting)
 {
   GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
 
@@ -2720,15 +2687,6 @@ gtk_window_set_destroy_with_parent  (GtkWindow *window,
   if (priv->destroy_with_parent == (setting != FALSE))
     return;
 
-  if (priv->destroy_with_parent)
-    {
-      disconnect_parent_destroyed (window);
-    }
-  else
-    {
-      connect_parent_destroyed (window);
-    }
-
   priv->destroy_with_parent = setting;
 
   g_object_notify_by_pspec (G_OBJECT (window), window_props[PROP_DESTROY_WITH_PARENT]);
diff --git a/tests/testgtk.c b/tests/testgtk.c
index 8f0cfe22ec0..709c0bd43f8 100644
--- a/tests/testgtk.c
+++ b/tests/testgtk.c
@@ -223,10 +223,7 @@ create_alpha_window (GtkWidget *widget)
       g_signal_connect (display, "notify::composited", G_CALLBACK (on_composited_changed), label);
 
       gtk_container_add (GTK_CONTAINER (vbox), build_alpha_widgets ());
-
-      g_signal_connect (window, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       g_signal_connect (window, "response",
                         G_CALLBACK (gtk_widget_destroy),
@@ -270,11 +267,8 @@ create_buttons (GtkWidget *widget)
     {
       window = gtk_window_new ();
       gtk_window_set_display (GTK_WINDOW (window),
-                             gtk_widget_get_display (widget));
-
-      g_signal_connect (window, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &window);
+                              gtk_widget_get_display (widget));
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       gtk_window_set_title (GTK_WINDOW (window), "GtkButton");
 
@@ -345,11 +339,8 @@ create_toggle_buttons (GtkWidget *widget)
     {
       window = gtk_window_new ();
       gtk_window_set_display (GTK_WINDOW (window),
-                             gtk_widget_get_display (widget));
-
-      g_signal_connect (window, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &window);
+                              gtk_widget_get_display (widget));
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       gtk_window_set_title (GTK_WINDOW (window), "GtkToggleButton");
 
@@ -464,11 +455,8 @@ create_check_buttons (GtkWidget *widget)
                                             NULL);
 
       gtk_window_set_display (GTK_WINDOW (window), 
-                             gtk_widget_get_display (widget));
-
-      g_signal_connect (window, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &window);
+                              gtk_widget_get_display (widget));
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
       g_signal_connect (window, "response",
                         G_CALLBACK (gtk_widget_destroy),
                         NULL);
@@ -527,11 +515,8 @@ create_radio_buttons (GtkWidget *widget)
                                             NULL);
 
       gtk_window_set_display (GTK_WINDOW (window),
-                             gtk_widget_get_display (widget));
-
-      g_signal_connect (window, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &window);
+                              gtk_widget_get_display (widget));
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
       g_signal_connect (window, "response",
                         G_CALLBACK (gtk_widget_destroy),
                         NULL);
@@ -716,11 +701,8 @@ create_statusbar (GtkWidget *widget)
     {
       window = gtk_window_new ();
       gtk_window_set_display (GTK_WINDOW (window),
-                             gtk_widget_get_display (widget));
-
-      g_signal_connect (window, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &window);
+                              gtk_widget_get_display (widget));
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       gtk_window_set_title (GTK_WINDOW (window), "statusbar");
 
@@ -930,11 +912,8 @@ static void create_labels (GtkWidget *widget)
       window = gtk_window_new ();
 
       gtk_window_set_display (GTK_WINDOW (window),
-                             gtk_widget_get_display (widget));
-
-      g_signal_connect (window, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &window);
+                              gtk_widget_get_display (widget));
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       gtk_window_set_title (GTK_WINDOW (window), "Label");
 
@@ -1173,8 +1152,7 @@ create_rotated_text (GtkWidget *widget)
 
       g_signal_connect (window, "response",
                        G_CALLBACK (gtk_widget_destroy), NULL);
-      g_signal_connect (window, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
 
@@ -1225,11 +1203,8 @@ create_pixbuf (GtkWidget *widget)
       window = gtk_window_new ();
 
       gtk_window_set_display (GTK_WINDOW (window),
-                             gtk_widget_get_display (widget));
-
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed),
-                        &window);
+                              gtk_widget_get_display (widget));
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       gtk_window_set_title (GTK_WINDOW (window), "GtkPixmap");
       gtk_widget_realize(window);
@@ -1412,9 +1387,7 @@ create_image (GtkWidget *widget)
        */
       gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
 
-      g_signal_connect (window, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
 
@@ -1536,7 +1509,7 @@ create_listbox (GtkWidget *widget)
       gtk_window_set_hide_on_close (GTK_WINDOW (window), TRUE);
       gtk_window_set_display (GTK_WINDOW (window), display);
 
-      g_signal_connect (window, "destroy", G_CALLBACK (gtk_widget_destroyed), &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       gtk_window_set_title (GTK_WINDOW (window), "listbox");
 
@@ -1638,7 +1611,6 @@ static void
 create_key_lookup (GtkWidget *widget)
 {
   static GtkWidget *window = NULL;
-  gpointer window_ptr;
 
   if (!window)
     {
@@ -1687,8 +1659,7 @@ create_key_lookup (GtkWidget *widget)
       button = accel_button_new ("Button 15", "<Shift><Mod4>b");
       gtk_container_add (GTK_CONTAINER (content_area), button);
 
-      window_ptr = &window;
-      g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
       g_signal_connect (window, "response", G_CALLBACK (gtk_widget_destroy), NULL);
 
       gtk_widget_show (window);
@@ -1842,10 +1813,7 @@ make_message_dialog (GdkDisplay     *display,
                            G_CALLBACK (gtk_widget_destroy),
                            *dialog);
   
-  g_signal_connect (*dialog,
-                    "destroy",
-                    G_CALLBACK (gtk_widget_destroyed),
-                    dialog);
+  g_object_add_weak_pointer (G_OBJECT (*dialog), (gpointer)dialog);
 
   gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
 
@@ -1967,11 +1935,8 @@ create_scrolled_windows (GtkWidget *widget)
       window = gtk_dialog_new ();
 
       gtk_window_set_display (GTK_WINDOW (window),
-                             gtk_widget_get_display (widget));
-
-      g_signal_connect (window, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &window);
+                              gtk_widget_get_display (widget));
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
 
@@ -2120,11 +2085,8 @@ create_entry (GtkWidget *widget)
     {
       window = gtk_window_new ();
       gtk_window_set_display (GTK_WINDOW (window),
-                             gtk_widget_get_display (widget));
-
-      g_signal_connect (window, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &window);
+                              gtk_widget_get_display (widget));
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       gtk_window_set_title (GTK_WINDOW (window), "entry");
 
@@ -2217,11 +2179,8 @@ create_expander (GtkWidget *widget)
     {
       window = gtk_window_new ();
       gtk_window_set_display (GTK_WINDOW (window),
-                             gtk_widget_get_display (widget));
-
-      g_signal_connect (window, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &window);
+                              gtk_widget_get_display (widget));
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       gtk_window_set_title (GTK_WINDOW (window), "expander");
 
@@ -2392,21 +2351,15 @@ create_size_groups (GtkWidget *widget)
   if (!window1)
     {
       window1 = create_size_group_window (gtk_widget_get_display (widget),
-                                         master_size_group);
-
-      g_signal_connect (window1, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &window1);
+                                          master_size_group);
+      g_object_add_weak_pointer (G_OBJECT (window1), (gpointer *)&window1);
     }
 
   if (!window2)
     {
       window2 = create_size_group_window (gtk_widget_get_display (widget),
-                                         master_size_group);
-
-      g_signal_connect (window2, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &window2);
+                                          master_size_group);
+      g_object_add_weak_pointer (G_OBJECT (window2), (gpointer *)&window2);
     }
 
   if (gtk_widget_get_visible (window1) && gtk_widget_get_visible (window2))
@@ -2612,11 +2565,8 @@ create_spins (GtkWidget *widget)
     {
       window = gtk_window_new ();
       gtk_window_set_display (GTK_WINDOW (window),
-                             gtk_widget_get_display (widget));
-
-      g_signal_connect (window, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &window);
+                              gtk_widget_get_display (widget));
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
 
@@ -3054,11 +3004,8 @@ create_cursors (GtkWidget *widget)
     {
       window = gtk_window_new ();
       gtk_window_set_display (GTK_WINDOW (window),
-                             gtk_widget_get_display (widget));
-
-      g_signal_connect (window, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &window);
+                              gtk_widget_get_display (widget));
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       gtk_window_set_title (GTK_WINDOW (window), "Cursors");
 
@@ -3178,14 +3125,11 @@ create_color_selection (GtkWidget *widget)
       GtkWidget *picker;
       GtkWidget *hbox;
       GtkWidget *label;
-      
+
       window = gtk_window_new ();
-      gtk_window_set_display (GTK_WINDOW (window), 
-                             gtk_widget_get_display (widget));
-                            
-      g_signal_connect (window, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                        &window);
+      gtk_window_set_display (GTK_WINDOW (window),
+                              gtk_widget_get_display (widget));
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
 
@@ -3297,11 +3241,8 @@ create_flipping (GtkWidget *widget)
       window = gtk_dialog_new ();
 
       gtk_window_set_display (GTK_WINDOW (window),
-                             gtk_widget_get_display (widget));
-
-      g_signal_connect (window, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &window);
+                              gtk_widget_get_display (widget));
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
 
@@ -3358,11 +3299,8 @@ create_font_selection (GtkWidget *widget)
       
       window = gtk_window_new ();
       gtk_window_set_display (GTK_WINDOW (window),
-                             gtk_widget_get_display (widget));
-
-      g_signal_connect (window, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &window);
+                              gtk_widget_get_display (widget));
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
 
@@ -3440,12 +3378,8 @@ create_dialog (GtkWidget *widget)
       
       dialog_window = gtk_dialog_new ();
       gtk_window_set_display (GTK_WINDOW (dialog_window),
-                             gtk_widget_get_display (widget));
-
-      g_signal_connect (dialog_window, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &dialog_window);
-
+                              gtk_widget_get_display (widget));
+      g_object_add_weak_pointer (G_OBJECT (dialog_window), (gpointer *)&dialog_window);
 
       gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
 
@@ -3627,11 +3561,8 @@ create_range_controls (GtkWidget *widget)
       window = gtk_window_new ();
 
       gtk_window_set_display (GTK_WINDOW (window),
-                             gtk_widget_get_display (widget));
-
-      g_signal_connect (window, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &window);
+                              gtk_widget_get_display (widget));
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       gtk_window_set_title (GTK_WINDOW (window), "range controls");
 
@@ -4008,11 +3939,8 @@ create_notebook (GtkWidget *widget)
     {
       window = gtk_window_new ();
       gtk_window_set_display (GTK_WINDOW (window),
-                             gtk_widget_get_display (widget));
-
-      g_signal_connect (window, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &window);
+                              gtk_widget_get_display (widget));
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       gtk_window_set_title (GTK_WINDOW (window), "notebook");
 
@@ -4207,11 +4135,8 @@ create_panes (GtkWidget *widget)
       window = gtk_window_new ();
 
       gtk_window_set_display (GTK_WINDOW (window),
-                             gtk_widget_get_display (widget));
-      
-      g_signal_connect (window, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &window);
+                              gtk_widget_get_display (widget));
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       gtk_window_set_title (GTK_WINDOW (window), "Panes");
 
@@ -4577,33 +4502,25 @@ create_paned_keyboard_navigation (GtkWidget *widget)
   if (!window1)
     {
       window1 = paned_keyboard_window1 (widget);
-      g_signal_connect (window1, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &window1);
+      g_object_add_weak_pointer (G_OBJECT (window1), (gpointer *)&window1);
     }
 
   if (!window2)
     {
       window2 = paned_keyboard_window2 (widget);
-      g_signal_connect (window2, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &window2);
+      g_object_add_weak_pointer (G_OBJECT (window2), (gpointer *)&window2);
     }
 
   if (!window3)
     {
       window3 = paned_keyboard_window3 (widget);
-      g_signal_connect (window3, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &window3);
+      g_object_add_weak_pointer (G_OBJECT (window3), (gpointer *)&window3);
     }
 
   if (!window4)
     {
       window4 = paned_keyboard_window4 (widget);
-      g_signal_connect (window4, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &window4);
+      g_object_add_weak_pointer (G_OBJECT (window4), (gpointer *)&window4);
     }
 
   if (gtk_widget_get_visible (window1))
@@ -4649,11 +4566,8 @@ create_wmhints (GtkWidget *widget)
       window = gtk_window_new ();
 
       gtk_window_set_display (GTK_WINDOW (window),
-                             gtk_widget_get_display (widget));
-      
-      g_signal_connect (window, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &window);
+                              gtk_widget_get_display (widget));
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
 
@@ -4892,11 +4806,8 @@ create_surface_states (GtkWidget *widget)
     {
       window = gtk_window_new ();
       gtk_window_set_display (GTK_WINDOW (window),
-                             gtk_widget_get_display (widget));
-
-      g_signal_connect (window, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &window);
+                              gtk_widget_get_display (widget));
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
 
       gtk_window_set_title (GTK_WINDOW (window), "Window states");
       
@@ -5167,17 +5078,12 @@ create_window_sizing (GtkWidget *widget)
       gtk_label_set_markup (GTK_LABEL (label), "<span foreground=\"purple\"><big>Window being 
resized</big></span>\nBlah blah blah blah\nblah blah blah\nblah blah blah blah blah");
       gtk_container_add (GTK_CONTAINER (target_window), label);
       gtk_widget_show (label);
-      
-      g_signal_connect (target_window, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &target_window);
+
+      g_object_add_weak_pointer (G_OBJECT (target_window), (gpointer *)&target_window);
 
       window = window_controls (target_window);
-      
-      g_signal_connect (window, "destroy",
-                       G_CALLBACK (gtk_widget_destroyed),
-                       &window);
-      
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
+
       gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
     }
 
@@ -5925,9 +5831,7 @@ create_native_dialogs (GtkWidget *widget)
       g_signal_connect (native, "notify::visible",
                         G_CALLBACK (native_visible_notify_hide), hide_button);
 
-      g_signal_connect (window, "destroy",
-                        G_CALLBACK (gtk_widget_destroyed),
-                        &window);
+      g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
     }
 
   if (!gtk_widget_get_visible (window))


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]