[gtk/listview-for-merge: 149/150] builderlistitemfactory: Precompile the xml
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/listview-for-merge: 149/150] builderlistitemfactory: Precompile the xml
- Date: Sat, 30 May 2020 23:44:19 +0000 (UTC)
commit c7feae65f17119f11236a0cd09bbd1505d87a123
Author: Matthias Clasen <mclasen redhat com>
Date: Mon Dec 23 18:23:59 2019 -0500
builderlistitemfactory: Precompile the xml
This is the one place where we can really take advantage
of precompiling, since we instantiate this template
over and over.
gtk/gtkbuilderlistitemfactory.c | 32 ++++++++++++++++++++++++++++----
1 file changed, 28 insertions(+), 4 deletions(-)
---
diff --git a/gtk/gtkbuilderlistitemfactory.c b/gtk/gtkbuilderlistitemfactory.c
index d3e5079e59..da07cbe477 100644
--- a/gtk/gtkbuilderlistitemfactory.c
+++ b/gtk/gtkbuilderlistitemfactory.c
@@ -22,6 +22,7 @@
#include "gtkbuilderlistitemfactory.h"
#include "gtkbuilder.h"
+#include "gtkbuilderprivate.h"
#include "gtkintl.h"
#include "gtklistitemfactoryprivate.h"
#include "gtklistitemprivate.h"
@@ -61,6 +62,7 @@ struct _GtkBuilderListItemFactory
GtkBuilderScope *scope;
GBytes *bytes;
+ GBytes *data;
char *resource;
};
@@ -99,10 +101,10 @@ gtk_builder_list_item_factory_setup (GtkListItemFactory *factory,
if (self->scope)
gtk_builder_set_scope (builder, self->scope);
- if (!gtk_builder_extend_with_template (builder, G_OBJECT (list_item), G_OBJECT_TYPE (list_item),
- (const gchar *)g_bytes_get_data (self->bytes, NULL),
- g_bytes_get_size (self->bytes),
- &error))
+ if (!gtk_builder_extend_with_template (builder, G_OBJECT (list_item), G_OBJECT_TYPE (list_item),
+ (const char *)g_bytes_get_data (self->data, NULL),
+ g_bytes_get_size (self->data),
+ &error))
{
g_critical ("Error building template for list item: %s", error->message);
g_error_free (error);
@@ -159,6 +161,27 @@ gtk_builder_list_item_factory_set_bytes (GtkBuilderListItemFactory *self,
}
self->bytes = g_bytes_ref (bytes);
+
+ if (!_gtk_buildable_parser_is_precompiled (g_bytes_get_data (bytes, NULL), g_bytes_get_size (bytes)))
+ {
+ GError *error = NULL;
+ GBytes *data;
+
+ data = _gtk_buildable_parser_precompile (g_bytes_get_data (bytes, NULL),
+ g_bytes_get_size (bytes),
+ &error);
+ if (data == NULL)
+ {
+ g_warning ("Failed to precompile template for GtkBuilderListItemFactory: %s", error->message);
+ g_error_free (error);
+ self->data = g_bytes_ref (bytes);
+ }
+ else
+ {
+ self->data = data;
+ }
+ }
+
return TRUE;
}
@@ -218,6 +241,7 @@ gtk_builder_list_item_factory_finalize (GObject *object)
g_clear_object (&self->scope);
g_bytes_unref (self->bytes);
+ g_bytes_unref (self->data);
g_free (self->resource);
G_OBJECT_CLASS (gtk_builder_list_item_factory_parent_class)->finalize (object);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]