[gtk+] GtkSettings: Add a new provider for the theme CSS file.



commit cc68e62e24f65b2ac96da6527a2913b000895fd3
Author: Carlos Garnacho <carlosg gnome org>
Date:   Wed Sep 22 23:44:06 2010 +0200

    GtkSettings: Add a new provider for the theme CSS file.

 gtk/gtksettings.c |   48 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 48 insertions(+), 0 deletions(-)
---
diff --git a/gtk/gtksettings.c b/gtk/gtksettings.c
index 8e50804..3cde000 100644
--- a/gtk/gtksettings.c
+++ b/gtk/gtksettings.c
@@ -207,6 +207,7 @@ static void    settings_update_font_options      (GtkSettings           *setting
 static gboolean settings_update_fontconfig       (GtkSettings           *settings);
 #endif
 static void    settings_update_color_scheme      (GtkSettings *settings);
+static void    settings_update_theme             (GtkSettings *settings);
 
 static void    merge_color_scheme                (GtkSettings           *settings, 
 						  const GValue          *value, 
@@ -1556,6 +1557,10 @@ gtk_settings_notify (GObject    *object,
       break;
     case PROP_COLOR_SCHEME:
       settings_update_color_scheme (settings);
+      gtk_style_context_reset_widgets (settings->screen);
+      break;
+    case PROP_THEME_NAME:
+      settings_update_theme (settings);
       break;
 #ifdef GDK_WINDOWING_X11
     case PROP_XFT_DPI:
@@ -2594,6 +2599,49 @@ settings_update_color_scheme (GtkSettings *settings)
    }
 }
 
+static void
+settings_update_theme (GtkSettings *settings)
+{
+  static GQuark quark_theme_name = 0;
+  GtkCssProvider *provider, *new_provider = NULL;
+  gboolean prefer_dark_theme;
+  gchar *theme_name;
+
+  if (G_UNLIKELY (!quark_theme_name))
+    quark_theme_name = g_quark_from_static_string ("gtk-settings-theme-name");
+
+  provider = g_object_get_qdata (G_OBJECT (settings), quark_theme_name);
+
+  g_object_get (settings,
+                "gtk-theme-name", &theme_name,
+                "gtk-application-prefer-dark-theme", &prefer_dark_theme,
+                NULL);
+
+  if (theme_name && *theme_name)
+    {
+      gchar *variant = NULL;
+
+      if (prefer_dark_theme)
+        variant = "dark";
+
+      new_provider = gtk_css_provider_get_named (theme_name, variant);
+      g_free (theme_name);
+    }
+
+  if (new_provider != provider)
+    {
+      if (provider)
+        gtk_style_context_remove_provider_for_screen (settings->screen, provider);
+
+      if (new_provider)
+        gtk_style_context_add_provider_for_screen (settings->screen, new_provider,
+                                                   GTK_STYLE_PROVIDER_PRIORITY_SETTINGS + 1);
+
+      g_object_set_qdata_full (G_OBJECT (settings), quark_theme_name,
+                              new_provider, (GDestroyNotify) g_object_unref);
+    }
+}
+
 static gboolean
 add_color_to_hash (gchar      *name,
 		   GdkColor   *color,



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