Mercurial > emacs
changeset 71028:2360cacd8840
(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.
author | Kim F. Storm <storm@cua.dk> |
---|---|
date | Sun, 28 May 2006 20:19:07 +0000 |
parents | ff93d411ef36 |
children | 0182f7d67a2c |
files | src/xdisp.c |
diffstat | 1 files changed, 24 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- 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)); } } }