# HG changeset patch # User Chong Yidong # Date 1288900047 14400 # Node ID 7be30ce79ffd80af0e225716058c9badd5e725d3 # Parent 1d6217a4747447a103ab041ca43549af383d026e# Parent 0c4c440f303cddb48759a543f5a2550d8e5eb47c Backport fix for Bug#6287 from trunk. * font.c (font_delete_unmatched): Check Vface_ignored_fonts. Don't sheck SPEC if it is nil. (font_list_entities): Call font_delete_unmatched if Vface_ignored_fonts is non-nil. diff -r 1d6217a47474 -r 7be30ce79ffd src/ChangeLog --- a/src/ChangeLog Thu Nov 04 15:39:47 2010 -0400 +++ b/src/ChangeLog Thu Nov 04 15:47:27 2010 -0400 @@ -1,3 +1,10 @@ +2010-11-04 Kenichi Handa + + * font.c (font_delete_unmatched): Check Vface_ignored_fonts. + Don't sheck SPEC if it is nil. + (font_list_entities): Call font_delete_unmatched if + Vface_ignored_fonts is non-nil. + 2010-11-04 YAMAMOTO Mitsuharu * dispextern.h (TRY_WINDOW_CHECK_MARGINS) diff -r 1d6217a47474 -r 7be30ce79ffd src/font.c --- a/src/font.c Thu Nov 04 15:39:47 2010 -0400 +++ b/src/font.c Thu Nov 04 15:47:27 2010 -0400 @@ -2821,6 +2821,14 @@ static Lisp_Object scratch_font_spec, scratch_font_prefer; +/* Check each font-entity in VEC, and return a list of font-entities + that satisfy this condition: + (1) matches with SPEC and SIZE if SPEC is not nil, and + (2) doesn't match with any regexps in Vface_ignored_fonts (if non-nil). +*/ + +extern Lisp_Object Vface_ignored_fonts; + Lisp_Object font_delete_unmatched (vec, spec, size) Lisp_Object vec, spec; @@ -2833,6 +2841,29 @@ for (val = Qnil, i = ASIZE (vec) - 1; i >= 0; i--) { entity = AREF (vec, i); + if (! NILP (Vface_ignored_fonts)) + { + char name[256]; + Lisp_Object tail, regexp; + + if (font_unparse_xlfd (entity, 0, name, 256) >= 0) + { + for (tail = Vface_ignored_fonts; CONSP (tail); tail = XCDR (tail)) + { + regexp = XCAR (tail); + if (STRINGP (regexp) + && fast_c_string_match_ignore_case (regexp, name) >= 0) + break; + } + if (CONSP (tail)) + continue; + } + } + if (NILP (spec)) + { + val = Fcons (entity, val); + continue; + } for (prop = FONT_WEIGHT_INDEX; prop < FONT_SIZE_INDEX; prop++) if (INTEGERP (AREF (spec, prop)) && ((XINT (AREF (spec, prop)) >> 8) @@ -2932,8 +2963,10 @@ ASET (copy, FONT_TYPE_INDEX, driver_list->driver->type); XSETCDR (cache, Fcons (Fcons (copy, val), XCDR (cache))); } - if (ASIZE (val) > 0 && need_filtering) - val = font_delete_unmatched (val, spec, size); + if (ASIZE (val) > 0 + && (need_filtering + || ! NILP (Vface_ignored_fonts))) + val = font_delete_unmatched (val, need_filtering ? spec : Qnil, size); if (ASIZE (val) > 0) list = Fcons (val, list); }