diff options
author | Owen Taylor <otaylor@redhat.com> | 2005-07-21 13:59:22 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2005-07-21 13:59:22 +0000 |
commit | 8f3399d4109f104c1af13b9f1e966d729e1bbe6c (patch) | |
tree | 8e065bb52a5dc5813798f300cb56a9874ddeaf71 /gdk | |
parent | 68bcd510478d7c3d54fd31066bd17ed3f6d3bb3e (diff) | |
download | gdk-pixbuf-8f3399d4109f104c1af13b9f1e966d729e1bbe6c.tar.gz |
Change machinery for following font rendering xsettings to set cairo font
2005-07-19 Owen Taylor <otaylor@redhat.com>
* gtk/gtksettings.c gtk/gtkwidget.c: Change machinery for
following font rendering xsettings to set cairo font
options on PangoContext
* gdk/x11/gdkxftdefaults.c gdk/x11/gdkevents-x11.c gdkscreen-x11.h
gdkprivate-x11.h: Get default values for rendering options
(such as antialiasing, dpi) from the Xft resources for the
display, borrowing a bit of code from Xft.
* gtk/gtksettings.c (gtk_settings_class_init): Fix docs for
values of gtk-xft-hintstyle.
Diffstat (limited to 'gdk')
-rw-r--r-- | gdk/x11/Makefile.am | 1 | ||||
-rw-r--r-- | gdk/x11/gdkevents-x11.c | 15 | ||||
-rw-r--r-- | gdk/x11/gdkprivate-x11.h | 4 | ||||
-rw-r--r-- | gdk/x11/gdkscreen-x11.h | 10 | ||||
-rw-r--r-- | gdk/x11/gdkxftdefaults.c | 294 |
5 files changed, 319 insertions, 5 deletions
diff --git a/gdk/x11/Makefile.am b/gdk/x11/Makefile.am index 13a05aaf5..d6168df23 100644 --- a/gdk/x11/Makefile.am +++ b/gdk/x11/Makefile.am @@ -49,6 +49,7 @@ libgdk_x11_la_SOURCES = \ gdkvisual-x11.c \ gdkwindow-x11.c \ gdkwindow-x11.h \ + gdkxftdefaults.c \ gdkxid.c \ gdkx.h \ gdkprivate-x11.h \ diff --git a/gdk/x11/gdkevents-x11.c b/gdk/x11/gdkevents-x11.c index 74e999135..afbfedb97 100644 --- a/gdk/x11/gdkevents-x11.c +++ b/gdk/x11/gdkevents-x11.c @@ -2895,7 +2895,7 @@ gdk_screen_get_setting (GdkScreen *screen, const char *xsettings_name = NULL; XSettingsResult result; - XSettingsSetting *setting; + XSettingsSetting *setting = NULL; GdkScreenX11 *screen_x11; gboolean success = FALSE; gint i; @@ -2913,12 +2913,12 @@ gdk_screen_get_setting (GdkScreen *screen, } if (!xsettings_name) - return FALSE; + goto out; result = xsettings_client_get_setting (screen_x11->xsettings_client, xsettings_name, &setting); if (result != XSETTINGS_SUCCESS) - return FALSE; + goto out; switch (setting->type) { @@ -2965,9 +2965,14 @@ gdk_screen_get_setting (GdkScreen *screen, g_value_unset (&tmp_val); - xsettings_setting_free (setting); + out: + if (setting) + xsettings_setting_free (setting); - return success; + if (success) + return TRUE; + else + return _gdk_x11_get_xft_setting (screen, name, value); } static GdkFilterReturn diff --git a/gdk/x11/gdkprivate-x11.h b/gdk/x11/gdkprivate-x11.h index 4da0d0caa..5e9e2cba6 100644 --- a/gdk/x11/gdkprivate-x11.h +++ b/gdk/x11/gdkprivate-x11.h @@ -176,6 +176,10 @@ PangoRenderer *_gdk_x11_renderer_get (GdkDrawable *drawable, void _gdk_x11_cursor_update_theme (GdkCursor *cursor); +gboolean _gdk_x11_get_xft_setting (GdkScreen *screen, + const gchar *name, + GValue *value); + extern GdkDrawableClass _gdk_x11_drawable_class; extern gboolean _gdk_use_xshm; extern const int _gdk_nenvent_masks; diff --git a/gdk/x11/gdkscreen-x11.h b/gdk/x11/gdkscreen-x11.h index aa08dca15..5ea82a4fb 100644 --- a/gdk/x11/gdkscreen-x11.h +++ b/gdk/x11/gdkscreen-x11.h @@ -93,6 +93,16 @@ struct _GdkScreenX11 /* Pango renderer object singleton */ PangoRenderer *renderer; + + /* Xft resources for the display, used for default values for + * the Xft/ XSETTINGS + */ + gboolean xft_init; /* Whether we've intialized these values yet */ + gboolean xft_antialias; + gboolean xft_hinting; + gint xft_hintstyle; + gint xft_rgba; + gint xft_dpi; }; struct _GdkScreenX11Class diff --git a/gdk/x11/gdkxftdefaults.c b/gdk/x11/gdkxftdefaults.c new file mode 100644 index 000000000..47248e098 --- /dev/null +++ b/gdk/x11/gdkxftdefaults.c @@ -0,0 +1,294 @@ +/* GDK - The GIMP Drawing Kit + * Copyright © 2005 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Based on code from xftdpy.c + * + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ +#include <stdlib.h> +#include <string.h> + +#include <fontconfig/fontconfig.h> + +#include <gdkscreen-x11.h> +#include <gdkx.h> + +static gint +parse_boolean (char *v) +{ + gchar c0, c1; + + c0 = *v; + if (g_ascii_isupper ((int)c0)) + c0 = g_ascii_tolower (c0); + if (c0 == 't' || c0 == 'y' || c0 == '1') + return 1; + if (c0 == 'f' || c0 == 'n' || c0 == '0') + return 0; + if (c0 == 'o') + { + c1 = v[1]; + if (g_ascii_isupper ((int)c1)) + c1 = g_ascii_tolower (c1); + if (c1 == 'n') + return 1; + if (c1 == 'f') + return 0; + } + + return -1; +} + +static gboolean +get_boolean_default (Display *dpy, + gchar *option, + gboolean *value) +{ + gchar *v; + gint i; + + v = XGetDefault (dpy, "Xft", option); + if (v) + { + i = parse_boolean (v); + if (i >= 0) + { + *value = i; + return TRUE; + } + } + + return FALSE; +} + +static gboolean +get_double_default (Display *dpy, + gchar *option, + gdouble *value) +{ + gchar *v, *e; + + v = XGetDefault (dpy, "Xft", option); + if (v) + { + /* Xft uses strtod, though localization probably wasn't + * desired. For compatibility, we use the conservative + * g_strtod() that accepts either localized or non-localized + * decimal separator. + */ + *value = g_strtod (v, &e); + if (e != v) + return TRUE; + } + + return FALSE; +} + +static gboolean +get_integer_default (Display *dpy, + gchar *option, + gint *value) +{ + gint i; + gchar *v, *e; + + v = XGetDefault (dpy, "Xft", option); + if (v) + { + if (FcNameConstant ((FcChar8 *) v, value)) + return TRUE; + + i = strtol (v, &e, 0); + if (e != v) + return TRUE; + } + + return FALSE; +} + +static void +init_xft_settings (GdkScreen *screen) +{ + GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (screen); + Display *xdisplay = GDK_SCREEN_XDISPLAY (screen); + int xscreen = GDK_SCREEN_XNUMBER (screen); + double dpi_double; + + if (screen_x11->xft_init) + return; + + screen_x11->xft_init = TRUE; + + if (!get_boolean_default (xdisplay, "antialias", &screen_x11->xft_antialias)) + screen_x11->xft_antialias = TRUE; + + if (!get_boolean_default (xdisplay, "hinting", &screen_x11->xft_hinting)) + screen_x11->xft_hinting = TRUE; + + if (!get_integer_default (xdisplay, "hintstyle", &screen_x11->xft_hintstyle)) + screen_x11->xft_hintstyle = FC_HINT_FULL; + + if (!get_integer_default (xdisplay, "rgba", &screen_x11->xft_rgba)) + + { + int subpixel = FC_RGBA_UNKNOWN; + +#if RENDER_MAJOR > 0 || RENDER_MINOR >= 6 + if (_gdk_x11_have_render (screen_x11->display)) + { + int render_order = XRenderQuerySubpixelOrder (xdisplay, xscreen); + + switch (render_order) + { + default: + case SubPixelUnknown: + subpixel = FC_RGBA_UNKNOWN; + break; + case SubPixelHorizontalRGB: + subpixel = FC_RGBA_RGB; + break; + case SubPixelHorizontalBGR: + subpixel = FC_RGBA_BGR; + break; + case SubPixelVerticalRGB: + subpixel = FC_RGBA_VRGB; + break; + case SubPixelVerticalBGR: + subpixel = FC_RGBA_VBGR; + break; + case SubPixelNone: + subpixel = FC_RGBA_NONE; + break; + } + } + + screen_x11->xft_rgba = subpixel; +#endif + } + + if (!get_double_default (xdisplay, "dpi", &dpi_double)) + dpi_double = (((double) DisplayHeight (xdisplay, xscreen) * 25.4) / + (double) DisplayHeightMM (xdisplay, xscreen)); + + screen_x11->xft_dpi = (int)(0.5 + PANGO_SCALE * dpi_double); +} + +gboolean +_gdk_x11_get_xft_setting (GdkScreen *screen, + const gchar *name, + GValue *value) +{ + GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (screen); + + if (strncmp (name, "gtk-xft-", 8) != 0) + return FALSE; + + name += 8; + + init_xft_settings (screen); + + if (strcmp (name, "antialias") == 0) + { + g_value_set_int (value, screen_x11->xft_antialias); + return TRUE; + } + else if (strcmp (name, "hinting") == 0) + { + g_value_set_int (value, screen_x11->xft_hinting); + return TRUE; + } + else if (strcmp (name, "hintstyle") == 0) + { + const char *str; + + switch (screen_x11->xft_hintstyle) + { + case FC_HINT_NONE: + str = "hintnone"; + break; + case FC_HINT_SLIGHT: + str = "hintslight"; + break; + case FC_HINT_MEDIUM: + str = "hintmedium"; + break; + case FC_HINT_FULL: + str = "hintfull"; + break; + default: + return FALSE; + } + + g_value_set_string (value, str); + return TRUE; + } + else if (strcmp (name, "rgba") == 0) + { + const char *str; + + switch (screen_x11->xft_rgba) + { + case FC_RGBA_NONE: + str = "none"; + break; + case FC_RGBA_RGB: + str = "rgb"; + break; + case FC_RGBA_BGR: + str = "bgr"; + break; + case FC_RGBA_VRGB: + str = "vrgb"; + break; + case FC_RGBA_VBGR: + str = "vbgr"; + break; + case FC_RGBA_UNKNOWN: + default: + return FALSE; + } + + g_value_set_string (value, str); + return TRUE; + } + else if (strcmp (name, "dpi") == 0) + { + g_value_set_int (value, screen_x11->xft_dpi); + return TRUE; + } + + return FALSE; +} |