changeset 16560:8b1dd6f2222d

(scroll_margin): New variable. (init_xdisp): Set up Lisp variable. (redisplay_window): Implement scroll_margin; don't use old start pos if point is inside the margin.
author Richard M. Stallman <rms@gnu.org>
date Mon, 11 Nov 1996 00:35:31 +0000
parents d62b7f309f2b
children 55fcbbf28987
files src/xdisp.c
diffstat 1 files changed, 23 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/xdisp.c	Mon Nov 11 00:34:50 1996 +0000
+++ b/src/xdisp.c	Mon Nov 11 00:35:31 1996 +0000
@@ -143,6 +143,10 @@
    when appropriate.  */
 static int scroll_conservatively;
 
+/* Recenter the window whenever point gets within this many lines
+   of the top or bottom of the window.  */
+int scroll_margin;
+
 /* Nonzero if try_window_id has made blank lines at window bottom
  since the last redisplay that paused */
 static int blank_end_of_window;
@@ -1699,11 +1703,23 @@
       && XFASTINT (w->window_end_vpos) < XFASTINT (w->height)
       && !EQ (window, minibuf_window))
     {
+      int this_scroll_margin = scroll_margin;
+
       pos = *compute_motion (startp, 0, (hscroll ? 1 - hscroll : 0), 0,
 			    PT, height, 0, width, hscroll,
 			    pos_tab_offset (w, startp), w);
 
-      if (pos.vpos < height)
+      /* 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;
+
+      /* If point fits on the screen, and not within the scroll margin,
+	 we are ok.  */
+      if (pos.vpos < height - this_scroll_margin
+	  && (pos.vpos >= this_scroll_margin || startp == BEGV))
 	{
 	  /* Ok, point is still on frame */
 	  if (w == XWINDOW (FRAME_SELECTED_WINDOW (f)))
@@ -4474,6 +4490,12 @@
     "*Scroll up to this many lines, to bring point back on screen.");
   scroll_conservatively = 0;
 
+  DEFVAR_INT ("scroll-margin", &scroll_margin,
+    "*Number of lines of margin at the top and bottom of a window.\n\
+Recenter the window whenever point gets within this many lines\n\
+of the top or bottom of the window.");
+  scroll_margin = 0;
+
   DEFVAR_INT ("debug-end-pos", &debug_end_pos, "Don't ask");
 
   DEFVAR_BOOL ("truncate-partial-width-windows",