changeset 108103:01ca94871a56

Fix cursor motion at end of line that ends in a composed character. xdisp.c (display_line): Use `reseat' instead of `reseat_1', and use `get_next_display_element' and `set_iterator_to_next' to advance to the next character, when looking for the character that begins the next row.
author Eli Zaretskii <eliz@gnu.org>
date Sat, 24 Apr 2010 14:11:40 +0300
parents 8cdd7952f894 (current diff) 882652fb64a7 (diff)
children 17710e3a17df
files src/ChangeLog src/xdisp.c
diffstat 2 files changed, 22 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Sat Apr 24 10:36:27 2010 +0300
+++ b/src/ChangeLog	Sat Apr 24 14:11:40 2010 +0300
@@ -1,6 +1,11 @@
 2010-04-24  Eli Zaretskii  <eliz@gnu.org>
 
-	* .gdbinit: Add a "set Fmake_symbol" line to force GDB load the
+	* xdisp.c (display_line): Use `reseat' instead of `reseat_1', and
+	use `get_next_display_element' and `set_iterator_to_next' to
+	advance to the next character, when looking for the character that
+	begins the next row.
+
+	* .gdbinit: Add a "set Fmake_symbol" line to force GDB to load the
 	definition of "struct Lisp_Symbol".
 
 2010-04-24  Glenn Morris  <rgm@gnu.org>
@@ -55,6 +60,10 @@
 
 	Support `display' text properties and overlay strings in bidi
 	buffers.
+=======
+2010-04-23  Eli Zaretskii  <eliz@gnu.org>
+
+>>>>>>> MERGE-SOURCE
 	* xdisp.c (pop_it): When the stack is popped after displaying
 	from a string, bidi-iterate to exit from the text portion covered
 	by the `display' property or overlay.  (Bug#5988, bug#5920)
--- a/src/xdisp.c	Sat Apr 24 10:36:27 2010 +0300
+++ b/src/xdisp.c	Sat Apr 24 14:11:40 2010 +0300
@@ -17969,17 +17969,20 @@
 	}
       else if (row->used[TEXT_AREA] && max_pos)
 	{
-	  SET_TEXT_POS (tpos, max_pos + 1, CHAR_TO_BYTE (max_pos + 1));
+	  SET_TEXT_POS (tpos, max_pos, CHAR_TO_BYTE (max_pos));
+	  save_it = *it;
+	  it->bidi_p = 0;
+	  reseat (it, tpos, 0);
+	  if (!get_next_display_element (it))
+	    abort ();	/* row at ZV was already handled above */
+	  set_iterator_to_next (it, 1);
 	  row_end = it->current;
-	  row_end.pos = tpos;
 	  /* If the character at max_pos+1 is a newline, skip that as
 	     well.  Note that this may skip some invisible text.  */
-	  if (FETCH_CHAR (tpos.bytepos) == '\n'
-	      || (FETCH_CHAR (tpos.bytepos) == '\r' && it->selective))
-	    {
-	      save_it = *it;
-	      it->bidi_p = 0;
-	      reseat_1 (it, tpos, 0);
+	  if (!get_next_display_element (it))
+	    abort ();
+	  if (ITERATOR_AT_END_OF_LINE_P (it))
+	    {
 	      set_iterator_to_next (it, 1);
 	      /* Record the position after the newline of a continued
 		 row.  We will need that to set ROW->end of the last
@@ -17994,7 +17997,6 @@
 		  row_end = it->current;
 		  save_it.eol_pos.charpos = save_it.eol_pos.bytepos = 0;
 		}
-	      *it = save_it;
 	    }
 	  else if (!row->continued_p
 		   && MATRIX_ROW_CONTINUATION_LINE_P (row)
@@ -18008,6 +18010,7 @@
 	      row_end.pos = it->eol_pos;
 	      it->eol_pos.charpos = it->eol_pos.bytepos = 0;
 	    }
+	  *it = save_it;
 	  row->end = row_end;
 	}
     }