builder: Allow named objects to be used in paintable/pixbuf properties
authorBenjamin Otte <otte@redhat.com>
Thu, 22 Mar 2018 21:03:47 +0000 (22:03 +0100)
committerBenjamin Otte <otte@redhat.com>
Thu, 29 Mar 2018 03:02:15 +0000 (05:02 +0200)
Instead of erroring if an object by a name already exists, use that
object.

gtk/gtkbuilder.c

index 98bde1216137dfac196bfb5c6b89ff2359680d31..dc18c1faa250ddfab53fb5a7482c44969807915a 100644 (file)
@@ -2057,16 +2057,27 @@ gtk_builder_value_from_string_type (GtkBuilder   *builder,
           gchar *filename;
           GError *tmp_error = NULL;
           GdkPixbuf *pixbuf = NULL;
+          GObject *object;
 
-          if (g_hash_table_contains (builder->priv->objects, string))
+          object = g_hash_table_lookup (builder->priv->objects, string);
+
+          if (object)
             {
-              g_set_error (error,
-                           GTK_BUILDER_ERROR,
-                           GTK_BUILDER_ERROR_INVALID_VALUE,
-                           "Could not load image '%s': "
-                           " '%s' is already used as object id",
-                           string, string);
-              return FALSE;
+              if (g_type_is_a (G_OBJECT_TYPE (object), G_VALUE_TYPE (value)))
+                {
+                  g_value_set_object (value, object);
+                  return TRUE;
+                }
+              else
+                {
+                  g_set_error (error,
+                               GTK_BUILDER_ERROR,
+                               GTK_BUILDER_ERROR_INVALID_VALUE,
+                               "Could not load image '%s': "
+                               " '%s' is already used as object id for a %s",
+                               string, string, G_OBJECT_TYPE_NAME (object));
+                  return FALSE;
+                }
             }
 
           filename = _gtk_builder_get_resource_path (builder, string);