[gtk+] Revert "Bind the themes to the livecycle of the screen"



commit ab3d6a0b0a7a48914a30187c12c8219a8bcc3295
Author: Matthias Clasen <mclasen redhat com>
Date:   Mon Sep 17 22:10:59 2012 -0400

    Revert "Bind the themes to the livecycle of the screen"
    
    This reverts commit 1f5dea9eba4de5a54e9370fe8e4b90e6c0cec200,
    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).

 gtk/gtkcssprovider.c        |  309 +++++++++++++++++--------------------------
 gtk/gtkcssprovider.h        |    3 +-
 gtk/gtkcssproviderprivate.h |    7 +-
 gtk/gtksettings.c           |    8 +-
 4 files changed, 129 insertions(+), 198 deletions(-)
---
diff --git a/gtk/gtkcssprovider.c b/gtk/gtkcssprovider.c
index ea56a1b..42d8eb5 100644
--- a/gtk/gtkcssprovider.c
+++ b/gtk/gtkcssprovider.c
@@ -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)
 {
diff --git a/gtk/gtkcssprovider.h b/gtk/gtkcssprovider.h
index 6349d42..db0222b 100644
--- a/gtk/gtkcssprovider.h
+++ b/gtk/gtkcssprovider.h
@@ -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);
 
diff --git a/gtk/gtkcssproviderprivate.h b/gtk/gtkcssproviderprivate.h
index 240496a..9a24254 100644
--- a/gtk/gtkcssproviderprivate.h
+++ b/gtk/gtkcssproviderprivate.h
@@ -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
 
diff --git a/gtk/gtksettings.c b/gtk/gtksettings.c
index b62534b..cfcc192 100644
--- a/gtk/gtksettings.c
+++ b/gtk/gtksettings.c
@@ -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);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]