]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix cursor motion at end of line that ends with a composite character.
authorEli Zaretskii <eliz@gnu.org>
Sat, 24 Apr 2010 11:07:27 +0000 (14:07 +0300)
committerEli Zaretskii <eliz@gnu.org>
Sat, 24 Apr 2010 11:07:27 +0000 (14:07 +0300)
 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.

src/ChangeLog
src/xdisp.c

index 66fc3c1546be2d317818248a2a3d0cd6b52d641e..7561d6ebf61a652fad24d111610a544a56822ebc 100644 (file)
@@ -1,5 +1,10 @@
 2010-04-24  Eli Zaretskii  <eliz@gnu.org>
 
+       * 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".
 
index 753ea16db01c37895d57688a2501b95023c9cbd6..5e5684a845d573ba8a5ce93333b824c6e99c1568 100644 (file)
@@ -17969,17 +17969,20 @@ display_line (it)
        }
       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))
+         if (!get_next_display_element (it))
+           abort ();
+         if (ITERATOR_AT_END_OF_LINE_P (it))
            {
-             save_it = *it;
-             it->bidi_p = 0;
-             reseat_1 (it, tpos, 0);
              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 @@ display_line (it)
                  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 @@ display_line (it)
              row_end.pos = it->eol_pos;
              it->eol_pos.charpos = it->eol_pos.bytepos = 0;
            }
+         *it = save_it;
          row->end = row_end;
        }
     }