changeset 108815:93729e1f822d

Handle face-ignored-fonts
author Kenichi Handa <handa@etlken>
date Fri, 28 May 2010 15:46:28 +0900
parents cedf7619d7c8 (current diff) 9d7ea82188d8 (diff)
children 94d1d8a6dcfd d54e74c34f05 922942081399
files
diffstat 2 files changed, 42 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Thu May 27 21:25:06 2010 -0700
+++ b/src/ChangeLog	Fri May 28 15:46:28 2010 +0900
@@ -1,3 +1,10 @@
+2010-05-28  Kenichi Handa  <handa@m17n.org>
+
+	* 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-05-28  Glenn Morris  <rgm@gnu.org>
 
 	* Makefile.in (LIBES): Remove $LOADLIBES, it is never set.
--- a/src/font.c	Thu May 27 21:25:06 2010 -0700
+++ b/src/font.c	Fri May 28 15:46:28 2010 +0900
@@ -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);
       }