]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix posn-at-point at beginning of a display string
authorEli Zaretskii <eliz@gnu.org>
Fri, 26 Jun 2020 12:01:44 +0000 (15:01 +0300)
committerEli Zaretskii <eliz@gnu.org>
Fri, 26 Jun 2020 12:01:44 +0000 (15:01 +0300)
* 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

index a280b48de99588bfadbfa7810ecca96c443eee2f..15901af9a8d361f2db3d18255e1eef90c58a1c73 100644 (file)
@@ -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