changeset 71028:2360cacd8840

(set_cursor_from_row): If cursor cannot be set in row, don't update w->cursor and return 0. Return 1 on success. (try_cursor_movement): Repeat set_cursor_from_row on successive rows until it succeeds.
author Kim F. Storm <storm@cua.dk>
date Sun, 28 May 2006 20:19:07 +0000
parents ff93d411ef36
children 0182f7d67a2c
files src/xdisp.c
diffstat 1 files changed, 24 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/xdisp.c	Sun May 28 20:18:34 2006 +0000
+++ b/src/xdisp.c	Sun May 28 20:19:07 2006 +0000
@@ -11620,9 +11620,11 @@
 
 /* Set cursor position of W.  PT is assumed to be displayed in ROW.
    DELTA is the number of bytes by which positions recorded in ROW
-   differ from current buffer positions.  */
-
-void
+   differ from current buffer positions.
+
+   Return 0 if cursor is not on this row.  1 otherwise.  */
+
+int
 set_cursor_from_row (w, row, matrix, delta, delta_bytes, dy, dvpos)
      struct window *w;
      struct glyph_row *row;
@@ -11772,6 +11774,11 @@
 	      SKIP_GLYPHS (glyph, end, x, EQ (glyph->object, string));
 	    }
 	}
+
+      /* If we reached the end of the line, and end was from a string,
+	 cursor is not on this line.  */
+      if (glyph == end)
+	return 0;
     }
 
   w->cursor.hpos = glyph - row->glyphs[TEXT_AREA];
@@ -11805,6 +11812,8 @@
       else
 	CHARPOS (this_line_start_pos) = 0;
     }
+
+  return 1;
 }
 
 
@@ -12488,8 +12497,18 @@
 	    rc = CURSOR_MOVEMENT_MUST_SCROLL;
 	  else
 	    {
-	      set_cursor_from_row (w, row, w->current_matrix, 0, 0, 0, 0);
-	      rc = CURSOR_MOVEMENT_SUCCESS;
+	      do
+		{
+		  if (set_cursor_from_row (w, row, w->current_matrix, 0, 0, 0, 0))
+		    {
+		      rc = CURSOR_MOVEMENT_SUCCESS;
+		      break;
+		    }
+		  ++row;
+		}
+	      while (MATRIX_ROW_BOTTOM_Y (row) < last_y
+		     && MATRIX_ROW_START_CHARPOS (row) == PT
+		     && cursor_row_p (w, row));
 	    }
 	}
     }