changeset 103114:fa8e2c663118

* xfaces.c (face_at_buffer_position): New arg base_face_id. * xdisp.c (handle_face_prop): Pass base_face_id of iterator to face_at_buffer_position. (face_before_or_after_it_pos, get_next_display_element) (note_mouse_highlight): Update face_at_buffer_position call. * term.c (term_mouse_highlight): * msdos.c (IT_note_mouse_highlight): * fontset.c (Finternal_char_font): * font.c (font_at, font_range): Update face_at_buffer_position call. * dispextern.h (face_at_buffer_position): Update prototype.
author Chong Yidong <cyd@stupidchicken.com>
date Thu, 30 Apr 2009 05:01:57 +0000
parents 9e5db9760121
children d6b2b717f098
files src/ChangeLog src/dispextern.h src/font.c src/fontset.c src/msdos.c src/term.c src/xdisp.c src/xfaces.c
diffstat 8 files changed, 47 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Thu Apr 30 04:53:57 2009 +0000
+++ b/src/ChangeLog	Thu Apr 30 05:01:57 2009 +0000
@@ -1,3 +1,20 @@
+2009-04-30  Chong Yidong  <cyd@stupidchicken.com>
+
+	* xfaces.c (face_at_buffer_position): New arg base_face_id.
+
+	* xdisp.c (handle_face_prop): Pass base_face_id of iterator to
+	face_at_buffer_position.
+	(face_before_or_after_it_pos, get_next_display_element)
+	(note_mouse_highlight): Update face_at_buffer_position call.
+
+	* term.c (term_mouse_highlight):
+	* msdos.c (IT_note_mouse_highlight):
+	* fontset.c (Finternal_char_font):
+	* font.c (font_at, font_range): Update face_at_buffer_position
+	call.
+
+	* dispextern.h (face_at_buffer_position): Update prototype.
+
 2009-04-30  Kenichi Handa  <handa@m17n.org>
 
 	* fontset.c (fontset_find_font): Check if rfont_def is Qnil or
--- a/src/dispextern.h	Thu Apr 30 04:53:57 2009 +0000
+++ b/src/dispextern.h	Thu Apr 30 05:01:57 2009 +0000
@@ -2923,7 +2923,7 @@
 int face_at_buffer_position P_ ((struct window *w, EMACS_INT pos,
 				 EMACS_INT region_beg, EMACS_INT region_end,
 				 EMACS_INT *endptr, EMACS_INT limit,
-				 int mouse));
+				 int mouse, int base_face_id));
 int face_for_overlay_string P_ ((struct window *w, EMACS_INT pos,
 				 EMACS_INT region_beg, EMACS_INT region_end,
 				 EMACS_INT *endptr, EMACS_INT limit,
--- a/src/font.c	Thu Apr 30 04:53:57 2009 +0000
+++ b/src/font.c	Thu Apr 30 05:01:57 2009 +0000
@@ -3780,7 +3780,7 @@
 					   DEFAULT_FACE_ID, 0);
       else
 	face_id = face_at_buffer_position (w, pos, -1, -1, &endptr,
-					   pos + 100, 0);
+					   pos + 100, 0, -1);
       face = FACE_FROM_ID (f, face_id);
     }
   if (multibyte)
@@ -3827,7 +3827,8 @@
 	{
 	  int face_id;
 
-	  face_id = face_at_buffer_position (w, pos, 0, 0, &ignore, *limit, 0);
+	  face_id = face_at_buffer_position (w, pos, 0, 0, &ignore,
+					     *limit, 0, -1);
 	  face = FACE_FROM_ID (XFRAME (w->frame), face_id);
 	}
     }
--- a/src/fontset.c	Thu Apr 30 04:53:57 2009 +0000
+++ b/src/fontset.c	Thu Apr 30 05:01:57 2009 +0000
@@ -1876,7 +1876,8 @@
 	return Qnil;
       w = XWINDOW (window);
       f = XFRAME (w->frame);
-      face_id = face_at_buffer_position (w, pos, -1, -1, &dummy, pos + 100, 0);
+      face_id = face_at_buffer_position (w, pos, -1, -1, &dummy,
+					 pos + 100, 0, -1);
       charset = Fget_char_property (position, Qcharset, Qnil);
       if (CHARSETP (charset))
 	cs_id = XINT (CHARSET_SYMBOL_ID (charset));
--- a/src/msdos.c	Thu Apr 30 04:53:57 2009 +0000
+++ b/src/msdos.c	Thu Apr 30 05:01:57 2009 +0000
@@ -1524,7 +1524,8 @@
 		dpyinfo->mouse_face_face_id
 		  = face_at_buffer_position (w, pos, 0, 0,
 					     &ignore, pos + 1,
-					     !dpyinfo->mouse_face_hidden);
+					     !dpyinfo->mouse_face_hidden,
+					     -1);
 
 		/* Display it as active.  */
 		show_mouse_face (dpyinfo, 1);
@@ -1559,7 +1560,8 @@
 		dpyinfo->mouse_face_face_id
 		  = face_at_buffer_position (w, pos, 0, 0,
 					     &ignore, pos + 1,
-					     !dpyinfo->mouse_face_hidden);
+					     !dpyinfo->mouse_face_hidden,
+					     -1);
 
 		/* Display it as active.  */
 		show_mouse_face (dpyinfo, 1);
--- a/src/term.c	Thu Apr 30 04:53:57 2009 +0000
+++ b/src/term.c	Thu Apr 30 05:01:57 2009 +0000
@@ -2851,7 +2851,7 @@
 
 		mouse_face_face_id
 		  = face_at_buffer_position (w, pos, 0, 0,
-					     &ignore, pos + 1, 1);
+					     &ignore, pos + 1, 1, -1);
 
 		/* Display it as active.  */
 		term_show_mouse_face (DRAW_MOUSE_FACE);
@@ -2886,7 +2886,7 @@
 
 		mouse_face_face_id
 		  = face_at_buffer_position (w, pos, 0, 0,
-					     &ignore, pos + 1, 1);
+					     &ignore, pos + 1, 1, -1);
 
 		/* Display it as active.  */
 		term_show_mouse_face (DRAW_MOUSE_FACE);
--- a/src/xdisp.c	Thu Apr 30 04:53:57 2009 +0000
+++ b/src/xdisp.c	Thu Apr 30 05:01:57 2009 +0000
@@ -3452,7 +3452,7 @@
 				   &next_stop,
 				   (IT_CHARPOS (*it)
 				    + TEXT_PROP_DISTANCE_LIMIT),
-				   0);
+				   0, it->base_face_id);
 
       /* Is this a start of a run of characters with box face?
 	 Caveat: this can be called for a freshly initialized
@@ -3693,7 +3693,7 @@
 					 it->region_beg_charpos,
 					 it->region_end_charpos,
 					 &next_check_charpos,
-					 limit, 0);
+					 limit, 0, -1);
 
       /* Correct the face for charsets different from ASCII.  Do it
 	 for the multibyte case only.  The face returned above is
@@ -5992,7 +5992,8 @@
 		  next_face_id = face_at_buffer_position
 		    (it->w, CHARPOS (pos), it->region_beg_charpos,
 		     it->region_end_charpos, &ignore,
-		     (IT_CHARPOS (*it) + TEXT_PROP_DISTANCE_LIMIT), 0);
+		     (IT_CHARPOS (*it) + TEXT_PROP_DISTANCE_LIMIT), 0,
+		     -1);
 		  it->end_of_box_run_p
 		    = (FACE_FROM_ID (it->f, next_face_id)->box
 		       == FACE_NO_BOX);
@@ -23898,7 +23899,8 @@
 	      dpyinfo->mouse_face_face_id
 		= face_at_buffer_position (w, pos, 0, 0,
 					   &ignore, pos + 1,
-					   !dpyinfo->mouse_face_hidden);
+					   !dpyinfo->mouse_face_hidden,
+					   -1);
 
 	      /* Display it as active.  */
 	      show_mouse_face (dpyinfo, DRAW_MOUSE_FACE);
@@ -23941,7 +23943,8 @@
 		dpyinfo->mouse_face_face_id
 		  = face_at_buffer_position (w, pos, 0, 0,
 					     &ignore, pos + 1,
-					     !dpyinfo->mouse_face_hidden);
+					     !dpyinfo->mouse_face_hidden,
+					     -1);
 
 	      /* Display it as active.  */
 	      show_mouse_face (dpyinfo, DRAW_MOUSE_FACE);
@@ -24022,7 +24025,8 @@
 		  dpyinfo->mouse_face_face_id
 		    = face_at_buffer_position (w, pos, 0, 0,
 					       &ignore, pos + 1,
-					       !dpyinfo->mouse_face_hidden);
+					       !dpyinfo->mouse_face_hidden,
+					       -1);
 
 		  /* Display it as active.  */
 		  show_mouse_face (dpyinfo, DRAW_MOUSE_FACE);
--- a/src/xfaces.c	Thu Apr 30 04:53:57 2009 +0000
+++ b/src/xfaces.c	Thu Apr 30 05:01:57 2009 +0000
@@ -6251,17 +6251,21 @@
 
    If MOUSE is non-zero, use the character's mouse-face, not its face.
 
+   BASE_FACE_ID, if non-negative, specifies a base face id to use
+   instead of DEFAULT_FACE_ID.
+
    The face returned is suitable for displaying ASCII characters.  */
 
 int
 face_at_buffer_position (w, pos, region_beg, region_end,
-			 endptr, limit, mouse)
+			 endptr, limit, mouse, base_face_id)
      struct window *w;
      EMACS_INT pos;
      EMACS_INT region_beg, region_end;
      EMACS_INT *endptr;
      EMACS_INT limit;
      int mouse;
+     int base_face_id;
 {
   struct frame *f = XFRAME (w->frame);
   Lisp_Object attrs[LFACE_VECTOR_SIZE];
@@ -6304,12 +6308,9 @@
 
   *endptr = endpos;
 
-
-  /* Perhaps remap BASE_FACE_ID to a user-specified alternative.  */
-  if (NILP (Vface_remapping_alist))
-    default_face = FACE_FROM_ID (f, DEFAULT_FACE_ID);
-  else
-    default_face = FACE_FROM_ID (f, lookup_basic_face (f, DEFAULT_FACE_ID));
+  default_face = FACE_FROM_ID (f, base_face_id >= 0 ? base_face_id
+			       : NILP (Vface_remapping_alist) ? DEFAULT_FACE_ID
+			       : lookup_basic_face (f, DEFAULT_FACE_ID));
 
   /* Optimize common cases where we can use the default face.  */
   if (noverlays == 0