changeset 16559:d62b7f309f2b

(window_scroll): Handle scroll_margin by putting point at a place that won't force recentering.
author Richard M. Stallman <rms@gnu.org>
date Mon, 11 Nov 1996 00:34:50 +0000
parents 40a1e1451821
children 8b1dd6f2222d
files src/window.c
diffstat 1 files changed, 28 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/window.c	Sun Nov 10 23:41:13 1996 +0000
+++ b/src/window.c	Mon Nov 11 00:34:50 1996 +0000
@@ -2684,18 +2684,43 @@
 
   if (pos < ZV)
     {
+      extern int scroll_margin;
+
+      int this_scroll_margin = scroll_margin;
+
+      /* 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)
+	this_scroll_margin = XINT (w->height) / 4;
+
       set_marker_restricted (w->start, make_number (pos), w->buffer);
       w->start_at_line_beg = bolp;
       w->update_mode_line = Qt;
       XSETFASTINT (w->last_modified, 0);
       XSETFASTINT (w->last_overlay_modified, 0);
+
+      /* If we scrolled forward, put point enough lines down
+	 that it is outside the scroll margin.  */
+      if (n > 0 && this_scroll_margin > 0)
+	{
+	  SET_PT (pos);
+	  Fvertical_motion (make_number (this_scroll_margin), window);
+	  pos = PT;
+	}
+
       if (pos > opoint)
-	SET_PT (pos);
+	{
+	  SET_PT (pos);
+	}
       if (n < 0)
 	{
+	  /* If we scrolled backward, put point near the end of the window
+	     but not within the scroll margin.  */
 	  SET_PT (pos);
-	  tem = Fvertical_motion (make_number (ht), window);
-	  if (PT > opoint || XFASTINT (tem) < ht)
+	  tem = Fvertical_motion (make_number (ht - this_scroll_margin), window);
+	  if (PT > opoint || XFASTINT (tem) < ht - this_scroll_margin)
 	    SET_PT (opoint);
 	  else
 	    Fvertical_motion (make_number (-1), window);