diff src/xdisp.c @ 90071:f6b4d0ebf147

Merge from emacs--cvs-trunk--0
author Miles Bader <miles@gnu.org>
date Sun, 02 Jan 2005 09:21:32 +0000
parents 95879cc1ed20 c3661af44571
children cb67264d6096
line wrap: on
line diff
--- a/src/xdisp.c	Sun Jan 02 09:13:19 2005 +0000
+++ b/src/xdisp.c	Sun Jan 02 09:21:32 2005 +0000
@@ -3273,6 +3273,7 @@
      IT's face is restored in set_iterator_to_next.  */
   it->saved_face_id = it->face_id;
   it->method = next_element_from_display_vector;
+  it->ellipsis_p = 1;
 }
 
 
@@ -5008,6 +5009,7 @@
 		  it->current.dpvec_index = 0;
 		  it->saved_face_id = it->face_id;
 		  it->method = next_element_from_display_vector;
+		  it->ellipsis_p = 0;
 		}
 	      else
 		{
@@ -5159,6 +5161,7 @@
 	      it->current.dpvec_index = 0;
 	      it->saved_face_id = it->face_id;
 	      it->method = next_element_from_display_vector;
+	      it->ellipsis_p = 0;
 	      goto get_next;
 	    }
 	}
@@ -5804,10 +5807,11 @@
   saved_glyph_row = it->glyph_row;
   it->glyph_row = NULL;
 
-#define BUFFER_POS_REACHED_P()			    \
-  ((op & MOVE_TO_POS) != 0			    \
-   && BUFFERP (it->object)			    \
-   && IT_CHARPOS (*it) >= to_charpos)
+#define BUFFER_POS_REACHED_P()			\
+  ((op & MOVE_TO_POS) != 0			\
+   && BUFFERP (it->object)			\
+   && IT_CHARPOS (*it) >= to_charpos		\
+   && it->method == next_element_from_buffer)
 
   while (1)
     {
@@ -10914,6 +10918,18 @@
       glyph = cursor;
       x = cursor_x;
     }
+  else if (row->ends_in_ellipsis_p && glyph == end)
+    {
+      /* Scan back over the ellipsis glyphs, decrementing positions.  */
+      while (glyph > row->glyphs[TEXT_AREA]
+	     && (glyph - 1)->charpos == last_pos)
+	glyph--, x -= glyph->pixel_width;
+      /* That loop always goes one position too far,
+	 including the glyph before the ellipsis.
+	 So scan forward over that one.  */
+      x += glyph->pixel_width;
+      glyph++;
+    }
   else if (string_start
 	   && (glyph == end || !BUFFERP (glyph->object) || last_pos > pt_old))
     {
@@ -14715,10 +14731,22 @@
       /* If the row ends with a newline from a string, we don't want
 	 the cursor there (if the row is continued it doesn't end in a
 	 newline).  */
-      if (CHARPOS (row->end.string_pos) >= 0
-	  || MATRIX_ROW_ENDS_IN_MIDDLE_OF_CHAR_P (row))
+      if (CHARPOS (row->end.string_pos) >= 0)
 	cursor_row_p = row->continued_p;
-
+      else if (MATRIX_ROW_ENDS_IN_MIDDLE_OF_CHAR_P (row))
+	{
+	  /* If the row ends in middle of a real character,
+	     and the line is continued, we want the cursor here.
+	     That's because MATRIX_ROW_END_CHARPOS would equal
+	     PT if PT is before the character.  */
+	  if (!row->ends_in_ellipsis_p)
+	    cursor_row_p = row->continued_p;
+	  else
+	  /* If the row ends in an ellipsis, then
+	     MATRIX_ROW_END_CHARPOS will equal point after the invisible text.
+	     We want that position to be displayed after the ellipsis.  */
+	    cursor_row_p = 0;
+	}
       /* If the row ends at ZV, display the cursor at the end of that
 	 row instead of at the start of the row below.  */
       else if (row->ends_at_zv_p)
@@ -15195,6 +15223,11 @@
   /* Remember the position at which this line ends.  */
   row->end = it->current;
 
+  /* Record whether this row ends inside an ellipsis.  */
+  row->ends_in_ellipsis_p
+    = (it->method == next_element_from_display_vector
+       && it->ellipsis_p);
+
   /* Save fringe bitmaps in this row.  */
   row->left_user_fringe_bitmap = it->left_user_fringe_bitmap;
   row->left_user_fringe_face_id = it->left_user_fringe_face_id;