From ff43fd07b7eb25dd20facff21ec3226769efd8d8 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 1 Oct 2022 17:01:15 +0300 Subject: [PATCH] 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. --- src/xdisp.c | 9 +++++---- 1 file 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); -- 2.39.2