#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
GData *queued_settings; /* of type GtkSettingsValue* */
GtkSettingsPropertyValue *property_values;
GdkScreen *screen;
+ GtkCssProvider *theme_provider;
+ GtkCssProvider *key_theme_provider;
};
typedef enum
PROP_FONT_NAME,
PROP_ICON_SIZES,
PROP_MODULES,
-#ifdef GDK_WINDOWING_X11
PROP_XFT_ANTIALIAS,
PROP_XFT_HINTING,
PROP_XFT_HINTSTYLE,
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,
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,
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);
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);
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"),
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"),
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);
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);
}
GTK_STYLE_PROVIDER_PRIORITY_SETTINGS);
settings_update_theme (settings);
+ settings_update_key_theme (settings);
}
/**
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);
}
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
case PROP_CURSOR_THEME_SIZE:
settings_update_cursor_theme (settings);
break;
-#endif /* GDK_WINDOWING_X11 */
}
}
g_free (modules);
}
-#ifdef GDK_WINDOWING_X11
static void
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
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;
}
return last_update_needed;
-}
#endif /* GDK_WINDOWING_X11 */
+}
static void
settings_update_resolution (GtkSettings *settings)
gdk_screen_set_resolution (priv->screen, dpi);
}
-#endif
typedef struct
{
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);
}
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,
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)
{
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,
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;
}