diff options
author | Timm Bäder <mail@baedert.org> | 2021-01-06 19:07:44 +0100 |
---|---|---|
committer | Timm Bäder <mail@baedert.org> | 2021-01-17 04:39:26 +0100 |
commit | aec2fb939f470a85f0cd66c2c57db88408417a02 (patch) | |
tree | 4b02d5b16a6c9248e5f39e77a5019cf76d7f754a | |
parent | 69293db804d01fe0e7c360b6c82bdad35a5acbf4 (diff) | |
download | gtk+-aec2fb939f470a85f0cd66c2c57db88408417a02.tar.gz |
builderparser: Keep properties in a GPtrArray
-rw-r--r-- | gtk/gtkbuilder.c | 10 | ||||
-rw-r--r-- | gtk/gtkbuilderparser.c | 17 | ||||
-rw-r--r-- | gtk/gtkbuilderprivate.h | 4 |
3 files changed, 18 insertions, 13 deletions
diff --git a/gtk/gtkbuilder.c b/gtk/gtkbuilder.c index d3edc4d0da..fc090c34d6 100644 --- a/gtk/gtkbuilder.c +++ b/gtk/gtkbuilder.c @@ -527,19 +527,21 @@ static void gtk_builder_get_parameters (GtkBuilder *builder, GType object_type, const char *object_name, - GSList *properties, + GPtrArray *properties, GParamFlags filter_flags, ObjectProperties *parameters, ObjectProperties *filtered_parameters) { GtkBuilderPrivate *priv = gtk_builder_get_instance_private (builder); - GSList *l; DelayedProperty *property; GError *error = NULL; - for (l = properties; l; l = l->next) + if (!properties) + return; + + for (guint i = 0; i < properties->len; i++) { - PropertyInfo *prop = (PropertyInfo*)l->data; + PropertyInfo *prop = g_ptr_array_index (properties, i); const char *property_name = g_intern_string (prop->pspec->name); GValue property_value = G_VALUE_INIT; diff --git a/gtk/gtkbuilderparser.c b/gtk/gtkbuilderparser.c index b22cb1dfe5..4009307af7 100644 --- a/gtk/gtkbuilderparser.c +++ b/gtk/gtkbuilderparser.c @@ -471,8 +471,6 @@ builder_construct (ParserData *data, if (object_info->object && object_info->applied_properties) return object_info->object; - object_info->properties = g_slist_reverse (object_info->properties); - if (object_info->object == NULL) { object = _gtk_builder_construct (data->builder, object_info, error); @@ -800,18 +798,19 @@ free_object_info (ObjectInfo *info) /* Do not free the signal items, which GtkBuilder takes ownership of */ g_type_class_unref (info->oclass); g_slist_free (info->signals); - g_slist_free_full (info->properties, (GDestroyNotify)free_property_info); + if (info->properties) + g_ptr_array_free (info->properties, TRUE); g_free (info->constructor); g_free (info->id); g_slice_free (ObjectInfo, info); } static void -parse_child (ParserData *data, - const char *element_name, +parse_child (ParserData *data, + const char *element_name, const char **names, const char **values, - GError **error) + GError **error) { ObjectInfo* object_info; @@ -1707,7 +1706,6 @@ parse_custom (GtkBuildableParseContext *context, ObjectInfo* object_info = (ObjectInfo*)parent_info; if (!object_info->object) { - object_info->properties = g_slist_reverse (object_info->properties); object_info->object = _gtk_builder_construct (data->builder, object_info, error); @@ -1885,7 +1883,10 @@ end_element (GtkBuildableParseContext *context, g_string_assign (prop_info->text, translated); } - object_info->properties = g_slist_prepend (object_info->properties, prop_info); + if (G_UNLIKELY (!object_info->properties)) + object_info->properties = g_ptr_array_new_with_free_func ((GDestroyNotify)free_property_info); + + g_ptr_array_add (object_info->properties, prop_info); } else g_assert_not_reached (); diff --git a/gtk/gtkbuilderprivate.h b/gtk/gtkbuilderprivate.h index 74c688b2de..f86aaea629 100644 --- a/gtk/gtkbuilderprivate.h +++ b/gtk/gtkbuilderprivate.h @@ -46,9 +46,11 @@ typedef struct { GObjectClass *oclass; char *id; char *constructor; - GSList *properties; + + GPtrArray *properties; GSList *signals; GSList *bindings; + GObject *object; CommonInfo *parent; gboolean applied_properties; |