changeset 98279:16fcbc5c4c7d

(get_next_display_element): Handle string display correctly when checking for the end of a box run.
author Chong Yidong <cyd@stupidchicken.com>
date Sat, 20 Sep 2008 21:44:34 +0000
parents 6cc568b9215c
children 7e4e0f0026f6
files src/xdisp.c
diffstat 1 files changed, 45 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/xdisp.c	Sat Sep 20 21:43:47 2008 +0000
+++ b/src/xdisp.c	Sat Sep 20 21:44:34 2008 +0000
@@ -5940,14 +5940,51 @@
   if (it->face_box_p
       && it->s == NULL)
     {
-      int face_id;
-      struct face *face;
-
-      it->end_of_box_run_p
-	= ((face_id = face_after_it_pos (it),
-	    face_id != it->face_id)
-	   && (face = FACE_FROM_ID (it->f, face_id),
-	       face->box == FACE_NO_BOX));
+      if (it->method == GET_FROM_STRING && it->sp)
+	{
+	  int face_id = underlying_face_id (it);
+	  struct face *face = FACE_FROM_ID (it->f, face_id);
+
+	  if (face)
+	    {
+	      if (face->box == FACE_NO_BOX)
+		{
+		  /* If the box comes from face properties in a
+		     display string, check faces in that string.  */
+		  int string_face_id = face_after_it_pos (it);
+		  it->end_of_box_run_p
+		    = (FACE_FROM_ID (it->f, string_face_id)->box
+		       == FACE_NO_BOX);
+		}
+	      /* Otherwise, the box comes from the underlying face.
+		 If this is the last string character displayed, check
+		 the next buffer location.  */
+	      else if ((IT_STRING_CHARPOS (*it) >= SCHARS (it->string) - 1)
+		       && (it->current.overlay_string_index
+			   == it->n_overlay_strings - 1))
+		{
+		  EMACS_INT ignore;
+		  int next_face_id;
+		  struct text_pos pos = it->current.pos;
+		  INC_TEXT_POS (pos, it->multibyte_p);
+
+		  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->end_of_box_run_p
+		    = (FACE_FROM_ID (it->f, next_face_id)->box
+		       == FACE_NO_BOX);
+		}
+	    }
+	}
+      else
+	{
+	  int face_id = face_after_it_pos (it);
+	  it->end_of_box_run_p
+	    = (face_id != it->face_id
+	       && FACE_FROM_ID (it->f, face_id)->box == FACE_NO_BOX);
+	}
     }
 
   /* Value is 0 if end of buffer or string reached.  */