Mercurial > emacs
changeset 49538:975c685ad4c4
(SKIP_GLYPHS): New macro.
(set_cursor_from_row): Skip all glyphs that comes from overlay
string.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Fri, 31 Jan 2003 03:53:43 +0000 |
parents | 6ef6a0d31663 |
children | 1ad5bfbb831a |
files | src/xdisp.c |
diffstat | 1 files changed, 46 insertions(+), 24 deletions(-) [+] |
line wrap: on
line diff
--- a/src/xdisp.c Fri Jan 31 03:53:24 2003 +0000 +++ b/src/xdisp.c Fri Jan 31 03:53:43 2003 +0000 @@ -9447,6 +9447,19 @@ return Qnil; } + +/* Increment GLYPH until it reaches END or CONDITION fails while + adding (GLYPH)->pixel_width to X. */ + +#define SKIP_GLYPHS(glyph, end, x, condition) \ + do \ + { \ + (x) += (glyph)->pixel_width; \ + ++(glyph); \ + } \ + while ((glyph) < (end) && (condition)) + + /* 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. */ @@ -9501,12 +9514,7 @@ string_start = glyph; string_start_x = x; /* Skip all glyphs from string. */ - do - { - x += glyph->pixel_width; - ++glyph; - } - while (glyph < end && STRINGP (glyph->object)); + SKIP_GLYPHS (glyph, end, x, STRINGP (glyph->object)); } } @@ -9517,28 +9525,42 @@ are from string. As there's no easy way to know the character position of the current glyph, find the correct glyph on point by scanning from string_start again. */ - Lisp_Object pos, limit; - - limit = make_number (MATRIX_ROW_END_CHARPOS (row) + delta); + Lisp_Object limit; + Lisp_Object string; + int pos; + + limit = make_number (pt_old + 1); + end = glyph; glyph = string_start; x = string_start_x; - pos = make_number (string_buffer_position (w, glyph->object, - string_before_pos)); - pos = Fnext_single_char_property_change (pos, Qdisplay, Qnil, limit); - while (XINT (pos) <= pt_old) - { + string = glyph->object; + pos = string_buffer_position (w, string, string_before_pos); + /* If STRING is from overlay, LAST_POS == 0. We skip such glyphs + because we always put cursor after overlay strings. */ + while (pos == 0 && glyph < end) + { + string = glyph->object; + SKIP_GLYPHS (glyph, end, x, EQ (glyph->object, string)); + if (glyph < end) + pos = string_buffer_position (w, glyph->object, string_before_pos); + } + + while (glyph < end) + { + pos = XINT (Fnext_single_char_property_change + (make_number (pos), Qdisplay, Qnil, limit)); + if (pos > pt_old) + break; /* Skip glyphs from the same string. */ - do - { - x += glyph->pixel_width; - ++glyph; - } + string = glyph->object; + SKIP_GLYPHS (glyph, end, x, EQ (glyph->object, string)); + /* Skip glyphs from an overlay. */ while (glyph < end - && EQ (glyph->object, string_start->object)); - if (glyph == end || !STRINGP (glyph->object)) - break; - string_start = glyph; - pos = Fnext_single_char_property_change (pos, Qdisplay, Qnil, limit); + && ! string_buffer_position (w, glyph->object, pos)) + { + string = glyph->object; + SKIP_GLYPHS (glyph, end, x, EQ (glyph->object, string)); + } } }