From 679ff63d5cf582a357fa1ad14752b9f53caf4d39 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Wed, 22 Sep 2010 23:39:15 +0200 Subject: [PATCH] GtkCssProvider: Add gtk_css_provider_get_named() This functions loads a CSS file from a installed theme. --- gtk/gtkcssprovider.c | 74 ++++++++++++++++++++++++++++++++++++++++++-- gtk/gtkcssprovider.h | 2 ++ 2 files changed, 73 insertions(+), 3 deletions(-) diff --git a/gtk/gtkcssprovider.c b/gtk/gtkcssprovider.c index a4a1af737..e118c1a78 100644 --- a/gtk/gtkcssprovider.c +++ b/gtk/gtkcssprovider.c @@ -2080,8 +2080,25 @@ gtk_css_provider_get_default (void) return provider; } +static gchar * +css_provider_get_theme_dir (void) +{ + const gchar *var; + gchar *path; + + var = g_getenv ("GTK_DATA_PREFIX"); + + if (var) + path = g_build_filename (var, "share", "themes", NULL); + else + path = g_build_filename (GTK_DATA_PREFIX, "share", "themes", NULL); + + return path; +} + GtkCssProvider * -gtk_css_provider_get_named (const gchar *name) +gtk_css_provider_get_named (const gchar *name, + const gchar *variant) { static GHashTable *themes = NULL; GtkCssProvider *provider; @@ -2093,9 +2110,60 @@ gtk_css_provider_get_named (const gchar *name) if (!provider) { - + const gchar *home_dir; + gchar *subpath, *path = NULL; - g_hash_table_insert (themes, g_strdup (name), provider); + if (variant) + subpath = g_strdup_printf ("gtk-%d.0" G_DIR_SEPARATOR_S "gtk-%s.css", GTK_MAJOR_VERSION, variant); + else + subpath = g_strdup_printf ("gtk-%d.0" G_DIR_SEPARATOR_S "gtk.css", GTK_MAJOR_VERSION); + + /* First look in the users home directory + */ + home_dir = g_get_home_dir (); + if (home_dir) + { + path = g_build_filename (home_dir, ".themes", name, subpath, NULL); + + if (!g_file_test (path, G_FILE_TEST_EXISTS)) + { + g_free (path); + path = NULL; + } + } + + if (!path) + { + gchar *theme_dir = css_provider_get_theme_dir (); + path = g_build_filename (theme_dir, name, subpath, NULL); + g_free (theme_dir); + + if (!g_file_test (path, G_FILE_TEST_EXISTS)) + { + g_free (path); + path = NULL; + } + } + + if (path) + { + GtkCssProvider *provider; + GError *error = NULL; + + provider = gtk_css_provider_new (); + gtk_css_provider_load_from_path (provider, path, &error); + + if (error) + { + g_warning ("Could not load named theme \"%s\": %s", name, error->message); + g_error_free (error); + + g_object_unref (provider); + provider = NULL; + } + else + g_hash_table_insert (themes, g_strdup (name), provider); + } } return provider; diff --git a/gtk/gtkcssprovider.h b/gtk/gtkcssprovider.h index 2b8dd9dcf..2c6d28334 100644 --- a/gtk/gtkcssprovider.h +++ b/gtk/gtkcssprovider.h @@ -62,6 +62,8 @@ gboolean gtk_css_provider_load_from_path (GtkCssProvider *css_provider, GtkCssProvider * gtk_css_provider_get_default (void); +GtkCssProvider * gtk_css_provider_get_named (const gchar *name, + const gchar *variant); G_END_DECLS -- 2.43.2