char *filename;
char *resource_prefix;
GType template_type;
+ gboolean allow_template_parents;
GObject *current_object;
GtkBuilderScope *scope;
} GtkBuilderPrivate;
return TRUE;
}
+void
+gtk_builder_set_allow_template_parents (GtkBuilder *builder,
+ gboolean allow_parents)
+{
+ GtkBuilderPrivate *priv = gtk_builder_get_instance_private (builder);
+
+ priv->allow_template_parents = allow_parents;
+}
+
/**
* gtk_builder_extend_with_template:
* @builder: a `GtkBuilder`
name = g_type_name (template_type);
if (gtk_builder_get_object (builder, name) != object)
gtk_builder_expose_object (builder, name, object);
+ if (priv->allow_template_parents)
+ {
+ GType subtype;
+ for (subtype = g_type_parent (template_type);
+ subtype != G_TYPE_OBJECT;
+ subtype = g_type_parent (subtype))
+ {
+ name = g_type_name (subtype);
+ if (gtk_builder_get_object (builder, name) != object)
+ gtk_builder_expose_object (builder, name, object);
+ }
+ }
filename = g_strconcat ("<", name, " template>", NULL);
_gtk_builder_parser_parse_buffer (builder, filename,
}
GType
-_gtk_builder_get_template_type (GtkBuilder *builder)
+gtk_builder_get_template_type (GtkBuilder *builder,
+ gboolean *out_allow_parents)
{
GtkBuilderPrivate *priv = gtk_builder_get_instance_private (builder);
+ *out_allow_parents = priv->allow_template_parents;
+
return priv->template_type;
}
const char *parent_class = NULL;
int line;
gpointer line_ptr;
- gboolean has_duplicate;
+ gboolean has_duplicate, allow_parents;
GType template_type;
GType parsed_type;
- template_type = _gtk_builder_get_template_type (data->builder);
+ template_type = gtk_builder_get_template_type (data->builder, &allow_parents);
if (!g_markup_collect_attributes (element_name, names, values, error,
G_MARKUP_COLLECT_STRING, "class", &object_class,
}
parsed_type = g_type_from_name (object_class);
- if (template_type != parsed_type)
+ if (template_type != parsed_type &&
+ (!allow_parents || !g_type_is_a (template_type, parsed_type)))
{
g_set_error (error,
GTK_BUILDER_ERROR,
object_info = g_new0 (ObjectInfo, 1);
object_info->tag_type = TAG_TEMPLATE;
- object_info->type = parsed_type;
- object_info->oclass = g_type_class_ref (parsed_type);
- object_info->id = g_strdup (object_class);
object_info->object = gtk_builder_get_object (data->builder, object_class);
+ object_info->type = template_type;
+ object_info->oclass = g_type_class_ref (template_type);
+ object_info->id = g_strdup (object_class);
+ g_assert (object_info->object);
state_push (data, object_info);
has_duplicate = g_hash_table_lookup_extended (data->object_ids, object_class, NULL, &line_ptr);
GError **error);
void _gtk_builder_menu_end (ParserData *parser_data);
-GType _gtk_builder_get_template_type (GtkBuilder *builder);
+GType gtk_builder_get_template_type (GtkBuilder *builder,
+ gboolean *out_allow_parents);
+void gtk_builder_set_allow_template_parents (GtkBuilder *builder,
+ gboolean allow_parents);
void _gtk_builder_prefix_error (GtkBuilder *builder,
GtkBuildableParseContext *context,