]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix vertical motion in some rare bidi situations
authorEli Zaretskii <eliz@gnu.org>
Sat, 1 Oct 2022 14:01:15 +0000 (17:01 +0300)
committerEli Zaretskii <eliz@gnu.org>
Sat, 1 Oct 2022 14:01:15 +0000 (17:01 +0300)
* src/xdisp.c (move_it_by_lines): Handle the case where we
didn't move vertically at all.

src/xdisp.c

index bee17bd6d7f44ad5ea88356e7b6ac396ad2ef8f7..c2e91d54ce191de68dad37ddc206ed44051e8852 100644 (file)
@@ -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);