# HG changeset patch # User Eli Zaretskii # Date 1272107500 -10800 # Node ID 01ca94871a561472a9d827bc0dc0d6edff61158a # Parent 8cdd7952f894575b7a0511869f46ea613e7c3ad9# Parent 882652fb64a7306a7f44d375f773ea96b972dcfa 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. diff -r 8cdd7952f894 -r 01ca94871a56 src/ChangeLog --- 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 - * .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 @@ -55,6 +60,10 @@ Support `display' text properties and overlay strings in bidi buffers. +======= +2010-04-23 Eli Zaretskii + +>>>>>>> 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) diff -r 8cdd7952f894 -r 01ca94871a56 src/xdisp.c --- 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; } }