changeset 108822:69d973cd0292

Finish debugging of cursor motion in bidi-reordered lines. 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.
author Eli Zaretskii <eliz@gnu.org>
date Sat, 29 May 2010 13:49:21 +0300
parents d54e74c34f05
children 99cde7115a1a
files src/ChangeLog src/xdisp.c
diffstat 2 files changed, 30 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Fri May 28 15:00:47 2010 +0300
+++ b/src/ChangeLog	Sat May 29 13:49:21 2010 +0300
@@ -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>
 
--- a/src/xdisp.c	Fri May 28 15:00:47 2010 +0300
+++ b/src/xdisp.c	Sat May 29 13:49:21 2010 +0300
@@ -13767,7 +13767,7 @@
 
       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 @@
 	    {
 	      /* 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 @@
 		     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 @@
 	    }
 	  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 @@
 
 	      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 @@
 		    }
 		  ++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