changeset 41979:c8338f001d95

(move_it_vertically_backward): Change heuristic for the case that we didn't move far enough initially.
author Gerd Moellmann <gerd@gnu.org>
date Wed, 12 Dec 2001 13:42:55 +0000
parents 8fb314e3c7fd
children e0aefc6e3422
files src/xdisp.c
diffstat 1 files changed, 10 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/xdisp.c	Wed Dec 12 12:35:36 2001 +0000
+++ b/src/xdisp.c	Wed Dec 12 13:42:55 2001 +0000
@@ -5373,7 +5373,7 @@
       int y0 = it3.current_y;
       int y1 = line_bottom_y (&it3);
       int line_height = y1 - y0;
-      
+
       /* If we did not reach target_y, try to move further backward if
 	 we can.  If we moved too far backward, try to move forward.  */
       if (target_y < it->current_y
@@ -5384,13 +5384,21 @@
 	  && it->current_y - target_y > line_height / 3 * 2
 	  && IT_CHARPOS (*it) > BEGV)
 	{
+	  TRACE_MOVE ((stderr, "  not far enough -> move_vert %d\n",
+		       target_y - it->current_y));
 	  move_it_vertically (it, target_y - it->current_y);
 	  xassert (IT_CHARPOS (*it) >= BEGV);
 	}
       else if (target_y >= it->current_y + line_height
 	       && IT_CHARPOS (*it) < ZV)
 	{
-	  move_it_vertically (it, target_y - (it->current_y + line_height));
+	  /* Should move forward by at least one line, maybe more.  */
+	  do
+	    {
+	      move_it_by_lines (it, 1, 1);
+	    }
+	  while (target_y >= line_bottom_y (it) && IT_CHARPOS (*it) < ZV);
+
 	  xassert (IT_CHARPOS (*it) >= BEGV);
 	}
     }