# HG changeset patch # User Kim F. Storm # Date 1148847547 0 # Node ID 2360cacd88404542c6461ac4c25e286d29168d94 # Parent ff93d411ef360b7f2ade8ffc65be0a0a8446b7b4 (set_cursor_from_row): If cursor cannot be set in row, don't update w->cursor and return 0. Return 1 on success. (try_cursor_movement): Repeat set_cursor_from_row on successive rows until it succeeds. diff -r ff93d411ef36 -r 2360cacd8840 src/xdisp.c --- a/src/xdisp.c Sun May 28 20:18:34 2006 +0000 +++ b/src/xdisp.c Sun May 28 20:19:07 2006 +0000 @@ -11620,9 +11620,11 @@ /* Set cursor position of W. PT is assumed to be displayed in ROW. DELTA is the number of bytes by which positions recorded in ROW - differ from current buffer positions. */ - -void + differ from current buffer positions. + + Return 0 if cursor is not on this row. 1 otherwise. */ + +int set_cursor_from_row (w, row, matrix, delta, delta_bytes, dy, dvpos) struct window *w; struct glyph_row *row; @@ -11772,6 +11774,11 @@ SKIP_GLYPHS (glyph, end, x, EQ (glyph->object, string)); } } + + /* If we reached the end of the line, and end was from a string, + cursor is not on this line. */ + if (glyph == end) + return 0; } w->cursor.hpos = glyph - row->glyphs[TEXT_AREA]; @@ -11805,6 +11812,8 @@ else CHARPOS (this_line_start_pos) = 0; } + + return 1; } @@ -12488,8 +12497,18 @@ rc = CURSOR_MOVEMENT_MUST_SCROLL; else { - set_cursor_from_row (w, row, w->current_matrix, 0, 0, 0, 0); - rc = CURSOR_MOVEMENT_SUCCESS; + do + { + if (set_cursor_from_row (w, row, w->current_matrix, 0, 0, 0, 0)) + { + rc = CURSOR_MOVEMENT_SUCCESS; + break; + } + ++row; + } + while (MATRIX_ROW_BOTTOM_Y (row) < last_y + && MATRIX_ROW_START_CHARPOS (row) == PT + && cursor_row_p (w, row)); } } }