From: Christian Hergert Date: Mon, 1 Aug 2022 04:15:08 +0000 (-0700) Subject: gtkbuilder: check for existing object before extending template X-Git-Tag: archive/raspbian/4.8.3+ds-2+rpi1~3^2~20^2~4^2~27^2~2 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=f680b86130479c2416c98acdbde68a27848ef88c;p=gtk4.git gtkbuilder: check for existing object before extending template If gtk_builder_expose_object() is called twice with the same name, it will result in a g_critical(). This improves that situation by checking for the object before exposing additional times. This turns out to be handy in situations where templates are expanded multiple times, such as application-side implementations of UI merging. --- diff --git a/gtk/gtkbuilder.c b/gtk/gtkbuilder.c index ab28ccc5d9..063bf7b03c 100644 --- a/gtk/gtkbuilder.c +++ b/gtk/gtkbuilder.c @@ -1367,6 +1367,7 @@ gtk_builder_extend_with_template (GtkBuilder *builder, GError **error) { GtkBuilderPrivate *priv = gtk_builder_get_instance_private (builder); + const char *name; GError *tmp_error; char *filename; @@ -1384,8 +1385,15 @@ gtk_builder_extend_with_template (GtkBuilder *builder, priv->resource_prefix = NULL; priv->template_type = template_type; - filename = g_strconcat ("<", g_type_name (template_type), " template>", NULL); - gtk_builder_expose_object (builder, g_type_name (template_type), object); + /* We specifically allow this function to be called multiple times with + * the same @template_type as that is used in applications like Builder + * to implement UI merging. + */ + name = g_type_name (template_type); + 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, buffer, length, NULL,