From c6576d9d7a06f7072b9824572dd04c5e083fdd50 Mon Sep 17 00:00:00 2001 From: "Kim F. Storm" Date: Tue, 18 Jan 2005 12:39:51 +0000 Subject: [PATCH] (fast_find_position): Backtrack to find first row if charpos is inside a display overlay that spans multiple lines. --- src/xdisp.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/xdisp.c b/src/xdisp.c index bf06bba7df3..b0e2039a8c9 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -20603,6 +20603,28 @@ fast_find_position (w, charpos, hpos, vpos, x, y, stop) past_end = 1; } + /* If whole rows or last part of a row came from a display overlay, + row_containing_pos will skip over such rows because their end pos + equals the start pos of the overlay or interval. Backtrack if we + have a STOP object and previous row's end glyph came from STOP. */ + if (!NILP (stop)) + { + struct glyph_row *prev = row-1; + while ((prev = row - 1, prev >= first) + && MATRIX_ROW_END_CHARPOS (prev) == charpos + && prev->used[TEXT_AREA] > 0) + { + end = prev->glyphs[TEXT_AREA]; + glyph = end + prev->used[TEXT_AREA]; + while (--glyph >= end + && INTEGERP (glyph->object)); + if (glyph < end + || !EQ (stop, glyph->object)) + break; + row = prev; + } + } + *x = row->x; *y = row->y; *vpos = MATRIX_ROW_VPOS (row, w->current_matrix); -- 2.39.5