From b0ba40f812ebf98be20d03a2f64e4e50a7df8d05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Thu, 11 Mar 2010 23:00:20 +0100 Subject: [PATCH] Pick up system settings for font rendering The appearance capplet has a tab for font settings, which we currently ignore - pick up the settings for resolution, antialiasing and hint style. https://bugzilla.gnome.org/show_bug.cgi?id=599713 --- src/gnome-shell-plugin.c | 115 ++++++++++++++++++++++++++++++++------ src/st/st-theme-context.c | 21 ++++++- src/st/st-theme-context.h | 1 + 3 files changed, 118 insertions(+), 19 deletions(-) diff --git a/src/gnome-shell-plugin.c b/src/gnome-shell-plugin.c index 198d1ce9a..23d016e21 100644 --- a/src/gnome-shell-plugin.c +++ b/src/gnome-shell-plugin.c @@ -32,6 +32,7 @@ #include #include +#include #include #include #include @@ -44,6 +45,7 @@ #include "shell-global-private.h" #include "shell-wm.h" +#include "st.h" static void gnome_shell_plugin_dispose (GObject *object); static void gnome_shell_plugin_finalize (GObject *object); @@ -145,20 +147,18 @@ gnome_shell_plugin_init (GnomeShellPlugin *shell_plugin) } static void -gnome_shell_plugin_start (MutterPlugin *plugin) +update_font_options (GtkSettings *settings) { - GnomeShellPlugin *shell_plugin = GNOME_SHELL_PLUGIN (plugin); - MetaScreen *screen; - MetaDisplay *display; - GError *error = NULL; - int status; - const char *shell_js; - char **search_path; + StThemeContext *context; + ClutterStage *stage; ClutterBackend *backend; - cairo_font_options_t *font_options; - - bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); - bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + gint dpi; + gint hinting; + gchar *hint_style_str; + cairo_hint_style_t hint_style = CAIRO_HINT_STYLE_NONE; + gint antialias; + cairo_antialias_t antialias_mode = CAIRO_ANTIALIAS_NONE; + cairo_font_options_t *options; /* Disable text mipmapping; it causes problems on pre-GEM Intel * drivers and we should just be rendering text at the right @@ -167,21 +167,100 @@ gnome_shell_plugin_start (MutterPlugin *plugin) */ clutter_set_font_flags (clutter_get_font_flags () & ~CLUTTER_FONT_MIPMAPPING); + g_object_get (settings, + "gtk-xft-dpi", &dpi, + "gtk-xft-antialias", &antialias, + "gtk-xft-hinting", &hinting, + "gtk-xft-hintstyle", &hint_style_str, + NULL); + + stage = CLUTTER_STAGE (clutter_stage_get_default ()); + context = st_theme_context_get_for_stage (stage); + + if (dpi != -1) + /* GTK stores resolution as 1024 * dots/inch */ + st_theme_context_set_resolution (context, dpi / 1024); + else + st_theme_context_set_default_resolution (context); + /* Clutter (as of 0.9) passes comprehensively wrong font options * override whatever set_font_flags() did above. * * http://bugzilla.openedhand.com/show_bug.cgi?id=1456 */ backend = clutter_get_default_backend (); - font_options = cairo_font_options_create (); - /* Default options for everything is reasonable; except that - * we want to turn off subpixel anti-aliasing; since Clutter + options = cairo_font_options_create (); + + cairo_font_options_set_hint_metrics (options, CAIRO_HINT_METRICS_ON); + + if (hinting >= 0 && !hinting) + { + hint_style = CAIRO_HINT_STYLE_NONE; + } + else if (hint_style_str) + { + if (strcmp (hint_style_str, "hintnone") == 0) + hint_style = CAIRO_HINT_STYLE_NONE; + else if (strcmp (hint_style_str, "hintslight") == 0) + hint_style = CAIRO_HINT_STYLE_SLIGHT; + else if (strcmp (hint_style_str, "hintmedium") == 0) + hint_style = CAIRO_HINT_STYLE_MEDIUM; + else if (strcmp (hint_style_str, "hintfull") == 0) + hint_style = CAIRO_HINT_STYLE_FULL; + } + + g_free (hint_style_str); + + cairo_font_options_set_hint_style (options, hint_style); + + /* We don't want to turn on subpixel anti-aliasing; since Clutter * doesn't currently have the code to support ARGB masks, * generating them then squashing them back to A8 is pointless. */ - cairo_font_options_set_antialias (font_options, CAIRO_ANTIALIAS_GRAY); - clutter_backend_set_font_options (backend, font_options); - cairo_font_options_destroy (font_options); + antialias_mode = (antialias < 0 || antialias) ? CAIRO_ANTIALIAS_GRAY + : CAIRO_ANTIALIAS_NONE; + + cairo_font_options_set_antialias (options, antialias_mode); + + clutter_backend_set_font_options (backend, options); + cairo_font_options_destroy (options); +} + +static void +settings_notify_cb (GtkSettings *settings, + GParamSpec *pspec, + gpointer data) +{ + update_font_options (settings); +} + +static void +gnome_shell_plugin_start (MutterPlugin *plugin) +{ + GnomeShellPlugin *shell_plugin = GNOME_SHELL_PLUGIN (plugin); + MetaScreen *screen; + MetaDisplay *display; + GtkSettings *settings; + GError *error = NULL; + int status; + const char *shell_js; + char **search_path; + + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + + settings = gtk_settings_get_default (); + g_object_connect (settings, + "signal::notify::gtk-xft-dpi", + G_CALLBACK (settings_notify_cb), NULL, + "signal::notify::gtk-xft-antialias", + G_CALLBACK (settings_notify_cb), NULL, + "signal::notify::gtk-xft-hinting", + G_CALLBACK (settings_notify_cb), NULL, + "signal::notify::gtk-xft-hintstyle", + G_CALLBACK (settings_notify_cb), NULL, + NULL); + update_font_options (settings); screen = mutter_plugin_get_screen (plugin); display = meta_screen_get_display (screen); diff --git a/src/st/st-theme-context.c b/src/st/st-theme-context.c index ce755d585..a3e25ca83 100644 --- a/src/st/st-theme-context.c +++ b/src/st/st-theme-context.c @@ -207,7 +207,26 @@ st_theme_context_set_resolution (StThemeContext *context, } /** - * st_theme_context_set_resolution: + * st_theme_context_set_default_resolution: + * @context: a #StThemeContext + * + * Sets the resolution of the theme context to the default value of 96. + * See st_theme_context_set_resolution(). + */ +void +st_theme_context_set_default_resolution (StThemeContext *context) +{ + g_return_if_fail (ST_IS_THEME_CONTEXT (context)); + + if (context->resolution == DEFAULT_RESOLUTION) + return; + + context->resolution = DEFAULT_RESOLUTION; + st_theme_context_changed (context); +} + +/** + * st_theme_context_get_resolution: * @context: a #StThemeContext * * Gets the current resolution of the theme context. diff --git a/src/st/st-theme-context.h b/src/st/st-theme-context.h index 64d376451..b55f31c49 100644 --- a/src/st/st-theme-context.h +++ b/src/st/st-theme-context.h @@ -38,6 +38,7 @@ StTheme * st_theme_context_get_theme (StThemeContext void st_theme_context_set_resolution (StThemeContext *context, gdouble resolution); +void st_theme_context_set_default_resolution (StThemeContext *context); double st_theme_context_get_resolution (StThemeContext *context); void st_theme_context_set_font (StThemeContext *context, const PangoFontDescription *font);