Merge branch 'ebassi/childless-stack-page' into 'main'

stack: Assert that StackPage:child is set

See merge request GNOME/gtk!4201
This commit is contained in:
Matthias Clasen
2022-07-13 21:11:58 +00:00
4 changed files with 28 additions and 9 deletions

View File

@@ -395,6 +395,20 @@ gtk_stack_page_set_property (GObject *object,
break;
}
}
static void
gtk_stack_page_constructed (GObject *gobject)
{
GtkStackPage *self = GTK_STACK_PAGE (gobject);
if (G_UNLIKELY (self->widget == NULL))
g_error ("GtkStackPage '%s' [%p] is missing a child widget",
self->name != NULL ? self->name : "<unnamed>",
self);
G_OBJECT_CLASS (gtk_stack_page_parent_class)->constructed (gobject);
}
static void
gtk_stack_page_class_init (GtkStackPageClass *class)
{
@@ -404,6 +418,7 @@ gtk_stack_page_class_init (GtkStackPageClass *class)
object_class->dispose = gtk_stack_page_dispose;
object_class->get_property = gtk_stack_page_get_property;
object_class->set_property = gtk_stack_page_set_property;
object_class->constructed = gtk_stack_page_constructed;
/**
* GtkStackPage:child: (attributes org.gtk.Property.get=gtk_stack_page_get_child)
@@ -1543,13 +1558,11 @@ gtk_stack_add_internal (GtkStack *stack,
g_return_val_if_fail (child != NULL, NULL);
child_info = g_object_new (GTK_TYPE_STACK_PAGE, NULL);
child_info->widget = g_object_ref (child);
child_info->name = g_strdup (name);
child_info->title = g_strdup (title);
child_info->icon_name = NULL;
child_info->needs_attention = FALSE;
child_info->last_focus = NULL;
child_info = g_object_new (GTK_TYPE_STACK_PAGE,
"child", child,
"name", name,
"title", title,
NULL);
gtk_stack_add_page (stack, child_info);
@@ -2627,7 +2640,7 @@ gtk_stack_measure (GtkWidget *widget,
int min_for_size;
gtk_widget_measure (child, OPPOSITE_ORIENTATION (orientation), -1, &min_for_size, NULL, NULL, NULL);
gtk_widget_measure (child, orientation, MAX (min_for_size, for_size), &child_min, &child_nat, NULL, NULL);
}
else

View File

@@ -78,6 +78,7 @@ test_type (gconstpointer data)
if (g_type_is_a (type, GTK_TYPE_APPLICATION) ||
g_type_is_a (type, GDK_TYPE_PIXBUF_LOADER) ||
g_type_is_a (type, GTK_TYPE_LAYOUT_CHILD) ||
g_type_is_a (type, GTK_TYPE_STACK_PAGE) ||
#ifdef G_OS_UNIX
g_type_is_a (type, GTK_TYPE_PRINT_JOB) ||
#endif

View File

@@ -409,6 +409,9 @@ test_type (gconstpointer data)
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;

View File

@@ -178,7 +178,9 @@ main (int argc, char **argv)
all_types[i] != GDK_TYPE_PIXBUF_LOADER &&
all_types[i] != gdk_pixbuf_simple_anim_iter_get_type() &&
!g_type_is_a (all_types[i], GTK_TYPE_SHORTCUT_TRIGGER) &&
!g_type_is_a (all_types[i], GTK_TYPE_SHORTCUT_ACTION))
!g_type_is_a (all_types[i], GTK_TYPE_SHORTCUT_ACTION) &&
/* can't instantiate empty stack pages */
all_types[i] != GTK_TYPE_STACK_PAGE)
{
char *test_path = g_strdup_printf ("/FinalizeObject/%s", g_type_name (all_types[i]));