Commit ab3d6a0b authored by Matthias Clasen's avatar Matthias Clasen

Revert "Bind the themes to the livecycle of the screen"

This reverts commit 1f5dea9e,
since it was causeing noticable behaviour changes.

Previously, GTK_DATA_PREFIX=/ ./gtk3-demo would start
gtk3-demo with the Raleigh theme. With that change, it
was starting with no theme at all (i.e. all black).
parent 9bd037aa
......@@ -2690,99 +2690,154 @@ _gtk_css_provider_load_from_resource (GtkCssProvider *css_provider,
return result;
}
static char *
_find_theme_path (const gchar *name,
const gchar *variant)
/**
* gtk_css_provider_get_default:
*
* Returns the provider containing the style settings used as a
* fallback for all widgets.
*
* Returns: (transfer none): The provider used for fallback styling.
* This memory is owned by GTK+, and you must not free it.
**/
GtkCssProvider *
gtk_css_provider_get_default (void)
{
gchar *subpath;
gchar *path = NULL;
static GtkCssProvider *provider;
if (variant)
subpath = g_strdup_printf ("gtk-3.0" G_DIR_SEPARATOR_S "gtk-%s.css", variant);
else
subpath = g_strdup ("gtk-3.0" G_DIR_SEPARATOR_S "gtk.css");
/* First look in the user's config directory
*/
path = g_build_filename (g_get_user_data_dir (), "themes", name, subpath, NULL);
if (!g_file_test (path, G_FILE_TEST_EXISTS))
if (G_UNLIKELY (!provider))
{
g_free (path);
path = NULL;
provider = gtk_css_provider_new ();
}
/* Next look in the user's home directory
*/
if (!path)
return provider;
}
gchar *
_gtk_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_get_data_prefix (), "share", "themes", NULL);
return path;
}
/**
* gtk_css_provider_get_named:
* @name: A theme name
* @variant: (allow-none): variant to load, for example, "dark", or
* %NULL for the default
*
* Loads a theme from the usual theme paths
*
* Returns: (transfer none): a #GtkCssProvider with the theme loaded.
* This memory is owned by GTK+, and you must not free it.
*/
GtkCssProvider *
gtk_css_provider_get_named (const gchar *name,
const gchar *variant)
{
static GHashTable *themes = NULL;
GtkCssProvider *provider;
gchar *key;
if (variant == NULL)
key = (gchar *)name;
else
key = g_strconcat (name, "-", variant, NULL);
if (G_UNLIKELY (!themes))
themes = g_hash_table_new (g_str_hash, g_str_equal);
provider = g_hash_table_lookup (themes, key);
if (!provider)
{
const gchar *home_dir;
gchar *resource_path = NULL;
home_dir = g_get_home_dir ();
if (home_dir)
{
path = g_build_filename (home_dir, ".themes", name, subpath, NULL);
if (variant)
resource_path = g_strdup_printf ("/org/gtk/libgtk/%s-%s.css", name, variant);
else
resource_path = g_strdup_printf ("/org/gtk/libgtk/%s.css", name);
if (!g_file_test (path, G_FILE_TEST_EXISTS))
if (g_resources_get_info (resource_path, 0, NULL, NULL, NULL))
{
provider = gtk_css_provider_new ();
if (!_gtk_css_provider_load_from_resource (provider, resource_path))
{
g_free (path);
path = NULL;
g_object_unref (provider);
provider = NULL;
}
}
g_free (resource_path);
}
if (!path)
if (!provider)
{
gchar *theme_dir;
gchar *subpath, *path = NULL;
theme_dir = _gtk_css_provider_get_theme_dir ();
path = g_build_filename (theme_dir, name, subpath, NULL);
g_free (theme_dir);
if (variant)
subpath = g_strdup_printf ("gtk-3.0" G_DIR_SEPARATOR_S "gtk-%s.css", variant);
else
subpath = g_strdup ("gtk-3.0" G_DIR_SEPARATOR_S "gtk.css");
/* First look in the user's config directory
*/
path = g_build_filename (g_get_user_data_dir (), "themes", name, subpath, NULL);
if (!g_file_test (path, G_FILE_TEST_EXISTS))
{
g_free (path);
path = NULL;
}
}
g_free (subpath);
return path;
}
/* Next look in the user's home directory
*/
if (!path)
{
const gchar *home_dir;
static gboolean
_provider_load (GtkCssProvider *provider,
const gchar *name,
const gchar *variant)
{
gchar *resource_path;
gboolean loaded = FALSE;
home_dir = g_get_home_dir ();
if (home_dir)
{
path = g_build_filename (home_dir, ".themes", name, subpath, NULL);
g_assert (provider != NULL);
if (!g_file_test (path, G_FILE_TEST_EXISTS))
{
g_free (path);
path = NULL;
}
}
}
if (variant)
resource_path = g_strdup_printf ("/org/gtk/libgtk/%s-%s.css", name, variant);
else
resource_path = g_strdup_printf ("/org/gtk/libgtk/%s.css", name);
if (!path)
{
gchar *theme_dir;
if (g_resources_get_info (resource_path, 0, NULL, NULL, NULL))
{
loaded = _gtk_css_provider_load_from_resource (provider, resource_path);
}
g_free (resource_path);
theme_dir = _gtk_css_provider_get_theme_dir ();
path = g_build_filename (theme_dir, name, subpath, NULL);
g_free (theme_dir);
if (!loaded)
{
char *path;
if (!g_file_test (path, G_FILE_TEST_EXISTS))
{
g_free (path);
path = NULL;
}
}
path = _find_theme_path (name, variant);
g_free (subpath);
if (path)
{
char *dir;
char *resource_file;
char *dir, *resource_file;
GResource *resource;
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);
......@@ -2791,154 +2846,34 @@ _provider_load (GtkCssProvider *provider,
if (resource != NULL)
g_resources_register (resource);
loaded = gtk_css_provider_load_from_path (provider, path, NULL);
if (!loaded)
if (!gtk_css_provider_load_from_path (provider, path, NULL))
{
if (resource != NULL)
{
g_resources_unregister (resource);
g_resource_unref (resource);
}
g_object_unref (provider);
provider = NULL;
}
else
{
/* Only set this after load success, as load_from_path will clear it */
provider->priv->resource = resource;
g_hash_table_insert (themes, g_strdup (key), provider);
}
g_free (path);
g_free (dir);
}
g_free (path);
}
return loaded;
}
static void
destroy_theme_cache (GHashTable *themes)
{
g_hash_table_destroy (themes);
}
/*
* _gtk_css_provider_get_named_for_screen:
* @screen: a #GdkScreen.
* @name: A theme name
* @variant: (allow-none): variant to load, for example, "dark", or
* %NULL for the default
*
* Loads a theme from the usual theme paths
*
* Returns: (transfer none): a #GtkCssProvider with the theme loaded.
* This memory is owned by GTK+, and you must not free it.
*/
GtkCssProvider *
_gtk_css_provider_get_named_for_screen (GdkScreen *screen,
const gchar *name,
const gchar *variant)
{
GtkCssProvider *provider;
GHashTable *themes;
gchar *key;
g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
themes = g_object_get_data (G_OBJECT (screen), "gtk-themes");
if (G_UNLIKELY (!themes))
{
themes = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
g_object_set_data_full (G_OBJECT (screen),
I_("gtk-themes"),
themes,
(GDestroyNotify)destroy_theme_cache);
}
if (name == NULL)
key = g_strdup ("");
else if (variant == NULL)
key = g_strdup (name);
else
key = g_strconcat (name, "-", variant, NULL);
provider = g_hash_table_lookup (themes, key);
if (!provider)
{
gboolean save = TRUE;
provider = gtk_css_provider_new ();
if (name != NULL)
save = _provider_load (provider, name, variant);
if (save)
g_hash_table_insert (themes, g_strdup (key), provider);
}
g_free (key);
if (key != name)
g_free (key);
return provider;
}
/**
* gtk_css_provider_get_default:
*
* Returns the provider containing the style settings used as a
* fallback for all widgets.
*
* Returns: (transfer none): The provider used for fallback styling.
* This memory is owned by GTK+, and you must not free it.
**/
GtkCssProvider *
gtk_css_provider_get_default (void)
{
GdkScreen *screen = gdk_screen_get_default ();
if (screen)
return _gtk_css_provider_get_named_for_screen (screen, NULL, NULL);
else
return NULL;
}
/**
* gtk_css_provider_get_named:
* @name: A theme name
* @variant: (allow-none): variant to load, for example, "dark", or
* %NULL for the default
*
* Loads a theme from the usual theme paths
*
* Returns: (transfer none): a #GtkCssProvider with the theme loaded.
* This memory is owned by GTK+, and you must not free it.
*/
GtkCssProvider *
gtk_css_provider_get_named (const gchar *name,
const gchar *variant)
{
GdkScreen *screen = gdk_screen_get_default ();
if (screen)
return _gtk_css_provider_get_named_for_screen (screen, name, variant);
else
return NULL;
}
gchar *
_gtk_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_get_data_prefix (), "share", "themes", NULL);
return path;
}
static int
compare_properties (gconstpointer a, gconstpointer b, gpointer style)
{
......
......@@ -86,7 +86,8 @@ gboolean gtk_css_provider_load_from_path (GtkCssProvider *css_provider,
const gchar *path,
GError **error);
GtkCssProvider * gtk_css_provider_get_default (void);
GtkCssProvider * gtk_css_provider_get_default (void);
GtkCssProvider * gtk_css_provider_get_named (const gchar *name,
const gchar *variant);
......
......@@ -22,12 +22,7 @@
G_BEGIN_DECLS
gchar * _gtk_css_provider_get_theme_dir (void);
GtkCssProvider *_gtk_css_provider_get_named_for_screen (GdkScreen *screen,
const gchar *name,
const gchar *variant);
gchar *_gtk_css_provider_get_theme_dir (void);
G_END_DECLS
......
......@@ -2928,15 +2928,15 @@ settings_update_theme (GtkSettings *settings)
if (theme_name && *theme_name)
{
if (prefer_dark_theme)
provider = _gtk_css_provider_get_named_for_screen (priv->screen, theme_name, "dark");
provider = gtk_css_provider_get_named (theme_name, "dark");
if (!provider)
provider = _gtk_css_provider_get_named_for_screen (priv->screen, theme_name, NULL);
provider = gtk_css_provider_get_named (theme_name, NULL);
}
/* If we didn't find the named theme, fall back */
if (!provider)
provider = _gtk_css_provider_get_named_for_screen (priv->screen, "Raleigh", NULL);
provider = gtk_css_provider_get_named ("Raleigh", NULL);
settings_update_provider (priv->screen, &priv->theme_provider, provider);
......@@ -2971,7 +2971,7 @@ settings_update_key_theme (GtkSettings *settings)
NULL);
if (key_theme_name && *key_theme_name)
provider = _gtk_css_provider_get_named_for_screen (priv->screen, key_theme_name, "keys");
provider = gtk_css_provider_get_named (key_theme_name, "keys");
settings_update_provider (priv->screen, &priv->key_theme_provider, provider);
g_free (key_theme_name);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment