if (scroll_conservatively && !current_buffer->clip_changed
&& startp >= BEGV && startp <= ZV)
{
+ 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;
+
if (PT >= Z - XFASTINT (w->window_end_pos))
{
struct position pos;
if (pos.vpos > scroll_conservatively)
goto scroll_fail_1;
- pos = *vmotion (startp, pos.vpos + 1, w);
+ pos = *vmotion (startp, pos.vpos + 1 + this_scroll_margin, w);
if (! NILP (Vwindow_scroll_functions))
{
if (pos.vpos >= scroll_conservatively)
goto scroll_fail_1;
- pos = *vmotion (startp, - pos.vpos, w);
+ pos = *vmotion (startp, - pos.vpos - this_scroll_margin, w);
if (! NILP (Vwindow_scroll_functions))
{