summaryrefslogtreecommitdiff
path: root/src/font.c
diff options
context:
space:
mode:
authorJan Djärv <jan.h.d@swipnet.se>2009-11-17 08:21:23 +0000
committerJan Djärv <jan.h.d@swipnet.se>2009-11-17 08:21:23 +0000
commit637fa9880877f485842b7aca18146a1f12c05b96 (patch)
treef4994cdadaad980b7b28827eba6cd50421a7f892 /src/font.c
parent77fd3e0c13b345cd4ff5c9ef5c89bd6b29054bc3 (diff)
downloademacs-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.c40
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;
}