diff options
| author | Eli Zaretskii <eliz@gnu.org> | 2022-10-01 17:01:15 +0300 |
|---|---|---|
| committer | Eli Zaretskii <eliz@gnu.org> | 2022-10-01 17:01:15 +0300 |
| commit | ff43fd07b7eb25dd20facff21ec3226769efd8d8 (patch) | |
| tree | da0df9d20b933e53056f935ba84f6794a28e794b /src | |
| parent | 3faa508eba84a1983732099cbd3cc1eaad404158 (diff) | |
Fix vertical motion in some rare bidi situations
* src/xdisp.c (move_it_by_lines): Handle the case where we
didn't move vertically at all.
Diffstat (limited to 'src')
| -rw-r--r-- | src/xdisp.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/src/xdisp.c b/src/xdisp.c index bee17bd6d7f..c2e91d54ce1 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -10966,7 +10966,7 @@ move_it_by_lines (struct it *it, ptrdiff_t dvpos) { struct it it2; void *it2data = NULL; - ptrdiff_t start_charpos, i; + ptrdiff_t start_charpos, orig_charpos, i; int nchars_per_row = (it->last_visible_x - it->first_visible_x) / FRAME_COLUMN_WIDTH (it->f); bool hit_pos_limit = false; @@ -10976,7 +10976,7 @@ move_it_by_lines (struct it *it, ptrdiff_t dvpos) position. This may actually move vertically backwards, in case of overlays, so adjust dvpos accordingly. */ dvpos += it->vpos; - start_charpos = IT_CHARPOS (*it); + orig_charpos = IT_CHARPOS (*it); move_it_vertically_backward (it, 0); dvpos -= it->vpos; @@ -11029,8 +11029,9 @@ move_it_by_lines (struct it *it, ptrdiff_t dvpos) RESTORE_IT (&it2, &it2, it2data); SAVE_IT (it2, *it, it2data); move_it_to (it, -1, -1, -1, it->vpos + delta, MOVE_TO_VPOS); - /* Move back again if we got too far ahead. */ - if (it->vpos - it2.vpos > delta) + /* Move back again if we got too far ahead, + or didn't move at all. */ + if (it->vpos - it2.vpos > delta || IT_CHARPOS (*it) == orig_charpos) RESTORE_IT (it, &it2, it2data); else bidi_unshelve_cache (it2data, true); |
