Support a gtk.gresource file in themes

This lets themes install a .gresource for efficient loading
of resources. This resource file will (if it exists) be automatically
loaded (mmaped) when the theme is used and unloaded when not used.
This commit is contained in:
Alexander Larsson 2012-02-03 15:50:49 +01:00
parent 35db0819ff
commit 57386285fa

View File

@ -985,6 +985,7 @@ struct _GtkCssProviderPrivate
GHashTable *symbolic_colors; GHashTable *symbolic_colors;
GArray *rulesets; GArray *rulesets;
GResource *resource;
}; };
enum { enum {
@ -1591,6 +1592,13 @@ gtk_css_provider_finalize (GObject *object)
if (priv->symbolic_colors) if (priv->symbolic_colors)
g_hash_table_destroy (priv->symbolic_colors); g_hash_table_destroy (priv->symbolic_colors);
if (priv->resource)
{
g_resources_unregister (priv->resource);
g_resource_unref (priv->resource);
priv->resource = NULL;
}
G_OBJECT_CLASS (gtk_css_provider_parent_class)->finalize (object); G_OBJECT_CLASS (gtk_css_provider_parent_class)->finalize (object);
} }
@ -2901,8 +2909,20 @@ gtk_css_provider_get_named (const gchar *name,
if (path) if (path)
{ {
char *dir, *resource_file;
GResource *resource;
provider = gtk_css_provider_new (); provider = gtk_css_provider_new ();
dir = g_path_get_dirname (path);
resource_file = g_build_filename (dir, "gtk.gresource", NULL);
resource = g_resource_load (resource_file, NULL);
if (resource != NULL)
{
provider->priv->resource = resource;
g_resources_register (resource);
}
if (!gtk_css_provider_load_from_path (provider, path, NULL)) if (!gtk_css_provider_load_from_path (provider, path, NULL))
{ {
g_object_unref (provider); g_object_unref (provider);