]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix 'posn-at-point' when line numbers are displayed
authorEli Zaretskii <eliz@gnu.org>
Fri, 16 Mar 2018 17:15:33 +0000 (19:15 +0200)
committerEli Zaretskii <eliz@gnu.org>
Sat, 2 Jun 2018 09:23:49 +0000 (12:23 +0300)
* src/xdisp.c (pos_visible_p): For the leftmost glyph, adjust the X
coordinate due to line-number display.  (Bug#30834)

(cherry picked from commit 4a20174d7949028f66b18a92a75d6b74194242a8)

src/xdisp.c

index 21fb6bca1d1a2c56d955e8c929e79c7afb6b9a22..6ca115087c39ad16a3cc6f1eada907dcad42114c 100644 (file)
@@ -1383,6 +1383,29 @@ pos_visible_p (struct window *w, ptrdiff_t charpos, int *x, int *y,
   move_it_to (&it, charpos, -1, it.last_visible_y - 1, -1,
              (charpos >= 0 ? MOVE_TO_POS : 0) | MOVE_TO_Y);
 
+  /* Adjust for line numbers, if CHARPOS is at or beyond first_visible_x,
+     but we didn't yet produce the line-number glyphs.  */
+  if (!NILP (Vdisplay_line_numbers)
+      && it.current_x >= it.first_visible_x
+      && IT_CHARPOS (it) == charpos
+      && !it.line_number_produced_p)
+    {
+      /* If the pixel width of line numbers was not yet known, compute
+        it now.  This usually happens in the first display line of a
+        window.  */
+      if (!it.lnum_pixel_width)
+       {
+         struct it it2;
+         void *it2data = NULL;
+
+         SAVE_IT (it2, it, it2data);
+         move_it_by_lines (&it, 1);
+         it2.lnum_pixel_width = it.lnum_pixel_width;
+         RESTORE_IT (&it, &it2, it2data);
+       }
+      it.current_x += it.lnum_pixel_width;
+    }
+
   if (charpos >= 0
       && (((!it.bidi_p || it.bidi_it.scan_dir != -1)
           && IT_CHARPOS (it) >= charpos)