From f323e507d04d854d6626e1971d740a22600f4c67 Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" Date: Sat, 1 Jan 2005 01:34:22 +0000 Subject: [PATCH] (setup_for_ellipsis, get_next_display_element): Set it->ellipsis_p to 1 or 0. (display_line): Record whether row ends in mid-ellipsis. (set_cursor_from_row): If ends in ellipsis. find start of it. (cursor_row_p): If PT's at the end of the ellipsis the row ends within, don't display cursor on this row. (BUFFER_POS_REACHED_P): We haven't reached the specified position if we're reading from something other than the buffer. --- src/xdisp.c | 47 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/src/xdisp.c b/src/xdisp.c index 61ea98b37ef..91ef0249045 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -3270,6 +3270,7 @@ setup_for_ellipsis (it, len) IT's face is restored in set_iterator_to_next. */ it->saved_face_id = it->face_id; it->method = next_element_from_display_vector; + it->ellipsis_p = 1; } @@ -4912,6 +4913,7 @@ get_next_display_element (it) it->current.dpvec_index = 0; it->saved_face_id = it->face_id; it->method = next_element_from_display_vector; + it->ellipsis_p = 0; } else { @@ -5062,6 +5064,7 @@ get_next_display_element (it) it->current.dpvec_index = 0; it->saved_face_id = it->face_id; it->method = next_element_from_display_vector; + it->ellipsis_p = 0; goto get_next; } } @@ -5703,10 +5706,11 @@ move_it_in_display_line_to (it, to_charpos, to_x, op) saved_glyph_row = it->glyph_row; it->glyph_row = NULL; -#define BUFFER_POS_REACHED_P() \ - ((op & MOVE_TO_POS) != 0 \ - && BUFFERP (it->object) \ - && IT_CHARPOS (*it) >= to_charpos) +#define BUFFER_POS_REACHED_P() \ + ((op & MOVE_TO_POS) != 0 \ + && BUFFERP (it->object) \ + && IT_CHARPOS (*it) >= to_charpos \ + && it->method == next_element_from_buffer) while (1) { @@ -10812,6 +10816,18 @@ set_cursor_from_row (w, row, matrix, delta, delta_bytes, dy, dvpos) glyph = cursor; x = cursor_x; } + else if (row->ends_in_ellipsis_p && glyph == end) + { + /* Scan back over the ellipsis glyphs, decrementing positions. */ + while (glyph > row->glyphs[TEXT_AREA] + && (glyph - 1)->charpos == last_pos) + glyph--, x -= glyph->pixel_width; + /* That loop always goes one position too far, + including the glyph before the ellipsis. + So scan forward over that one. */ + x += glyph->pixel_width; + glyph++; + } else if (string_start && (glyph == end || !BUFFERP (glyph->object) || last_pos > pt_old)) { @@ -14613,10 +14629,22 @@ cursor_row_p (w, row) /* If the row ends with a newline from a string, we don't want the cursor there (if the row is continued it doesn't end in a newline). */ - if (CHARPOS (row->end.string_pos) >= 0 - || MATRIX_ROW_ENDS_IN_MIDDLE_OF_CHAR_P (row)) + if (CHARPOS (row->end.string_pos) >= 0) cursor_row_p = row->continued_p; - + else if (MATRIX_ROW_ENDS_IN_MIDDLE_OF_CHAR_P (row)) + { + /* If the row ends in middle of a real character, + and the line is continued, we want the cursor here. + That's because MATRIX_ROW_END_CHARPOS would equal + PT if PT is before the character. */ + if (!row->ends_in_ellipsis_p) + cursor_row_p = row->continued_p; + else + /* If the row ends in an ellipsis, then + MATRIX_ROW_END_CHARPOS will equal point after the invisible text. + We want that position to be displayed after the ellipsis. */ + cursor_row_p = 0; + } /* If the row ends at ZV, display the cursor at the end of that row instead of at the start of the row below. */ else if (row->ends_at_zv_p) @@ -15093,6 +15121,11 @@ display_line (it) /* Remember the position at which this line ends. */ row->end = it->current; + /* Record whether this row ends inside an ellipsis. */ + row->ends_in_ellipsis_p + = (it->method == next_element_from_display_vector + && it->ellipsis_p); + /* Save fringe bitmaps in this row. */ row->left_user_fringe_bitmap = it->left_user_fringe_bitmap; row->left_user_fringe_face_id = it->left_user_fringe_face_id; -- 2.39.5