summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2014-07-08 18:12:39 +0300
committerEli Zaretskii <eliz@gnu.org>2014-07-08 18:12:39 +0300
commit9aac592d887c360c9cae88db350ec69019ded573 (patch)
tree3bb2dfc765a308456b4bdfd3e4dd07f0d8492616
parent7acd41f38f21b03dd73256e7ef5a7db2c733df00 (diff)
downloademacs-9aac592d887c360c9cae88db350ec69019ded573.tar.gz
Fix bug #17969 with vertical-motion through continuation lines with TABs.
src/xdisp.c (move_it_to): Adjust calculation of line_start_x to what x_produce_glyphs does when it generates a stretch glyph that represents a TAB.
-rw-r--r--src/ChangeLog6
-rw-r--r--src/xdisp.c19
2 files changed, 25 insertions, 0 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 89621bd54ec..d2f1999b546 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,9 @@
+2014-07-08 Eli Zaretskii <eliz@gnu.org>
+
+ * xdisp.c (move_it_to): Adjust calculation of line_start_x to what
+ x_produce_glyphs does when it generates a stretch glyph that
+ represents a TAB. (Bug#17969)
+
2014-07-05 Eli Zaretskii <eliz@gnu.org>
* xdisp.c (pos_visible_p): If CHARPOS is at beginning of window,
diff --git a/src/xdisp.c b/src/xdisp.c
index 28752a42cb9..61d1fa24c68 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -9250,6 +9250,25 @@ move_it_to (struct it *it, ptrdiff_t to_charpos, int to_x, int to_y, int to_vpos
{
line_start_x = it->current_x + it->pixel_width
- it->last_visible_x;
+ if (FRAME_WINDOW_P (it->f))
+ {
+ struct face *face = FACE_FROM_ID (it->f, it->face_id);
+ struct font *face_font = face->font;
+
+ /* When display_line produces a continued line
+ that ends in a TAB, it skips a tab stop that
+ is closer than the font's space character
+ width (see x_produce_glyphs where it produces
+ the stretch glyph which represents a TAB).
+ We need to reproduce the same logic here. */
+ eassert (face_font);
+ if (face_font)
+ {
+ if (line_start_x < face_font->space_width)
+ line_start_x
+ += it->tab_width * face_font->space_width;
+ }
+ }
set_iterator_to_next (it, 0);
}
}