From bb1a9481c9044ced4b7d7f514557b5ab508f80db Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Fri, 26 Jun 2020 15:01:44 +0300 Subject: [PATCH] Fix posn-at-point at beginning of a display string * src/xdisp.c (pos_visible_p): Account for the line-number width when the display string at CHARPOS ends in a newline. (Bug#42039) --- src/xdisp.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/xdisp.c b/src/xdisp.c index a280b48de99..15901af9a8d 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -1782,6 +1782,12 @@ pos_visible_p (struct window *w, ptrdiff_t charpos, int *x, int *y, start_display (&it3, w, top); if (start > CHARPOS (top)) move_it_to (&it3, start - 1, -1, -1, -1, MOVE_TO_POS); + /* Record the line-number width, if any. Do it here, + before subsequent calls to start_display etc. reset + the line_number_produced_p flag, and we can no + longer be sure we are not using stale info. */ + int lnum_pixel_width = + it3.line_number_produced_p ? it3.lnum_pixel_width : 0; /* Move forward one more line if the position before the display string is a newline or if it is the rightmost character on a line that is @@ -1850,10 +1856,14 @@ pos_visible_p (struct window *w, ptrdiff_t charpos, int *x, int *y, top_x = it3.current_x - it3.pixel_width; /* Account for line-number display, if IT3 still didn't. This can happen if START - 1 is the - first character on its display line. */ - if (!it3.line_number_produced_p - && it.line_number_produced_p) - top_x += it.lnum_pixel_width; + first or the last character on its display line. */ + if (!it3.line_number_produced_p) + { + if (lnum_pixel_width > 0) + top_x += lnum_pixel_width; + else if (it.line_number_produced_p) + top_x += it.lnum_pixel_width; + } /* Normally, we would exit the above loop because we found the display element whose character position is CHARPOS. For the contingency that we -- 2.39.5