diff options
| author | Eli Zaretskii <eliz@gnu.org> | 2020-06-26 15:01:44 +0300 |
|---|---|---|
| committer | Eli Zaretskii <eliz@gnu.org> | 2020-06-26 15:01:44 +0300 |
| commit | bb1a9481c9044ced4b7d7f514557b5ab508f80db (patch) | |
| tree | 7700228849e90bb643cdccd7bc990299dca62068 | |
| parent | 0c4b033670e34898414b7f9af263d21d0923c7d7 (diff) | |
| download | emacs-bb1a9481c9044ced4b7d7f514557b5ab508f80db.tar.gz | |
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)
| -rw-r--r-- | src/xdisp.c | 18 |
1 files 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 |
