diff options
author | Eli Zaretskii <[email protected]> | 2010-10-01 19:38:36 +0200 |
---|---|---|
committer | Eli Zaretskii <[email protected]> | 2010-10-01 19:38:36 +0200 |
commit | 54cc6a8387d4d59ae7a280a7e0adb05735a4aa8c (patch) | |
tree | 0a01bf312c030cb6f95f284fa7857e8c81ef0796 | |
parent | 82b9f9f5f4d356f49f76d60981a5925888205f12 (diff) |
Fix bug #6349 with cursor positioning in truncated lines.
xdisp.c (set_cursor_from_row): When the row is truncated and
point is outside the range of displayed characters, position the
cursor inside the scroll margin.
-rw-r--r-- | src/ChangeLog | 6 | ||||
-rw-r--r-- | src/xdisp.c | 18 |
2 files changed, 21 insertions, 3 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 5e7ac0cc4b..c7bdb0b2d8 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2010-10-01 Eli Zaretskii <[email protected]> + + * xdisp.c (set_cursor_from_row): When the row is truncated and + point is outside the range of displayed characters, position the + cursor inside the scroll margin. (Bug#6349) + 2010-10-01 Dan Nicolaescu <[email protected]> Do not include stdlib.h and string.h, config.h does it. diff --git a/src/xdisp.c b/src/xdisp.c index 9b0f94ef65..4c007e572c 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -12494,8 +12494,10 @@ set_cursor_from_row (struct window *w, struct glyph_row *row, /* Non-zero means we've seen at least one glyph that came from a display string. */ int string_seen = 0; - /* Largest buffer position seen so far during scan of glyph row. */ - EMACS_INT bpos_max = last_pos; + /* Largest and smalles buffer positions seen so far during scan of + glyph row. */ + EMACS_INT bpos_max = pos_before; + EMACS_INT bpos_min = pos_after; /* Last buffer position covered by an overlay string with an integer `cursor' property. */ EMACS_INT bpos_covered = 0; @@ -12585,6 +12587,8 @@ set_cursor_from_row (struct window *w, struct glyph_row *row, if (glyph->charpos > bpos_max) bpos_max = glyph->charpos; + if (glyph->charpos < bpos_min) + bpos_min = glyph->charpos; if (!glyph->avoid_cursor_p) { /* If we hit point, we've found the glyph on which to @@ -12659,6 +12663,8 @@ set_cursor_from_row (struct window *w, struct glyph_row *row, if (glyph->charpos > bpos_max) bpos_max = glyph->charpos; + if (glyph->charpos < bpos_min) + bpos_min = glyph->charpos; if (!glyph->avoid_cursor_p) { if (dpos == 0) @@ -12745,7 +12751,13 @@ set_cursor_from_row (struct window *w, struct glyph_row *row, } } else if (match_with_avoid_cursor - /* zero-width characters produce no glyphs */ + /* A truncated row may not include PT among its + character positions. Setting the cursor inside the + scroll margin will trigger recalculation of hscroll + in hscroll_window_tree. */ + || (row->truncated_on_left_p && pt_old < bpos_min) + || (row->truncated_on_right_p && pt_old > bpos_max) + /* Zero-width characters produce no glyphs. */ || ((row->reversed_p ? glyph_after > glyphs_end : glyph_after < glyphs_end) |