]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtksettings.c
More include cleanups
[~andy/gtk] / gtk / gtksettings.c
index 50c00be2d5ca23c9a0f194f6f769064c284d3264..fe5383dfa2ba710557be2bd9cd502f666a39ca68 100644 (file)
 #include <pango/pangofc-fontmap.h>
 #endif
 
+#ifdef GDK_WINDOWING_QUARTZ
+#include "quartz/gdkquartz.h"
+#endif
+
 
 /**
  * SECTION:gtksettings
  */
 
 
-#ifdef GDK_WINDOWING_QUARTZ
-#define DEFAULT_KEY_THEME "Mac"
-#else
-#define DEFAULT_KEY_THEME NULL
-#endif
-
 #define DEFAULT_TIMEOUT_INITIAL 200
 #define DEFAULT_TIMEOUT_REPEAT   20
 #define DEFAULT_TIMEOUT_EXPAND  500
@@ -100,6 +98,8 @@ struct _GtkSettingsPrivate
   GData *queued_settings;      /* of type GtkSettingsValue* */
   GtkSettingsPropertyValue *property_values;
   GdkScreen *screen;
+  GtkCssProvider *theme_provider;
+  GtkCssProvider *key_theme_provider;
 };
 
 typedef enum
@@ -139,7 +139,6 @@ enum {
   PROP_FONT_NAME,
   PROP_ICON_SIZES,
   PROP_MODULES,
-#ifdef GDK_WINDOWING_X11
   PROP_XFT_ANTIALIAS,
   PROP_XFT_HINTING,
   PROP_XFT_HINTSTYLE,
@@ -147,7 +146,6 @@ enum {
   PROP_XFT_DPI,
   PROP_CURSOR_THEME_NAME,
   PROP_CURSOR_THEME_SIZE,
-#endif
   PROP_ALTERNATIVE_BUTTON_ORDER,
   PROP_ALTERNATIVE_SORT_ARROWS,
   PROP_SHOW_INPUT_METHOD_MENU,
@@ -217,14 +215,13 @@ static guint    settings_install_property_parser (GtkSettingsClass      *class,
 static void    settings_update_double_click      (GtkSettings           *settings);
 static void    settings_update_modules           (GtkSettings           *settings);
 
-#ifdef GDK_WINDOWING_X11
 static void    settings_update_cursor_theme      (GtkSettings           *settings);
 static void    settings_update_resolution        (GtkSettings           *settings);
 static void    settings_update_font_options      (GtkSettings           *settings);
 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    settings_update_key_theme         (GtkSettings *settings);
 
 static void    merge_color_scheme                (GtkSettings           *settings,
                                                   const GValue          *value,
@@ -392,7 +389,7 @@ gtk_settings_class_init (GtkSettingsClass *class)
   result = settings_install_property_parser (class,
                                              g_param_spec_string ("gtk-theme-name",
                                                                    P_("Theme Name"),
-                                                                   P_("Name of theme RC file to load"),
+                                                                   P_("Name of theme to load"),
                                                                   "Raleigh",
                                                                   GTK_PARAM_READWRITE),
                                              NULL);
@@ -419,8 +416,8 @@ gtk_settings_class_init (GtkSettingsClass *class)
   result = settings_install_property_parser (class,
                                              g_param_spec_string ("gtk-key-theme-name",
                                                                   P_("Key Theme Name"),
-                                                                  P_("Name of key theme RC file to load"),
-                                                                  DEFAULT_KEY_THEME,
+                                                                  P_("Name of key theme to load"),
+                                                                  NULL,
                                                                   GTK_PARAM_READWRITE),
                                              NULL);
   g_assert (result == PROP_KEY_THEME_NAME);
@@ -484,7 +481,6 @@ gtk_settings_class_init (GtkSettingsClass *class)
                                              NULL);
   g_assert (result == PROP_MODULES);
 
-#ifdef GDK_WINDOWING_X11
   result = settings_install_property_parser (class,
                                              g_param_spec_int ("gtk-xft-antialias",
                                                                P_("Xft Antialias"),
@@ -554,7 +550,6 @@ gtk_settings_class_init (GtkSettingsClass *class)
 
   g_assert (result == PROP_CURSOR_THEME_SIZE);
 
-#endif  /* GDK_WINDOWING_X11 */
   result = settings_install_property_parser (class,
                                              g_param_spec_boolean ("gtk-alternative-button-order",
                                                                    P_("Alternative button order"),
@@ -1350,6 +1345,24 @@ gtk_settings_get_style (GtkStyleProvider *provider,
 
   font_desc = pango_font_description_from_string (font_name);
 
+  /* Unset normal attributes from this description,
+   * so they do not override theme values */
+  if (pango_font_description_get_weight (font_desc) == PANGO_WEIGHT_NORMAL)
+    pango_font_description_unset_fields (font_desc,
+                                         PANGO_FONT_MASK_WEIGHT);
+
+  if (pango_font_description_get_stretch (font_desc) == PANGO_STRETCH_NORMAL)
+    pango_font_description_unset_fields (font_desc,
+                                         PANGO_FONT_MASK_STRETCH);
+
+  if (pango_font_description_get_variant (font_desc) == PANGO_VARIANT_NORMAL)
+    pango_font_description_unset_fields (font_desc,
+                                         PANGO_FONT_MASK_VARIANT);
+
+  if (pango_font_description_get_style (font_desc) == PANGO_STYLE_NORMAL)
+    pango_font_description_unset_fields (font_desc,
+                                         PANGO_FONT_MASK_STYLE);
+
   gtk_style_properties_set (props, 0,
                             "font", font_desc,
                             NULL);
@@ -1383,6 +1396,12 @@ gtk_settings_finalize (GObject *object)
 
   g_datalist_clear (&priv->queued_settings);
 
+  if (priv->theme_provider)
+    g_object_unref (priv->theme_provider);
+
+  if (priv->key_theme_provider)
+    g_object_unref (priv->key_theme_provider);
+
   G_OBJECT_CLASS (gtk_settings_parent_class)->finalize (object);
 }
 
@@ -1426,6 +1445,7 @@ settings_init_style (GtkSettings *settings)
                                              GTK_STYLE_PROVIDER_PRIORITY_SETTINGS);
 
   settings_update_theme (settings);
+  settings_update_key_theme (settings);
 }
 
 /**
@@ -1448,18 +1468,21 @@ gtk_settings_get_for_screen (GdkScreen *screen)
   settings = g_object_get_data (G_OBJECT (screen), "gtk-settings");
   if (!settings)
     {
-      settings = g_object_new (GTK_TYPE_SETTINGS, NULL);
+#ifdef GDK_WINDOWING_QUARTZ
+      if (GDK_IS_QUARTZ_SCREEN (screen))
+        settings = g_object_new (GTK_TYPE_SETTINGS, "gtk-key-theme-name", "Mac", NULL);
+      else
+#endif
+        settings = g_object_new (GTK_TYPE_SETTINGS, NULL);
       settings->priv->screen = screen;
       g_object_set_data_full (G_OBJECT (screen), I_("gtk-settings"),
                               settings, g_object_unref);
 
       settings_init_style (settings);
       settings_update_double_click (settings);
-#ifdef GDK_WINDOWING_X11
       settings_update_cursor_theme (settings);
       settings_update_resolution (settings);
       settings_update_font_options (settings);
-#endif
       settings_update_color_scheme (settings);
     }
 
@@ -1608,10 +1631,16 @@ gtk_settings_notify (GObject    *object,
       settings_update_color_scheme (settings);
       gtk_style_context_reset_widgets (priv->screen);
       break;
+    case PROP_FONT_NAME:
+      gtk_style_context_reset_widgets (priv->screen);
+      break;
+    case PROP_KEY_THEME_NAME:
+      settings_update_key_theme (settings);
+      break;
     case PROP_THEME_NAME:
+    case PROP_APPLICATION_PREFER_DARK_THEME:
       settings_update_theme (settings);
       break;
-#ifdef GDK_WINDOWING_X11
     case PROP_XFT_DPI:
       settings_update_resolution (settings);
       /* This is a hack because with gtk_rc_reset_styles() doesn't get
@@ -1635,7 +1664,6 @@ gtk_settings_notify (GObject    *object,
     case PROP_CURSOR_THEME_SIZE:
       settings_update_cursor_theme (settings);
       break;
-#endif /* GDK_WINDOWING_X11 */
     }
 }
 
@@ -2467,7 +2495,6 @@ settings_update_modules (GtkSettings *settings)
   g_free (modules);
 }
 
-#ifdef GDK_WINDOWING_X11
 static void
 settings_update_cursor_theme (GtkSettings *settings)
 {
@@ -2475,14 +2502,19 @@ settings_update_cursor_theme (GtkSettings *settings)
   gchar *theme = NULL;
   gint size = 0;
 
-  g_object_get (settings,
-                "gtk-cursor-theme-name", &theme,
-                "gtk-cursor-theme-size", &size,
-                NULL);
+#ifdef GDK_WINDOWING_X11
+  if (GDK_IS_X11_DISPLAY (display))
+    {
+      g_object_get (settings,
+                    "gtk-cursor-theme-name", &theme,
+                    "gtk-cursor-theme-size", &size,
+                    NULL);
 
-  gdk_x11_display_set_cursor_theme (display, theme, size);
+      gdk_x11_display_set_cursor_theme (display, theme, size);
 
-  g_free (theme);
+      g_free (theme);
+    }
+#endif
 }
 
 static void
@@ -2559,10 +2591,10 @@ settings_update_font_options (GtkSettings *settings)
   cairo_font_options_destroy (options);
 }
 
-#ifdef GDK_WINDOWING_X11
 static gboolean
 settings_update_fontconfig (GtkSettings *settings)
 {
+#ifdef GDK_WINDOWING_X11
   static guint    last_update_timestamp;
   static gboolean last_update_needed;
 
@@ -2594,8 +2626,8 @@ settings_update_fontconfig (GtkSettings *settings)
     }
 
   return last_update_needed;
-}
 #endif /* GDK_WINDOWING_X11 */
+}
 
 static void
 settings_update_resolution (GtkSettings *settings)
@@ -2615,7 +2647,6 @@ settings_update_resolution (GtkSettings *settings)
 
   gdk_screen_set_resolution (priv->screen, dpi);
 }
-#endif
 
 typedef struct
 {
@@ -2657,7 +2688,7 @@ settings_update_color_scheme (GtkSettings *settings)
                               data, (GDestroyNotify) color_scheme_data_free);
 
       g_value_init (&value, G_TYPE_STRING);
-      if (gdk_screen_get_setting (priv->screen, "gtk-color-scheme", &value))
+      if (priv->screen && gdk_screen_get_setting (priv->screen, "gtk-color-scheme", &value))
         {
           merge_color_scheme (settings, &value, GTK_SETTINGS_SOURCE_XSETTING);
           g_value_unset (&value);
@@ -2666,20 +2697,38 @@ settings_update_color_scheme (GtkSettings *settings)
 }
 
 static void
-settings_update_theme (GtkSettings *settings)
+settings_update_provider (GdkScreen       *screen,
+                          GtkCssProvider **old,
+                          GtkCssProvider  *new)
 {
-  static GQuark quark_theme_name = 0;
+  if (*old != new)
+    {
+      if (*old)
+        {
+          gtk_style_context_remove_provider_for_screen (screen,
+                                                        GTK_STYLE_PROVIDER (*old));
+          g_object_unref (*old);
+          *old = NULL;
+        }
 
+      if (new)
+        {
+          gtk_style_context_add_provider_for_screen (screen,
+                                                     GTK_STYLE_PROVIDER (new),
+                                                     GTK_STYLE_PROVIDER_PRIORITY_THEME);
+          *old = g_object_ref (new);
+        }
+    }
+}
+
+static void
+settings_update_theme (GtkSettings *settings)
+{
   GtkSettingsPrivate *priv = settings->priv;
-  GtkCssProvider *provider, *new_provider = NULL;
+  GtkCssProvider *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,
@@ -2687,31 +2736,14 @@ settings_update_theme (GtkSettings *settings)
 
   if (theme_name && *theme_name)
     {
-      gchar *variant = NULL;
-
       if (prefer_dark_theme)
-        variant = "dark";
+        provider = gtk_css_provider_get_named (theme_name, "dark");
 
-      new_provider = gtk_css_provider_get_named (theme_name, variant);
+      if (!provider)
+        provider = gtk_css_provider_get_named (theme_name, NULL);
     }
 
-  if (new_provider != provider)
-    {
-      if (provider)
-        gtk_style_context_remove_provider_for_screen (priv->screen,
-                                                      GTK_STYLE_PROVIDER (provider));
-
-      if (new_provider)
-        {
-          gtk_style_context_add_provider_for_screen (priv->screen,
-                                                     GTK_STYLE_PROVIDER (new_provider),
-                                                     GTK_STYLE_PROVIDER_PRIORITY_THEME);
-          g_object_ref (new_provider);
-        }
-
-      g_object_set_qdata_full (G_OBJECT (settings), quark_theme_name,
-                               new_provider, (GDestroyNotify) g_object_unref);
-    }
+  settings_update_provider (priv->screen, &priv->theme_provider, provider);
 
   if (theme_name && *theme_name)
     {
@@ -2732,6 +2764,24 @@ settings_update_theme (GtkSettings *settings)
   g_free (theme_name);
 }
 
+static void
+settings_update_key_theme (GtkSettings *settings)
+{
+  GtkSettingsPrivate *priv = settings->priv;
+  GtkCssProvider *provider = NULL;
+  gchar *key_theme_name;
+
+  g_object_get (settings,
+                "gtk-key-theme-name", &key_theme_name,
+                NULL);
+
+  if (key_theme_name && *key_theme_name)
+    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);
+}
+
 static gboolean
 add_color_to_hash (gchar      *name,
                    GdkColor   *color,
@@ -3064,7 +3114,7 @@ gtk_settings_load_from_key_file (GtkSettings       *settings,
             g_value_init (&svalue.value, G_TYPE_GSTRING);
             s_val = g_key_file_get_string (keyfile, "Settings", key, &error);
             if (!error)
-              g_value_set_boxed (&svalue.value, g_string_new (s_val));
+              g_value_take_boxed (&svalue.value, g_string_new (s_val));
             g_free (s_val);
             break;
           }