From: Alexander Mikhaylenko Date: Tue, 28 Feb 2023 10:25:42 +0000 (+0400) Subject: builderparser: Don't exit too early on nested custom tags X-Git-Tag: archive/raspbian/4.12.3+ds-1+rpi1~1^2^2^2~22^2~6^2~22^2~1 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=2bcc3cfb33cdfa73c4f583a2df782db04db4e0e3;p=gtk4.git 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. --- 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;