summaryrefslogtreecommitdiff
path: root/gtk/gtksettings.c
diff options
context:
space:
mode:
authorSoeren Sandmann <sandmann@daimi.au.dk>2004-02-21 19:17:48 +0000
committerSøren Sandmann Pedersen <ssp@src.gnome.org>2004-02-21 19:17:48 +0000
commite2e6a5f41141b03c5ccc5231168f3bc78ddf98dd (patch)
treed9f0f52374d43f99a75af8837f4f0cc837f6c2d6 /gtk/gtksettings.c
parentf8890f0883a4f99688886bb6cfe27924a0f92f2c (diff)
downloadgtk+-e2e6a5f41141b03c5ccc5231168f3bc78ddf98dd.tar.gz
Bug 130790 (Federico Mena Quintero, Owen Taylor)
Sat Feb 21 20:09:53 2004 Soeren Sandmann <sandmann@daimi.au.dk> Bug 130790 (Federico Mena Quintero, Owen Taylor) * gdk/x11/gdkevents-x11.c: Add Xft XSETTINGS * gtk/gtksettings.c: Add new GtkSettings corresponding to the Xft XSETTINGS
Diffstat (limited to 'gtk/gtksettings.c')
-rw-r--r--gtk/gtksettings.c169
1 files changed, 167 insertions, 2 deletions
diff --git a/gtk/gtksettings.c b/gtk/gtksettings.c
index 1215db1b81..71cf568f6c 100644
--- a/gtk/gtksettings.c
+++ b/gtk/gtksettings.c
@@ -42,6 +42,12 @@ struct _GtkSettingsPropertyValue
GtkSettingsSource source;
};
+#ifdef GDK_WINDOWING_X11
+#include <X11/Xft/Xft.h>
+#include <pango/pangoxft.h>
+#include <gdk/x11/gdkx.h>
+#endif
+
enum {
PROP_0,
PROP_DOUBLE_CLICK_TIME,
@@ -55,7 +61,12 @@ enum {
PROP_MENU_BAR_ACCEL,
PROP_DND_DRAG_THRESHOLD,
PROP_FONT_NAME,
- PROP_ICON_SIZES
+ PROP_ICON_SIZES,
+ PROP_XFT_ANTIALIAS,
+ PROP_XFT_HINTING,
+ PROP_XFT_HINTSTYLE,
+ PROP_XFT_RGBA,
+ PROP_XFT_DPI
};
@@ -114,6 +125,85 @@ gtk_settings_get_type (void)
return settings_type;
}
+#ifdef GDK_WINDOWING_X11
+static void
+gtk_default_substitute (FcPattern *pattern,
+ gpointer data)
+{
+ GtkSettings *settings = data;
+ gint antialias;
+ gint hinting;
+ char *rgba;
+ char *hintstyle;
+ gint dpi;
+ FcValue v;
+
+ g_object_get (G_OBJECT (settings),
+ "gtk-xft-antialias", &antialias,
+ "gtk-xft-hinting", &hinting,
+ "gtk-xft-hintstyle", &hintstyle,
+ "gtk-xft-rgba", &rgba,
+ "gtk-xft-dpi", &dpi,
+ NULL);
+
+ if (antialias >= 0 &&
+ FcPatternGet (pattern, FC_ANTIALIAS, 0, &v) == FcResultNoMatch)
+ FcPatternAddBool (pattern, FC_ANTIALIAS, antialias != 0);
+
+ if (hinting >= 0 &&
+ FcPatternGet (pattern, FC_HINTING, 0, &v) == FcResultNoMatch)
+ FcPatternAddBool (pattern, FC_HINTING, hinting != 0);
+
+ if (hintstyle && FcPatternGet (pattern, FC_HINT_STYLE, 0, &v) == FcResultNoMatch)
+ {
+ int val = FC_HINT_FULL; /* Quiet GCC */
+ gboolean found = TRUE;
+
+ if (strcmp (hintstyle, "hintnone") == 0)
+ val = FC_HINT_NONE;
+ else if (strcmp (hintstyle, "hintslight") == 0)
+ val = FC_HINT_SLIGHT;
+ else if (strcmp (hintstyle, "hintmedium") == 0)
+ val = FC_HINT_MEDIUM;
+ else if (strcmp (hintstyle, "hintfull") == 0)
+ val = FC_HINT_FULL;
+ else
+ found = FALSE;
+
+ if (found)
+ FcPatternAddInteger (pattern, FC_HINT_STYLE, val);
+ }
+
+ if (rgba && FcPatternGet (pattern, FC_RGBA, 0, &v) == FcResultNoMatch)
+ {
+ int val = FC_RGBA_NONE; /* Quiet GCC */
+ gboolean found = TRUE;
+
+ if (strcmp (rgba, "none") == 0)
+ val = FC_RGBA_NONE;
+ else if (strcmp (rgba, "rgb") == 0)
+ val = FC_RGBA_RGB;
+ else if (strcmp (rgba, "bgr") == 0)
+ val = FC_RGBA_BGR;
+ else if (strcmp (rgba, "vrgb") == 0)
+ val = FC_RGBA_VRGB;
+ else if (strcmp (rgba, "vbgr") == 0)
+ val = FC_RGBA_VBGR;
+ else
+ found = FALSE;
+
+ if (found)
+ FcPatternAddInteger (pattern, FC_RGBA, val);
+ }
+
+ if (dpi >= 0 && FcPatternGet (pattern, FC_DPI, 0, &v) == FcResultNoMatch)
+ FcPatternAddDouble (pattern, FC_DPI, dpi / 1024.);
+
+ g_free (hintstyle);
+ g_free (rgba);
+}
+#endif /* GDK_WINDOWING_X11 */
+
static void
gtk_settings_init (GtkSettings *settings)
{
@@ -265,6 +355,58 @@ gtk_settings_class_init (GtkSettingsClass *class)
G_PARAM_READWRITE),
NULL);
g_assert (result == PROP_ICON_SIZES);
+
+#ifdef GDK_WINDOWING_X11
+ result = settings_install_property_parser (class,
+ g_param_spec_int ("gtk-xft-antialias",
+ _("Xft Antialias"),
+ _("Whether to antialias Xft fonts; 0=no, 1=yes, -1=default"),
+ -1, 1, -1,
+ G_PARAM_READWRITE),
+ NULL);
+
+ g_assert (result == PROP_XFT_ANTIALIAS);
+
+ result = settings_install_property_parser (class,
+ g_param_spec_int ("gtk-xft-hinting",
+ _("Xft Hinting"),
+ _("Whether to hint Xft fonts; 0=no, 1=yes, -1=default"),
+ -1, 1, -1,
+ G_PARAM_READWRITE),
+ NULL);
+
+ g_assert (result == PROP_XFT_HINTING);
+
+ result = settings_install_property_parser (class,
+ g_param_spec_string ("gtk-xft-hintstyle",
+ _("Xft Hint Style"),
+ _("What degree of hinting to use; none, slight, medium, or full"),
+ NULL,
+ G_PARAM_READWRITE),
+ NULL);
+
+ g_assert (result == PROP_XFT_HINTSTYLE);
+
+ result = settings_install_property_parser (class,
+ g_param_spec_string ("gtk-xft-rgba",
+ _("Xft RGBA"),
+ _("Type of subpixel antialiasing; none, rgb, bgr, vrgb, vbgr"),
+ NULL,
+ G_PARAM_READWRITE),
+ NULL);
+
+ g_assert (result == PROP_XFT_RGBA);
+
+ result = settings_install_property_parser (class,
+ g_param_spec_int ("gtk-xft-dpi",
+ _("Xft DPI"),
+ _("Resolution for Xft, in 1024 * dots/inch. -1 to use default value"),
+ -1, 1024*1024, -1,
+ G_PARAM_READWRITE),
+ NULL);
+
+ g_assert (result == PROP_XFT_DPI);
+#endif /* GDK_WINDOWING_X11 */
}
static void
@@ -306,7 +448,17 @@ gtk_settings_get_for_screen (GdkScreen *screen)
{
settings = g_object_new (GTK_TYPE_SETTINGS, NULL);
settings->screen = screen;
- g_object_set_data (G_OBJECT (screen), "gtk-settings", settings);
+ g_object_set_data (G_OBJECT (screen), "gtk-settings", settings);
+
+#ifdef GDK_WINDOWING_X11
+ /* Set the default substitution function for the Pango fontmap.
+ */
+ pango_xft_set_default_substitute (GDK_SCREEN_XDISPLAY (screen),
+ GDK_SCREEN_XNUMBER (screen),
+ gtk_default_substitute,
+ settings, NULL);
+#endif /* GDK_WINDOWING_X11 */
+
gtk_rc_reparse_all_for_settings (settings, TRUE);
settings_update_double_click (settings);
}
@@ -432,6 +584,19 @@ gtk_settings_notify (GObject *object,
case PROP_DOUBLE_CLICK_DISTANCE:
settings_update_double_click (settings);
break;
+#ifdef GDK_WINDOWING_X11
+ case PROP_XFT_ANTIALIAS:
+ case PROP_XFT_HINTING:
+ case PROP_XFT_HINTSTYLE:
+ case PROP_XFT_RGBA:
+ case PROP_XFT_DPI:
+ pango_xft_substitute_changed (GDK_SCREEN_XDISPLAY (settings->screen),
+ GDK_SCREEN_XNUMBER (settings->screen));
+ /* See comments with _gtk_rc_reset_styles for why this is a hack
+ */
+ _gtk_rc_reset_styles (GTK_SETTINGS (object));
+ break;
+#endif /* GDK_WINDOWING_X11 */
}
}