Make widget property setters behave
authorMatthias Clasen <mclasen@redhat.com>
Thu, 30 Mar 2023 21:32:38 +0000 (17:32 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 30 Mar 2023 21:32:38 +0000 (17:32 -0400)
We want to allow setting a property to its
current value, while still having a precondition
for widget->parent being NULL otherwise.

25 files changed:
gtk/deprecated/gtkcombobox.c
gtk/gtkaspectframe.c
gtk/gtkbutton.c
gtk/gtkcenterbox.c
gtk/gtkcheckbutton.c
gtk/gtkdragicon.c
gtk/gtkexpander.c
gtk/gtkflowbox.c
gtk/gtkframe.c
gtk/gtkheaderbar.c
gtk/gtklabel.c
gtk/gtklistbox.c
gtk/gtklistitem.c
gtk/gtkmenubutton.c
gtk/gtkoverlay.c
gtk/gtkpaned.c
gtk/gtkpopover.c
gtk/gtkrevealer.c
gtk/gtkscrolledwindow.c
gtk/gtksearchbar.c
gtk/gtktreeexpander.c
gtk/gtkviewport.c
gtk/gtkwindow.c
gtk/gtkwindowhandle.c
testsuite/gtk/notify.c

index 1e76b38f417f251d6f631ab2035154614c3dc9d8..2be8d3b7849e76a82e344e6633b5b412b902e3f6 100644 (file)
@@ -3033,7 +3033,7 @@ gtk_combo_box_set_child (GtkComboBox *combo_box,
   GtkComboBoxPrivate *priv = gtk_combo_box_get_instance_private (combo_box);
 
   g_return_if_fail (GTK_IS_COMBO_BOX (combo_box));
-  g_return_if_fail (child == NULL || GTK_IS_WIDGET (child));
+  g_return_if_fail (child == NULL || gtk_widget_get_parent (child) == NULL);
 
   if (priv->child)
     gtk_combo_box_remove (combo_box, priv->child);
index 1cc3dba04ba35c615da327ad3d2f763f3471bfdd..468c123d6f8e2f49152d7e9ba65ab25b6af476a9 100644 (file)
@@ -640,7 +640,7 @@ gtk_aspect_frame_set_child (GtkAspectFrame  *self,
                             GtkWidget       *child)
 {
   g_return_if_fail (GTK_IS_ASPECT_FRAME (self));
-  g_return_if_fail (child == NULL || GTK_IS_WIDGET (child));
+  g_return_if_fail (child == NULL || self->child == child || gtk_widget_get_parent (child) == NULL);
 
   if (self->child == child)
     return;
index d85586c82ebe1387494e7641c0fdde557f029b73..e0038973d3a7710b7c52e6dbf6994876b9fd967e 100644 (file)
@@ -1034,7 +1034,10 @@ gtk_button_set_child (GtkButton *button,
   GtkButtonPrivate *priv = gtk_button_get_instance_private (button);
 
   g_return_if_fail (GTK_IS_BUTTON (button));
-  g_return_if_fail (child == NULL || GTK_IS_WIDGET (child));
+  g_return_if_fail (child == NULL || priv->child == child || gtk_widget_get_parent (child) == NULL);
+
+  if (priv->child == child)
+    return;
 
   g_clear_pointer (&priv->child, gtk_widget_unparent);
 
index 97bce166989b474d1d1c9e7542e091d2cc3ff041..367c0eab0bfe084182d9b58780f347e5e14b62ae 100644 (file)
@@ -332,6 +332,12 @@ gtk_center_box_set_start_widget (GtkCenterBox *self,
 {
   GtkLayoutManager *layout_manager;
 
+  g_return_if_fail (GTK_IS_CENTER_BOX (self));
+  g_return_if_fail (child == NULL || self->start_widget == child || gtk_widget_get_parent (child) == NULL);
+
+  if (self->start_widget == child)
+    return;
+
   if (self->start_widget)
     gtk_widget_unparent (self->start_widget);
 
@@ -360,6 +366,12 @@ gtk_center_box_set_center_widget (GtkCenterBox *self,
 {
   GtkLayoutManager *layout_manager;
 
+  g_return_if_fail (GTK_IS_CENTER_BOX (self));
+  g_return_if_fail (child == NULL || self->center_widget == child || gtk_widget_get_parent (child) == NULL);
+
+  if (self->center_widget == child)
+    return;
+
   if (self->center_widget)
     gtk_widget_unparent (self->center_widget);
 
@@ -388,6 +400,12 @@ gtk_center_box_set_end_widget (GtkCenterBox *self,
 {
   GtkLayoutManager *layout_manager;
 
+  g_return_if_fail (GTK_IS_CENTER_BOX (self));
+  g_return_if_fail (child == NULL || self->end_widget == child || gtk_widget_get_parent (child) == NULL);
+
+  if (self->end_widget == child)
+    return;
+
   if (self->end_widget)
     gtk_widget_unparent (self->end_widget);
 
index b639f78faa5e0939ecc388841b5158d0f3445f46..aa5af6fcfa725137ea2c27eabbabf591957ea055 100644 (file)
@@ -1129,8 +1129,13 @@ void
 gtk_check_button_set_child (GtkCheckButton *button,
                             GtkWidget      *child)
 {
+  GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (button);
+
   g_return_if_fail (GTK_IS_CHECK_BUTTON (button));
-  g_return_if_fail (child == NULL || GTK_IS_WIDGET (child));
+  g_return_if_fail (child == NULL || priv->child == child || gtk_widget_get_parent (child) == NULL);
+
+  if (priv->child == child)
+    return;
 
   g_object_freeze_notify (G_OBJECT (button));
 
index 4035725e250b66ff2d6765f0ffd8039f19da6957..afcfdf717fa3f4ad17072081b94913f3da4c5545 100644 (file)
@@ -480,7 +480,7 @@ gtk_drag_icon_set_child (GtkDragIcon *self,
                          GtkWidget   *child)
 {
   g_return_if_fail (GTK_IS_DRAG_ICON (self));
-  g_return_if_fail (child == NULL || GTK_IS_WIDGET (child));
+  g_return_if_fail (child == NULL || gtk_widget_get_parent (child) == NULL);
 
   if (self->child == child)
     return;
index 6b233ebe5967183c4eb031a970e5a2952eb90d01..05e20279d5cd600a3dff46c51e494bd4ee0fa5d1 100644 (file)
@@ -361,7 +361,7 @@ gtk_expander_class_init (GtkExpanderClass *klass)
                                    PROP_LABEL_WIDGET,
                                    g_param_spec_object ("label-widget", NULL, NULL,
                                                         GTK_TYPE_WIDGET,
-                                                        GTK_PARAM_READWRITE));
+                                                        GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY));
 
   /**
    * GtkExpander:resize-toplevel: (attributes org.gtk.Property.get=gtk_expander_get_resize_toplevel org.gtk.Property.set=gtk_expander_set_resize_toplevel)
@@ -384,7 +384,7 @@ gtk_expander_class_init (GtkExpanderClass *klass)
                                    PROP_CHILD,
                                    g_param_spec_object ("child", NULL, NULL,
                                                         GTK_TYPE_WIDGET,
-                                                        GTK_PARAM_READWRITE));
+                                                        GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY));
 
   /**
    * GtkExpander::activate:
@@ -1091,8 +1091,7 @@ gtk_expander_set_label_widget (GtkExpander *expander,
   GtkWidget *widget;
 
   g_return_if_fail (GTK_IS_EXPANDER (expander));
-  g_return_if_fail (label_widget == NULL || GTK_IS_WIDGET (label_widget));
-  g_return_if_fail (label_widget == NULL || gtk_widget_get_parent (label_widget) == NULL);
+  g_return_if_fail (label_widget == NULL || expander->label_widget == label_widget || gtk_widget_get_parent (label_widget) == NULL);
 
   if (expander->label_widget == label_widget)
     return;
@@ -1185,7 +1184,7 @@ gtk_expander_set_child (GtkExpander *expander,
                         GtkWidget   *child)
 {
   g_return_if_fail (GTK_IS_EXPANDER (expander));
-  g_return_if_fail (child == NULL || GTK_IS_WIDGET (child));
+  g_return_if_fail (child == NULL || expander->child == child || gtk_widget_get_parent (child) == NULL);
 
   if (expander->child == child)
     return;
index 5b6c8088a115b8885a262160567ab9c20703fa19..8650c5a51edf33f77b9166e86adbdab9af957d78 100644 (file)
@@ -597,6 +597,12 @@ gtk_flow_box_child_set_child (GtkFlowBoxChild *self,
 {
   GtkFlowBoxChildPrivate *priv = CHILD_PRIV (self);
 
+  g_return_if_fail (GTK_IS_FLOW_BOX_CHILD (self));
+  g_return_if_fail (child == NULL || priv->child == child || gtk_widget_get_parent (child) == NULL);
+
+  if (priv->child == child)
+    return;
+
   g_clear_pointer (&priv->child, gtk_widget_unparent);
 
   priv->child = child;
index 9ec452b25983c5953f681e5c84609bdba3f2202f..041e05c91c5e878375f064d87ba2c6bbc2a400c7 100644 (file)
@@ -188,7 +188,7 @@ gtk_frame_class_init (GtkFrameClass *class)
   frame_props[PROP_LABEL_WIDGET] =
       g_param_spec_object ("label-widget", NULL, NULL,
                            GTK_TYPE_WIDGET,
-                           GTK_PARAM_READWRITE);
+                           GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
 
   /**
    * GtkFrame:child: (attributes org.gtk.Property.get=gtk_frame_get_child org.gtk.Property.set=gtk_frame_set_child)
@@ -198,7 +198,7 @@ gtk_frame_class_init (GtkFrameClass *class)
   frame_props[PROP_CHILD] =
       g_param_spec_object ("child", NULL, NULL,
                            GTK_TYPE_WIDGET,
-                           GTK_PARAM_READWRITE);
+                           GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
 
   g_object_class_install_properties (gobject_class, LAST_PROP, frame_props);
 
@@ -408,8 +408,7 @@ gtk_frame_set_label_widget (GtkFrame  *frame,
   GtkFramePrivate *priv = gtk_frame_get_instance_private (frame);
 
   g_return_if_fail (GTK_IS_FRAME (frame));
-  g_return_if_fail (label_widget == NULL || GTK_IS_WIDGET (label_widget));
-  g_return_if_fail (label_widget == NULL || gtk_widget_get_parent (label_widget) == NULL);
+  g_return_if_fail (label_widget == NULL || priv->label_widget == label_widget || gtk_widget_get_parent (label_widget) == NULL);
 
   if (priv->label_widget == label_widget)
     return;
@@ -669,7 +668,7 @@ gtk_frame_set_child (GtkFrame  *frame,
   GtkFramePrivate *priv = gtk_frame_get_instance_private (frame);
 
   g_return_if_fail (GTK_IS_FRAME (frame));
-  g_return_if_fail (child == NULL || GTK_IS_WIDGET (child));
+  g_return_if_fail (child == NULL || priv->child == child || gtk_widget_get_parent (child) == NULL);
 
   if (priv->child == child)
     return;
index 671ab59f0b7db371ea2cc611ab0ad7b332310995..b0c0963254993150f035022eeb3977ba5b3d683c 100644 (file)
@@ -300,8 +300,7 @@ gtk_header_bar_set_title_widget (GtkHeaderBar *bar,
                                  GtkWidget    *title_widget)
 {
   g_return_if_fail (GTK_IS_HEADER_BAR (bar));
-  if (title_widget)
-    g_return_if_fail (GTK_IS_WIDGET (title_widget));
+  g_return_if_fail (title_widget == NULL || bar->title_widget == title_widget || gtk_widget_get_parent (title_widget) == NULL);
 
   /* No need to do anything if the title widget stays the same */
   if (bar->title_widget == title_widget)
@@ -564,7 +563,7 @@ gtk_header_bar_class_init (GtkHeaderBarClass *class)
   header_bar_props[PROP_TITLE_WIDGET] =
       g_param_spec_object ("title-widget", NULL, NULL,
                            GTK_TYPE_WIDGET,
-                           G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS);
+                           G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS|G_PARAM_EXPLICIT_NOTIFY);
 
   /**
    * GtkHeaderBar:show-title-buttons: (attributes org.gtk.Property.get=gtk_header_bar_get_show_title_buttons org.gtk.Property.set=gtk_header_bar_set_show_title_buttons)
index c5ca7ca0955955fa585a89b4e43381c3e1f4bb37..b8176df8461f86ea9d2ffda4b0395f1a92905440 100644 (file)
@@ -2489,7 +2489,7 @@ gtk_label_class_init (GtkLabelClass *class)
   label_props[PROP_MNEMONIC_WIDGET] =
       g_param_spec_object ("mnemonic-widget", NULL, NULL,
                            GTK_TYPE_WIDGET,
-                           GTK_PARAM_READWRITE);
+                           GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
 
   /**
    * GtkLabel:ellipsize: (attributes org.gtk.Property.get=gtk_label_get_ellipsize org.gtk.Property.set=gtk_label_set_ellipsize)
@@ -2980,9 +2980,10 @@ gtk_label_set_mnemonic_widget (GtkLabel  *self,
                                GtkWidget *widget)
 {
   g_return_if_fail (GTK_IS_LABEL (self));
+  g_return_if_fail (widget == NULL || GTK_IS_WIDGET (widget));
 
-  if (widget)
-    g_return_if_fail (GTK_IS_WIDGET (widget));
+  if (self->mnemonic_widget == widget)
+    return;
 
   if (self->mnemonic_widget)
     {
index b449051f1bffee28da5487d4b6a912aa8f32fd3d..18dad80889a989bcb496e2c101403dbd22789693 100644 (file)
@@ -2956,6 +2956,12 @@ gtk_list_box_row_set_child (GtkListBoxRow *row,
 {
   GtkListBoxRowPrivate *priv = ROW_PRIV (row);
 
+  g_return_if_fail (GTK_IS_LIST_BOX_ROW (row));
+  g_return_if_fail (child == NULL || priv->child == child || gtk_widget_get_parent (child) == NULL);
+
+  if (priv->child == child)
+    return;
+
   g_clear_pointer (&priv->child, gtk_widget_unparent);
 
   priv->child = child;
index 2c54ed976d0fea19739eef572b80e28712ccede4..a44752a4daf7381dc510040dd7f811c7e07212a6 100644 (file)
@@ -304,7 +304,7 @@ gtk_list_item_set_child (GtkListItem *self,
                          GtkWidget   *child)
 {
   g_return_if_fail (GTK_IS_LIST_ITEM (self));
-  g_return_if_fail (child == NULL || GTK_IS_WIDGET (child));
+  g_return_if_fail (child == NULL || gtk_widget_get_parent (child) == NULL);
 
   if (self->child == child)
     return;
index 872be35f1d490a0a79f74286c63a2fa4fea3167a..ad723aa38bd8ae258d597d0d207ae3c085e12200 100644 (file)
@@ -1472,7 +1472,10 @@ gtk_menu_button_set_child (GtkMenuButton *menu_button,
   GtkWidget *box, *arrow;
 
   g_return_if_fail (GTK_IS_MENU_BUTTON (menu_button));
-  g_return_if_fail (child == NULL || GTK_IS_WIDGET (child));
+  g_return_if_fail (child == NULL || menu_button->child == child || gtk_widget_get_parent (child) == NULL);
+
+  if (menu_button->child == child)
+    return;
 
   g_object_freeze_notify (G_OBJECT (menu_button));
 
@@ -1487,7 +1490,8 @@ gtk_menu_button_set_child (GtkMenuButton *menu_button,
   arrow = gtk_builtin_icon_new ("arrow");
   menu_button->arrow_widget = arrow;
 
-  gtk_box_append (GTK_BOX (box), child);
+  if (child)
+    gtk_box_append (GTK_BOX (box), child);
   gtk_box_append (GTK_BOX (box), arrow);
   gtk_button_set_child (GTK_BUTTON (menu_button->button), box);
 
index 4def628f1c1a69cabfc62e042a53b1a2883c60ad..43286c0624edd6b7ab572e9147c1efed11d64eef 100644 (file)
@@ -570,7 +570,10 @@ gtk_overlay_set_child (GtkOverlay *overlay,
                        GtkWidget  *child)
 {
   g_return_if_fail (GTK_IS_OVERLAY (overlay));
-  g_return_if_fail (child == NULL || GTK_IS_WIDGET (child));
+  g_return_if_fail (child == NULL || overlay->child == child || gtk_widget_get_parent (child) == NULL);
+
+  if (overlay->child == child)
+    return;
 
   g_clear_pointer (&overlay->child, gtk_widget_unparent);
 
index 1d5aebe5bf2db6dfa4ba6d5f1d986198307a07d5..88aed6675e4e893103e372aaae8615e372cab2b0 100644 (file)
@@ -1574,11 +1574,14 @@ gtk_paned_new (GtkOrientation orientation)
  * If @child is `NULL`, the existing child will be removed.
  */
 void
-gtk_paned_set_start_child (GtkPaned *paned,
+gtk_paned_set_start_child (GtkPaned  *paned,
                            GtkWidget *child)
 {
   g_return_if_fail (GTK_IS_PANED (paned));
-  g_return_if_fail (child == NULL || GTK_IS_WIDGET (child));
+  g_return_if_fail (child == NULL || paned->start_child == child || gtk_widget_get_parent (child) == NULL);
+
+  if (paned->start_child == child)
+    return;
 
   g_clear_pointer (&paned->start_child, gtk_widget_unparent);
 
@@ -1691,11 +1694,14 @@ gtk_paned_get_shrink_start_child (GtkPaned *paned)
  * If @child is `NULL`, the existing child will be removed.
  */
 void
-gtk_paned_set_end_child (GtkPaned *paned,
+gtk_paned_set_end_child (GtkPaned  *paned,
                          GtkWidget *child)
 {
   g_return_if_fail (GTK_IS_PANED (paned));
-  g_return_if_fail (child == NULL || GTK_IS_WIDGET (child));
+  g_return_if_fail (child == NULL || paned->end_child == child || gtk_widget_get_parent (child) == NULL);
+
+  if (paned->end_child == child)
+    return;
 
   g_clear_pointer (&paned->end_child, gtk_widget_unparent);
 
index 9aafd1e69886432fec6f22f69a6edacc69eab1e1..9b62721fac18c31163a1ae0e84f0f51aa7126848 100644 (file)
@@ -2009,7 +2009,7 @@ gtk_popover_set_child (GtkPopover *popover,
   GtkPopoverPrivate *priv = gtk_popover_get_instance_private (popover);
 
   g_return_if_fail (GTK_IS_POPOVER (popover));
-  g_return_if_fail (child == NULL || GTK_IS_WIDGET (child));
+  g_return_if_fail (child == NULL || priv->child == child || gtk_widget_get_parent (child) == NULL);
 
   if (priv->child == child)
     return;
index c0a9938a559e42f9bd3b4732e3721a163389ad27..daae048326e242a9a594fc7c46b192fa1857ed2a 100644 (file)
@@ -864,7 +864,10 @@ gtk_revealer_set_child (GtkRevealer *revealer,
                         GtkWidget   *child)
 {
   g_return_if_fail (GTK_IS_REVEALER (revealer));
-  g_return_if_fail (child == NULL || GTK_IS_WIDGET (child));
+  g_return_if_fail (child == NULL || revealer->child == child || gtk_widget_get_parent (child) == NULL);
+
+  if (revealer->child == child)
+    return;
 
   g_clear_pointer (&revealer->child, gtk_widget_unparent);
 
index be3ab0d4fc1f7d0ae025569e3fbe9518b1788811..40e4379f694524d9d33b81b632245771bf07d7fb 100644 (file)
@@ -4190,6 +4190,14 @@ gtk_scrolled_window_set_child (GtkScrolledWindow *scrolled_window,
   GtkWidget *scrollable_child;
 
   g_return_if_fail (GTK_IS_SCROLLED_WINDOW (scrolled_window));
+  g_return_if_fail (child == NULL ||
+                    priv->child == child ||
+                    (priv->auto_added_viewport && gtk_viewport_get_child (GTK_VIEWPORT (priv->child)) == child) ||
+                    gtk_widget_get_parent (child) == NULL);
+
+  if (priv->child == child ||
+      (priv->auto_added_viewport && gtk_viewport_get_child (GTK_VIEWPORT (priv->child)) == child))
+    return;
 
   if (priv->child)
     {
index bac90c46321ee1cc9ce414f462ab301f3ae9b74a..0e2c0be83cf66b9d0cada85c5ac02a0d21179900 100644 (file)
@@ -675,6 +675,12 @@ void
 gtk_search_bar_set_child (GtkSearchBar *bar,
                           GtkWidget    *child)
 {
+  g_return_if_fail (GTK_IS_SEARCH_BAR (bar));
+  g_return_if_fail (child == NULL || bar->child == child || gtk_widget_get_parent (child) == NULL);
+
+  if (bar->child == child)
+    return;
+
   if (bar->child)
     {
       if (GTK_IS_EDITABLE (bar->child))
index d4dbfe9596d2413acecf976feaf0932304a3e5ca..86230e40282d9594a93197eaf487ec008d369af8 100644 (file)
@@ -782,7 +782,7 @@ gtk_tree_expander_set_child (GtkTreeExpander *self,
                              GtkWidget       *child)
 {
   g_return_if_fail (GTK_IS_TREE_EXPANDER (self));
-  g_return_if_fail (child == NULL || GTK_IS_WIDGET (child));
+  g_return_if_fail (child == NULL || self->child == child || gtk_widget_get_parent (child) == NULL);
 
   if (self->child == child)
     return;
index a92d7f62f3fefc65d13d124cb1dae0a7f510d623..443fec57ee262edc882defbedd7333af128984d8 100644 (file)
@@ -331,7 +331,7 @@ gtk_viewport_class_init (GtkViewportClass *class)
                                    PROP_CHILD,
                                    g_param_spec_object ("child", NULL, NULL,
                                                         GTK_TYPE_WIDGET,
-                                                        GTK_PARAM_READWRITE));
+                                                        GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY));
 
   gtk_widget_class_set_css_name (widget_class, I_("viewport"));
   gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_GROUP);
@@ -686,7 +686,7 @@ gtk_viewport_set_child (GtkViewport *viewport,
                         GtkWidget   *child)
 {
   g_return_if_fail (GTK_IS_VIEWPORT (viewport));
-  g_return_if_fail (child == NULL || GTK_IS_WIDGET (child));
+  g_return_if_fail (child == NULL || viewport->child == child || gtk_widget_get_parent (child) == NULL);
 
   if (viewport->child == child)
     return;
index 75b9af1e2b9ecbc97c908da6796eb82d034fa0ce..6f685c355cd29a0153f628cb8f671223d9ff4fc2 100644 (file)
@@ -6628,7 +6628,10 @@ gtk_window_set_child (GtkWindow *window,
   GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
 
   g_return_if_fail (GTK_IS_WINDOW (window));
-  g_return_if_fail (child == NULL || GTK_IS_WIDGET (child));
+  g_return_if_fail (child == NULL || priv->child == child || gtk_widget_get_parent (child) == NULL);
+
+  if (priv->child == child)
+    return;
 
   g_clear_pointer (&priv->child, gtk_widget_unparent);
 
index adfdb8b063b9533ea70a8db101740b24d4884d02..56594d8714a711d0e883f90d431ada0a475f5729 100644 (file)
@@ -625,7 +625,7 @@ gtk_window_handle_set_child (GtkWindowHandle *self,
                              GtkWidget       *child)
 {
   g_return_if_fail (GTK_IS_WINDOW_HANDLE (self));
-  g_return_if_fail (child == NULL || GTK_IS_WIDGET (child));
+  g_return_if_fail (child == NULL || self->child == child || gtk_widget_get_parent (child) == NULL);
 
   if (self->child == child)
     return;
index 582136bfebc25f49b4e1e8c508507ea669e0cf14..8ee7df88f1b7097d0d0757efecad0af0209ea180 100644 (file)
@@ -357,6 +357,12 @@ check_property (GObject *instance, GParamSpec *pspec)
       g_object_set (instance, pspec->name, value, NULL);
       assert_notifies (instance, pspec->name, data.count, 1);
 
+      g_object_set (instance, pspec->name, value, NULL);
+      assert_notifies (instance, pspec->name, data.count, 1);
+
+      g_object_set (instance, pspec->name, NULL, NULL);
+      assert_notifies (instance, pspec->name, data.count, 2);
+
       g_signal_handler_disconnect (instance, id);
     }
   else
@@ -659,25 +665,29 @@ test_type (gconstpointer data)
           g_str_equal (pspec->name, "expanded"))
         continue;
 
-       /* can't select items without an underlying, populated model */
-       if (g_type_is_a (type, GTK_TYPE_SINGLE_SELECTION) &&
-           (g_str_equal (pspec->name, "selected") ||
-            g_str_equal (pspec->name, "selected-item")))
-         continue;
+      /* can't select items without an underlying, populated model */
+      if (g_type_is_a (type, GTK_TYPE_SINGLE_SELECTION) &&
+          (g_str_equal (pspec->name, "selected") ||
+           g_str_equal (pspec->name, "selected-item")))
+        continue;
 
-       /* can't select items without an underlying, populated model */
-       if (g_type_is_a (type, GTK_TYPE_DROP_DOWN) &&
-           g_str_equal (pspec->name, "selected"))
-         continue;
+      /* can't select items without an underlying, populated model */
+      if (g_type_is_a (type, GTK_TYPE_DROP_DOWN) &&
+          g_str_equal (pspec->name, "selected"))
+        continue;
 
        /* can't set position without a notebook */
-       if (g_type_is_a (type, GTK_TYPE_NOTEBOOK_PAGE) &&
-           g_str_equal (pspec->name, "position"))
-         continue;
+      if (g_type_is_a (type, GTK_TYPE_NOTEBOOK_PAGE) &&
+          g_str_equal (pspec->name, "position"))
+        continue;
 
        /* This one is special */
-       if (g_str_equal (pspec->name, "focus-widget"))
-         continue;
+      if (g_str_equal (pspec->name, "focus-widget"))
+        continue;
+
+      if (pspec->owner_type == GTK_TYPE_TREE_VIEW_COLUMN &&
+          g_str_equal (pspec->name, "widget"))
+        continue;
 
       if (g_test_verbose ())
         g_print ("Property %s.%s\n", g_type_name (pspec->owner_type), pspec->name);