Mercurial > emacs
diff src/ftfont.c @ 106085:cd4cbab8bb21
Handle system default font and changing font parameters.
* xterm.h (struct x_display_info): Add atoms and Window for xsettings.
* xterm.c (handle_one_xevent): Call xft_settings_event for
ClientMessage, PropertyNotify and DestroyNotify.
(x_term_init): If we have XFT, get DPI from Xft.dpi.
Call xsettings_initialize.
* xftfont.c (xftfont_fix_match): New function.
(xftfont_open): Call XftDefaultSubstitute before XftFontMatch.
Call xftfont_fix_match after XftFontMatch.
* xfont.c (xfont_driver): Initialize all members.
* xfns.c (x_default_font_parameter): Try font from Ffont_get_system_font.
Do not get font from x_default_parameter if we got one from
Ffont_get_system_font.
(Fx_select_font): Get the defaut font name from :name of FRAME_FONT (f).
* w32font.c (w32font_driver): Initialize all members.
* termhooks.h (enum event_kind): CONFIG_CHANGED_EVENT is new.
* lisp.h: Declare syms_of_xsettings.
* keyboard.c (kbd_buffer_get_event, make_lispy_event): Handle
CONFIG_CHANGED_EVENT.
* ftfont.c (ftfont_filter_properties): New function.
* frame.c (x_set_font): Remove unused variable lval.
* font.h (struct font_driver): filter_properties is new.
* font.c (font_put_extra): Don't return if val is nil, it means
boolean option is off.
(font_parse_fcname): Collect all extra properties in extra_props
and call filter_properties for all drivers with extra_props and
font as parameter.
(font_open_entity): Do not use cache, it does not pick up new fontconfig
settings like hinting.
(font_load_for_lface): If spec had a name in it, store it in entity.
* emacs.c (main): Call syms_of_xsettings
* config.in: HAVE_GCONF is new.
* Makefile.in (GCONF_CFLAGS, GCONF_LIBS): New variables for HAVE_GCONF.
xsettings.o is new.
* menu-bar.el: Put "Use system font" in Option-menu.
* loadup.el: If feature system-font-setting or font-render-setting is
there, load font-setting.
* Makefile.in (ELCFILES): font-settings.el is new.
* font-setting.el: New file.
* NEWS: Mention dynamic font changes (font-use-system-font).
* configure.in: New option: --with(out)-gconf.
Set HAVE_GCONF if we find gconf.
author | Jan Djärv <jan.h.d@swipnet.se> |
---|---|
date | Tue, 17 Nov 2009 08:21:23 +0000 |
parents | 68dd71358159 |
children | e5416066efd1 |
line wrap: on
line diff
--- a/src/ftfont.c Tue Nov 17 04:44:58 2009 +0000 +++ b/src/ftfont.c Tue Nov 17 08:21:23 2009 +0000 @@ -86,6 +86,8 @@ static Lisp_Object ftfont_lookup_cache P_ ((Lisp_Object, enum ftfont_cache_for)); +static void ftfont_filter_properties P_ ((Lisp_Object font, Lisp_Object alist)); + Lisp_Object ftfont_font_format P_ ((FcPattern *, Lisp_Object)); #define SYMBOL_FcChar8(SYM) (FcChar8 *) SDATA (SYMBOL_NAME (SYM)) @@ -545,10 +547,12 @@ NULL, /* check */ #ifdef HAVE_OTF_GET_VARIATION_GLYPHS - ftfont_variation_glyphs + ftfont_variation_glyphs, #else - NULL + NULL, #endif + + ftfont_filter_properties, /* filter_properties */ }; extern Lisp_Object QCname; @@ -2226,7 +2230,94 @@ return intern ("unknown"); } - +static const char *ftfont_booleans [] = { + ":antialias", + ":hinting", + ":verticallayout", + ":autohint", + ":globaladvance", + ":outline", + ":scalable", + ":minspace", + ":embolden", + NULL, +}; + +static const char *ftfont_non_booleans [] = { + ":family", + ":familylang", + ":style", + ":stylelang", + ":fullname", + ":fullnamelang", + ":slant", + ":weight", + ":size", + ":width", + ":aspect", + ":pixelsize", + ":spacing", + ":foundry", + ":hintstyle", + ":file", + ":index", + ":ftface", + ":rasterizer", + ":scale", + ":dpi", + ":rgba", + ":lcdfilter", + ":charset", + ":lang", + ":fontversion", + ":capability", + NULL, +}; + +static void +ftfont_filter_properties (font, alist) + Lisp_Object font; + Lisp_Object alist; +{ + Lisp_Object it; + int i; + + /* Set boolean values to Qt or Qnil */ + for (i = 0; ftfont_booleans[i] != NULL; ++i) + for (it = alist; ! NILP (it); it = XCDR (it)) + { + Lisp_Object key = XCAR (XCAR (it)); + Lisp_Object val = XCDR (XCAR (it)); + char *keystr = SDATA (SYMBOL_NAME (key)); + + if (strcmp (ftfont_booleans[i], keystr) == 0) + { + char *str = SYMBOLP (val) ? SDATA (SYMBOL_NAME (val)) : NULL; + if (INTEGERP (val)) str = XINT (val) != 0 ? "true" : "false"; + if (str == NULL) str = "true"; + + val = Qt; + if (strcmp ("false", str) == 0 || strcmp ("False", str) == 0 + || strcmp ("FALSE", str) == 0 || strcmp ("FcFalse", str) == 0 + || strcmp ("off", str) == 0 || strcmp ("OFF", str) == 0 + || strcmp ("Off", str) == 0) + val = Qnil; + Ffont_put (font, key, val); + } + } + + for (i = 0; ftfont_non_booleans[i] != NULL; ++i) + for (it = alist; ! NILP (it); it = XCDR (it)) + { + Lisp_Object key = XCAR (XCAR (it)); + Lisp_Object val = XCDR (XCAR (it)); + char *keystr = SDATA (SYMBOL_NAME (key)); + if (strcmp (ftfont_non_booleans[i], keystr) == 0) + Ffont_put (font, key, val); + } +} + + void syms_of_ftfont () {