diff options
author | Jan Djärv <jan.h.d@swipnet.se> | 2009-11-17 08:21:23 +0000 |
---|---|---|
committer | Jan Djärv <jan.h.d@swipnet.se> | 2009-11-17 08:21:23 +0000 |
commit | 637fa9880877f485842b7aca18146a1f12c05b96 (patch) | |
tree | f4994cdadaad980b7b28827eba6cd50421a7f892 /src/font.c | |
parent | 77fd3e0c13b345cd4ff5c9ef5c89bd6b29054bc3 (diff) | |
download | emacs-637fa9880877f485842b7aca18146a1f12c05b96.tar.gz |
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.
Diffstat (limited to 'src/font.c')
-rw-r--r-- | src/font.c | 40 |
1 files changed, 32 insertions, 8 deletions
diff --git a/src/font.c b/src/font.c index bab3d9f821c..1c0a9dfb236 100644 --- a/src/font.c +++ b/src/font.c @@ -718,8 +718,6 @@ font_put_extra (font, prop, val) { Lisp_Object prev = Qnil; - if (NILP (val)) - return val; while (CONSP (extra) && NILP (Fstring_lessp (prop, XCAR (XCAR (extra))))) prev = extra, extra = XCDR (extra); @@ -1431,6 +1429,8 @@ font_parse_fcname (name, font) if (family_end) { + Lisp_Object extra_props = Qnil; + /* A fontconfig name with size and/or property data. */ if (family_end > name) { @@ -1504,13 +1504,25 @@ font_parse_fcname (name, font) if (prop >= FONT_FOUNDRY_INDEX && prop < FONT_EXTRA_INDEX) - ASET (font, prop, font_prop_validate (prop, Qnil, val)); - else - Ffont_put (font, key, val); + ASET (font, prop, font_prop_validate (prop, Qnil, val)); + else + { + extra_props = nconc2 (extra_props, + Fcons (Fcons (key, val), Qnil)); + } } p = q; } } + + if (! NILP (extra_props)) + { + struct font_driver_list *driver_list = font_driver_list; + for ( ; driver_list; driver_list = driver_list->next) + if (driver_list->driver->filter_properties) + (*driver_list->driver->filter_properties) (font, extra_props); + } + } else { @@ -2975,11 +2987,15 @@ font_open_entity (f, entity, pixel_size) else if (CONSP (Vface_font_rescale_alist)) scaled_pixel_size = pixel_size * font_rescale_ratio (entity); +#if 0 + /* This doesn't work if you have changed hinting or any other parameter. + We need to make a new object in every case to be sure. */ for (objlist = AREF (entity, FONT_OBJLIST_INDEX); CONSP (objlist); objlist = XCDR (objlist)) if (! NILP (AREF (XCAR (objlist), FONT_TYPE_INDEX)) && XFONT_OBJECT (XCAR (objlist))->pixel_size == pixel_size) return XCAR (objlist); +#endif val = AREF (entity, FONT_TYPE_INDEX); for (driver_list = f->font_driver_list; @@ -3155,12 +3171,14 @@ font_clear_prop (attrs, prop) if (! FONTP (font)) return; +#if 0 if (! NILP (Ffont_get (font, QCname))) { font = Fcopy_font_spec (font); font_put_extra (font, QCname, Qnil); } +#endif if (NILP (AREF (font, prop)) && prop != FONT_FAMILY_INDEX && prop != FONT_FOUNDRY_INDEX @@ -3438,7 +3456,7 @@ font_find_for_lface (f, attrs, spec, c) val = font_select_entity (frame, entities, attrs, pixel_size, c); if (! NILP (val)) - return val; + return val; } } } @@ -3500,7 +3518,7 @@ font_load_for_lface (f, attrs, spec) FRAME_PTR f; Lisp_Object *attrs, spec; { - Lisp_Object entity; + Lisp_Object entity, name; entity = font_find_for_lface (f, attrs, spec, -1); if (NILP (entity)) @@ -3512,7 +3530,13 @@ font_load_for_lface (f, attrs, spec) if (NILP (entity)) return Qnil; } - return font_open_for_lface (f, entity, attrs, spec); + /* Don't loose the original name that was put in initially. We need + it to re-apply the font when font parameters (like hinting or dpi) have + changed. */ + entity = font_open_for_lface (f, entity, attrs, spec); + name = Ffont_get (spec, QCname); + if (STRINGP (name)) font_put_extra (entity, QCname, name); + return entity; } |