From 52f7afeecd2078ae6cab6a66119808bbc1723caf Mon Sep 17 00:00:00 2001 From: Alexander Mikhaylenko Date: Tue, 28 Feb 2023 14:25:42 +0400 Subject: [PATCH] builderparser: Don't exit too early on nested custom tags Currently nested custom tags work only as long as the element names differ from the root one. If it's same, for example: 600 600 then it will fail. Meanwhile the same tags wrapped into would work. The problem is that custom tag parsing is considered finished as soon as we encounter a closing tag with the same element name. So instead, track the nesting level. --- gtk/gtkbuilderparser.c | 9 ++++++++- gtk/gtkbuilderprivate.h | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/gtk/gtkbuilderparser.c b/gtk/gtkbuilderparser.c index 9658ea226e..1d2d0b3d0b 100644 --- a/gtk/gtkbuilderparser.c +++ b/gtk/gtkbuilderparser.c @@ -1608,6 +1608,7 @@ create_subparser (GObject *object, subparser->object = object; subparser->child = child; subparser->tagname = g_strdup (element_name); + subparser->level = 1; subparser->start = element_name; subparser->parser = g_memdup2 (parser, sizeof (GtkBuildableParser)); subparser->data = user_data; @@ -1638,6 +1639,8 @@ subparser_start (GtkBuildableParseContext *context, if (subparser->start) { + subparser->level++; + if (subparser->parser->start_element) subparser->parser->start_element (context, element_name, names, values, @@ -1653,6 +1656,8 @@ subparser_end (GtkBuildableParseContext *context, ParserData *data, GError **error) { + data->subparser->level--; + if (data->subparser->parser->end_element) data->subparser->parser->end_element (context, element_name, data->subparser->data, error); @@ -1660,9 +1665,11 @@ subparser_end (GtkBuildableParseContext *context, if (*error) return; - if (strcmp (data->subparser->start, element_name) != 0) + if (data->subparser->level > 0) return; + g_assert (strcmp (data->subparser->start, element_name) == 0); + gtk_buildable_custom_tag_end (GTK_BUILDABLE (data->subparser->object), data->builder, data->subparser->child, diff --git a/gtk/gtkbuilderprivate.h b/gtk/gtkbuilderprivate.h index 21ceca77c0..20b874c843 100644 --- a/gtk/gtkbuilderprivate.h +++ b/gtk/gtkbuilderprivate.h @@ -165,6 +165,7 @@ struct _GtkBuildableParseContext { typedef struct { GtkBuildableParser *parser; char *tagname; + int level; const char *start; gpointer data; GObject *object;