diff options
| author | Eli Zaretskii <eliz@gnu.org> | 2014-07-08 18:12:39 +0300 |
|---|---|---|
| committer | Eli Zaretskii <eliz@gnu.org> | 2014-07-08 18:12:39 +0300 |
| commit | 9aac592d887c360c9cae88db350ec69019ded573 (patch) | |
| tree | 3bb2dfc765a308456b4bdfd3e4dd07f0d8492616 | |
| parent | 7acd41f38f21b03dd73256e7ef5a7db2c733df00 (diff) | |
| download | emacs-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/ChangeLog | 6 | ||||
| -rw-r--r-- | src/xdisp.c | 19 |
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); } } |
