]> git.eshelyaron.com Git - emacs.git/commitdiff
Finish debugging of cursor motion in bidi-reordered lines.
authorEli Zaretskii <eliz@gnu.org>
Sat, 29 May 2010 10:49:21 +0000 (13:49 +0300)
committerEli Zaretskii <eliz@gnu.org>
Sat, 29 May 2010 10:49:21 +0000 (13:49 +0300)
 xdisp.c (try_cursor_movement): Fix the logic.  Rewrite the loop
 over continuation lines in bidi-reordered buffers.  Return
 CURSOR_MOVEMENT_MUST_SCROLL upon failure to find a suitable row,
 rather than CURSOR_MOVEMENT_CANNOT_BE_USED.

src/ChangeLog
src/xdisp.c

index a530e844bf9d12a1c33cbdce59e79a3920f227e1..814b30bbdad25974d2b640531b405060092941f9 100644 (file)
@@ -1,7 +1,14 @@
+2010-05-29  Eli Zaretskii  <eliz@gnu.org>
+
+       * xdisp.c (try_cursor_movement): Fix the logic.  Rewrite the loop
+       over continuation lines in bidi-reordered buffers.  Return
+       CURSOR_MOVEMENT_MUST_SCROLL upon failure to find a suitable row,
+       rather than CURSOR_MOVEMENT_CANNOT_BE_USED.
+
 2010-05-28  Eli Zaretskii  <eliz@gnu.org>
 
-       * xdisp.c (try_cursor_movement): Prevent unnecessary scrolling in
-       bidi-reordered buffers.
+       * xdisp.c (try_cursor_movement): Backup to non-continuation line
+       only after finding point's row.
 
 2010-05-28  Kenichi Handa  <handa@m17n.org>
 
index a94049a780bfc7154246728c2bf8f821ce6b86d7..c8043308ec852e7add4daf6477d924930e7c3a01 100644 (file)
@@ -13767,7 +13767,7 @@ try_cursor_movement (window, startp, scroll_step)
 
       if (rc == CURSOR_MOVEMENT_CANNOT_BE_USED)
        {
-         int scroll_p = 0;
+         int scroll_p = 0, must_scroll = 0;
          int last_y = window_text_bottom_y (w) - this_scroll_margin;
 
          if (PT > XFASTINT (w->last_point))
@@ -13860,6 +13860,7 @@ try_cursor_movement (window, startp, scroll_step)
            {
              /* if PT is not in the glyph row, give up.  */
              rc = CURSOR_MOVEMENT_MUST_SCROLL;
+             must_scroll = 1;
            }
          else if (rc != CURSOR_MOVEMENT_SUCCESS
                   && !NILP (XBUFFER (w->buffer)->bidi_display_reordering))
@@ -13883,17 +13884,17 @@ try_cursor_movement (window, startp, scroll_step)
                     line, give up.  */
                  if (row <= w->current_matrix->rows)
                    {
-                     rc = CURSOR_MOVEMENT_CANNOT_BE_USED;
+                     rc = CURSOR_MOVEMENT_MUST_SCROLL;
                      break;
                    }
 
                }
            }
-         if (rc == CURSOR_MOVEMENT_SUCCESS
-             || rc == CURSOR_MOVEMENT_CANNOT_BE_USED)
+         if (must_scroll)
            ;
-         else if (MATRIX_ROW_PARTIALLY_VISIBLE_P (w, row)
-                  && make_cursor_line_fully_visible_p)
+         else if (rc != CURSOR_MOVEMENT_SUCCESS
+             && MATRIX_ROW_PARTIALLY_VISIBLE_P (w, row)
+             && make_cursor_line_fully_visible_p)
            {
              if (PT == MATRIX_ROW_END_CHARPOS (row)
                  && !row->ends_at_zv_p
@@ -13919,7 +13920,8 @@ try_cursor_movement (window, startp, scroll_step)
            }
          else if (scroll_p)
            rc = CURSOR_MOVEMENT_MUST_SCROLL;
-         else if (!NILP (XBUFFER (w->buffer)->bidi_display_reordering))
+         else if (rc != CURSOR_MOVEMENT_SUCCESS
+                  && !NILP (XBUFFER (w->buffer)->bidi_display_reordering))
            {
              /* With bidi-reordered rows, there could be more than
                 one candidate row whose start and end positions
@@ -13932,8 +13934,11 @@ try_cursor_movement (window, startp, scroll_step)
 
              do
                {
-                 rv |= set_cursor_from_row (w, row, w->current_matrix,
-                                            0, 0, 0, 0);
+                 if (MATRIX_ROW_START_CHARPOS (row) <= PT
+                     && PT <= MATRIX_ROW_END_CHARPOS (row)
+                     && cursor_row_p (w, row))
+                   rv |= set_cursor_from_row (w, row, w->current_matrix,
+                                              0, 0, 0, 0);
                  /* As soon as we've found the first suitable row
                     whose ends_at_zv_p flag is set, we are done.  */
                  if (rv
@@ -13944,19 +13949,17 @@ try_cursor_movement (window, startp, scroll_step)
                    }
                  ++row;
                }
-             while (MATRIX_ROW_BOTTOM_Y (row) < last_y
-                    && MATRIX_ROW_START_CHARPOS (row) <= PT
-                    && PT <= MATRIX_ROW_END_CHARPOS (row)
-                    && cursor_row_p (w, row));
+             while ((MATRIX_ROW_CONTINUATION_LINE_P (row)
+                     && MATRIX_ROW_BOTTOM_Y (row) <= last_y)
+                    || (MATRIX_ROW_START_CHARPOS (row) == PT
+                        && MATRIX_ROW_BOTTOM_Y (row) < last_y));
              /* If we didn't find any candidate rows, or exited the
                 loop before all the candidates were examined, signal
                 to the caller that this method failed.  */
              if (rc != CURSOR_MOVEMENT_SUCCESS
-                 && (!rv
-                     || (MATRIX_ROW_START_CHARPOS (row) <= PT
-                         && PT <= MATRIX_ROW_END_CHARPOS (row))))
-               rc = CURSOR_MOVEMENT_CANNOT_BE_USED;
-             else
+                 && (!rv || MATRIX_ROW_CONTINUATION_LINE_P (row)))
+               rc = CURSOR_MOVEMENT_MUST_SCROLL;
+             else if (rv)
                rc = CURSOR_MOVEMENT_SUCCESS;
            }
          else