diff --git a/gtk/deprecated/gtkcombobox.c b/gtk/deprecated/gtkcombobox.c index 1e76b38f41..2be8d3b784 100644 --- a/gtk/deprecated/gtkcombobox.c +++ b/gtk/deprecated/gtkcombobox.c @@ -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); diff --git a/gtk/gtkaspectframe.c b/gtk/gtkaspectframe.c index 1cc3dba04b..468c123d6f 100644 --- a/gtk/gtkaspectframe.c +++ b/gtk/gtkaspectframe.c @@ -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; diff --git a/gtk/gtkbutton.c b/gtk/gtkbutton.c index d85586c82e..e0038973d3 100644 --- a/gtk/gtkbutton.c +++ b/gtk/gtkbutton.c @@ -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); diff --git a/gtk/gtkcenterbox.c b/gtk/gtkcenterbox.c index 97bce16698..367c0eab0b 100644 --- a/gtk/gtkcenterbox.c +++ b/gtk/gtkcenterbox.c @@ -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); diff --git a/gtk/gtkcheckbutton.c b/gtk/gtkcheckbutton.c index b639f78faa..aa5af6fcfa 100644 --- a/gtk/gtkcheckbutton.c +++ b/gtk/gtkcheckbutton.c @@ -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)); diff --git a/gtk/gtkdragicon.c b/gtk/gtkdragicon.c index 4035725e25..afcfdf717f 100644 --- a/gtk/gtkdragicon.c +++ b/gtk/gtkdragicon.c @@ -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; diff --git a/gtk/gtkexpander.c b/gtk/gtkexpander.c index 6b233ebe59..05e20279d5 100644 --- a/gtk/gtkexpander.c +++ b/gtk/gtkexpander.c @@ -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; diff --git a/gtk/gtkflowbox.c b/gtk/gtkflowbox.c index 5b6c8088a1..8650c5a51e 100644 --- a/gtk/gtkflowbox.c +++ b/gtk/gtkflowbox.c @@ -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; diff --git a/gtk/gtkframe.c b/gtk/gtkframe.c index 9ec452b259..041e05c91c 100644 --- a/gtk/gtkframe.c +++ b/gtk/gtkframe.c @@ -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; diff --git a/gtk/gtkheaderbar.c b/gtk/gtkheaderbar.c index 671ab59f0b..b0c0963254 100644 --- a/gtk/gtkheaderbar.c +++ b/gtk/gtkheaderbar.c @@ -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) diff --git a/gtk/gtklabel.c b/gtk/gtklabel.c index c5ca7ca095..b8176df846 100644 --- a/gtk/gtklabel.c +++ b/gtk/gtklabel.c @@ -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) { diff --git a/gtk/gtklistbox.c b/gtk/gtklistbox.c index b449051f1b..18dad80889 100644 --- a/gtk/gtklistbox.c +++ b/gtk/gtklistbox.c @@ -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; diff --git a/gtk/gtklistitem.c b/gtk/gtklistitem.c index 6a357b3dd3..a44752a4da 100644 --- a/gtk/gtklistitem.c +++ b/gtk/gtklistitem.c @@ -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; @@ -320,7 +320,7 @@ gtk_list_item_set_child (GtkListItem *self, if (self->owner) gtk_list_item_widget_set_child (self->owner, child); - g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_ITEM]); + g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_CHILD]); } /** diff --git a/gtk/gtkmenubutton.c b/gtk/gtkmenubutton.c index 872be35f1d..ad723aa38b 100644 --- a/gtk/gtkmenubutton.c +++ b/gtk/gtkmenubutton.c @@ -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); diff --git a/gtk/gtkoverlay.c b/gtk/gtkoverlay.c index 4def628f1c..43286c0624 100644 --- a/gtk/gtkoverlay.c +++ b/gtk/gtkoverlay.c @@ -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); diff --git a/gtk/gtkpaned.c b/gtk/gtkpaned.c index 1d5aebe5bf..88aed6675e 100644 --- a/gtk/gtkpaned.c +++ b/gtk/gtkpaned.c @@ -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); diff --git a/gtk/gtkpopover.c b/gtk/gtkpopover.c index 9aafd1e698..9b62721fac 100644 --- a/gtk/gtkpopover.c +++ b/gtk/gtkpopover.c @@ -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; diff --git a/gtk/gtkrevealer.c b/gtk/gtkrevealer.c index c0a9938a55..daae048326 100644 --- a/gtk/gtkrevealer.c +++ b/gtk/gtkrevealer.c @@ -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); diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c index be3ab0d4fc..40e4379f69 100644 --- a/gtk/gtkscrolledwindow.c +++ b/gtk/gtkscrolledwindow.c @@ -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) { diff --git a/gtk/gtksearchbar.c b/gtk/gtksearchbar.c index bac90c4632..0e2c0be83c 100644 --- a/gtk/gtksearchbar.c +++ b/gtk/gtksearchbar.c @@ -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)) diff --git a/gtk/gtktreeexpander.c b/gtk/gtktreeexpander.c index d4dbfe9596..86230e4028 100644 --- a/gtk/gtktreeexpander.c +++ b/gtk/gtktreeexpander.c @@ -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; diff --git a/gtk/gtkviewport.c b/gtk/gtkviewport.c index a92d7f62f3..443fec57ee 100644 --- a/gtk/gtkviewport.c +++ b/gtk/gtkviewport.c @@ -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; diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index 75b9af1e2b..6f685c355c 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -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); diff --git a/gtk/gtkwindowhandle.c b/gtk/gtkwindowhandle.c index adfdb8b063..56594d8714 100644 --- a/gtk/gtkwindowhandle.c +++ b/gtk/gtkwindowhandle.c @@ -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; diff --git a/testsuite/gtk/notify.c b/testsuite/gtk/notify.c index 9907851c5d..8ee7df88f1 100644 --- a/testsuite/gtk/notify.c +++ b/testsuite/gtk/notify.c @@ -86,7 +86,7 @@ check_property (GObject *instance, GParamSpec *pspec) first = 1; else first = 0; - + for (i = first; i < class->n_values; i++) { current_count = data.count + 1; @@ -161,7 +161,7 @@ check_property (GObject *instance, GParamSpec *pspec) assert_notifies (instance, pspec->name, data.count, 1); g_signal_handler_disconnect (instance, id); - } + } else if (pspec->value_type == G_TYPE_INT) { GParamSpecInt *p = G_PARAM_SPEC_INT (pspec); @@ -283,7 +283,7 @@ check_property (GObject *instance, GParamSpec *pspec) /* don't check redundant notifications */ g_object_get (instance, pspec->name, &value, NULL); - + if (p->maximum > 100 || p->minimum < -100) delta = M_PI; else @@ -323,7 +323,7 @@ check_property (GObject *instance, GParamSpec *pspec) /* don't check redundant notifications */ g_object_get (instance, pspec->name, &value, NULL); - + new_value = p->minimum; for (i = 0; i < 10; i++) { @@ -340,6 +340,29 @@ check_property (GObject *instance, GParamSpec *pspec) assert_notifies (instance, pspec->name, data.count, current_count); } + g_signal_handler_disconnect (instance, id); + } + else if (pspec->value_type == GTK_TYPE_WIDGET) + { + NotifyData data; + gulong id; + GtkWidget *value; + + data.name = pspec->name; + data.count = 0; + id = g_signal_connect (instance, "notify", G_CALLBACK (count_notify), &data); + + value = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + + 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 @@ -376,11 +399,6 @@ test_type (gconstpointer data) if (g_str_equal (g_type_name (type), "GdkPixbufSimpleAnim")) return; - /* Deprecated, not getting fixed */ - if (g_str_equal (g_type_name (type), "GtkColorSelection") || - g_str_equal (g_type_name (type), "GtkNumerableIcon")) - return; - /* These can't be freely constructed/destroyed */ if (g_type_is_a (type, GTK_TYPE_APPLICATION) || g_type_is_a (type, GDK_TYPE_PIXBUF_LOADER) || @@ -396,36 +414,29 @@ test_type (gconstpointer data) g_str_equal (g_type_name (type), "GdkX11GLContext")) return; - /* This throws a critical when the connection is dropped */ - if (g_type_is_a (type, GTK_TYPE_APP_CHOOSER_DIALOG)) - return; - /* These leak their GDBusConnections */ if (g_type_is_a (type, GTK_TYPE_FILE_CHOOSER_DIALOG) || g_type_is_a (type, GTK_TYPE_FILE_CHOOSER_WIDGET) || g_type_is_a (type, GTK_TYPE_FILE_CHOOSER_NATIVE)) return; - if (g_str_equal (g_type_name (type), "GtkPlacesSidebar")) - return; - if (g_type_is_a (type, GTK_TYPE_STACK_PAGE)) return; - /* These rely on a d-bus session bus */ - if (g_type_is_a (type, GTK_TYPE_MOUNT_OPERATION)) - return; - - /* Needs a special surface */ - if (g_type_is_a (type, GTK_TYPE_DRAG_ICON)) - return; - /* these assert in constructed */ if (g_type_is_a (type, GTK_TYPE_ALTERNATIVE_TRIGGER) || g_type_is_a (type, GTK_TYPE_SIGNAL_ACTION) || g_type_is_a (type, GTK_TYPE_NAMED_ACTION)) return; + /* needs a surface */ + if (g_type_is_a (type, GTK_TYPE_DRAG_ICON)) + return; + + /* Needs debugging */ + if (g_type_is_a (type, GTK_TYPE_SHORTCUTS_WINDOW)) + return; + klass = g_type_class_ref (type); if (g_type_is_a (type, GTK_TYPE_SETTINGS)) @@ -503,7 +514,7 @@ test_type (gconstpointer data) GParamSpec *pspec = pspecs[i]; if ((pspec->flags & G_PARAM_READABLE) == 0) - continue; + continue; if ((pspec->flags & G_PARAM_WRITABLE) == 0) continue; @@ -512,8 +523,8 @@ test_type (gconstpointer data) continue; /* non-GTK */ - if (g_str_equal (g_type_name (pspec->owner_type), "GdkPixbufSimpleAnim") || - g_str_equal (g_type_name (pspec->owner_type), "GMountOperation")) + if (g_str_equal (g_type_name (pspec->owner_type), "GdkPixbufSimpleAnim") || + g_str_equal (g_type_name (pspec->owner_type), "GMountOperation")) continue; /* set properties are best skipped */ @@ -547,11 +558,11 @@ test_type (gconstpointer data) continue; if (g_type_is_a (pspec->owner_type, GTK_TYPE_COLOR_CHOOSER) && - g_str_equal (pspec->name, "show-editor")) + g_str_equal (pspec->name, "show-editor")) continue; if (g_type_is_a (pspec->owner_type, GTK_TYPE_NOTEBOOK) && - g_str_equal (pspec->name, "page")) + g_str_equal (pspec->name, "page")) continue; /* Too many special cases involving -set properties */ @@ -593,7 +604,8 @@ test_type (gconstpointer data) continue; if (pspec->owner_type == GTK_TYPE_STACK && - g_str_equal (pspec->name, "visible-child-name")) + (g_str_equal (pspec->name, "visible-child-name") || + g_str_equal (pspec->name, "visible-child"))) continue; if (pspec->owner_type == GTK_TYPE_STACK_PAGE && /* Can't change position without a stack */ @@ -623,51 +635,59 @@ test_type (gconstpointer data) /* This one has a special-purpose default value */ if (g_type_is_a (type, GTK_TYPE_DIALOG) && - g_str_equal (pspec->name, "use-header-bar")) - continue; + g_str_equal (pspec->name, "use-header-bar")) + continue; if (g_type_is_a (type, GTK_TYPE_ASSISTANT) && - g_str_equal (pspec->name, "use-header-bar")) - continue; + g_str_equal (pspec->name, "use-header-bar")) + continue; if (g_type_is_a (type, GTK_TYPE_SHORTCUTS_SHORTCUT) && - g_str_equal (pspec->name, "accelerator")) - continue; + g_str_equal (pspec->name, "accelerator")) + continue; if (g_type_is_a (type, GTK_TYPE_SHORTCUT_LABEL) && - g_str_equal (pspec->name, "accelerator")) - continue; + g_str_equal (pspec->name, "accelerator")) + continue; if (g_type_is_a (type, GTK_TYPE_FONT_CHOOSER) && - g_str_equal (pspec->name, "font")) - continue; + g_str_equal (pspec->name, "font")) + continue; /* these depend on the min-content- properties in a way that breaks our test */ if (g_type_is_a (type, GTK_TYPE_SCROLLED_WINDOW) && - (g_str_equal (pspec->name, "max-content-width") || - g_str_equal (pspec->name, "max-content-height"))) - continue; + (g_str_equal (pspec->name, "max-content-width") || + g_str_equal (pspec->name, "max-content-height"))) + continue; /* expanding only works if rows are expandable */ if (g_type_is_a (type, GTK_TYPE_TREE_LIST_ROW) && - g_str_equal (pspec->name, "expanded")) - continue; + 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 (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);