changeset 19571:28ab022089b2

(redisplay_window): When trying to scroll conservatively correctly take the scroll margin into account.
author Richard M. Stallman <rms@gnu.org>
date Wed, 27 Aug 1997 17:13:29 +0000
parents a2a72d1e0970
children 30e299bb4a5d
files src/xdisp.c
diffstat 1 files changed, 21 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/xdisp.c	Wed Aug 27 16:18:29 1997 +0000
+++ b/src/xdisp.c	Wed Aug 27 17:13:29 1997 +0000
@@ -1994,25 +1994,32 @@
       && startp >= BEGV && startp <= ZV)
     {
       int this_scroll_margin = scroll_margin;
+      int scroll_margin_pos;
 
       /* Don't use a scroll margin that is negative or too large.  */
       if (this_scroll_margin < 0)
 	this_scroll_margin = 0;
 
-      if (XINT (w->height) < 4 * scroll_margin)
+      if (XINT (w->height) < 4 * this_scroll_margin)
 	this_scroll_margin = XINT (w->height) / 4;
 
-      if (PT >= Z - XFASTINT (w->window_end_pos))
+      scroll_margin_pos = Z - XFASTINT (w->window_end_pos);
+      if (this_scroll_margin)
+	{
+	  pos = *vmotion (scroll_margin_pos, -this_scroll_margin, w);
+	  scroll_margin_pos = pos.bufpos;
+	}
+      if (PT >= scroll_margin_pos)
 	{
 	  struct position pos;
-	  pos = *compute_motion (Z - XFASTINT (w->window_end_pos), 0, 0, 0,
+	  pos = *compute_motion (scroll_margin_pos, 0, 0, 0,
 				 PT, XFASTINT (w->height), 0,
 				 XFASTINT (w->width), XFASTINT (w->hscroll),
 				 pos_tab_offset (w, startp), w);
 	  if (pos.vpos > scroll_conservatively)
 	    goto scroll_fail_1;
 
-	  pos = *vmotion (startp, pos.vpos + 1 + this_scroll_margin, w);
+	  pos = *vmotion (startp, pos.vpos + 1, w);
 
 	  if (! NILP (Vwindow_scroll_functions))
 	    {
@@ -2033,17 +2040,24 @@
 	  else
 	    cancel_my_columns (w);
 	}
-      if (PT < startp)
+
+      scroll_margin_pos = startp;
+      if (this_scroll_margin)
+	{
+	  pos = *vmotion (scroll_margin_pos, this_scroll_margin, w);
+	  scroll_margin_pos = pos.bufpos;
+	}
+      if (PT < scroll_margin_pos)
 	{
 	  struct position pos;
 	  pos = *compute_motion (PT, 0, 0, 0,
-				 startp, XFASTINT (w->height), 0,
+				 scroll_margin_pos, XFASTINT (w->height), 0,
 				 XFASTINT (w->width), XFASTINT (w->hscroll),
 				 pos_tab_offset (w, startp), w);
 	  if (pos.vpos > scroll_conservatively)
 	    goto scroll_fail_1;
 
-	  pos = *vmotion (startp, - pos.vpos - this_scroll_margin, w);
+	  pos = *vmotion (startp, -pos.vpos, w);
 
 	  if (! NILP (Vwindow_scroll_functions))
 	    {