# HG changeset patch # User Chong Yidong # Date 1225132386 0 # Node ID 299572dfe42e193dd89048b8ce097de9a4b0d527 # Parent 683eaeb4c921eea5f05894c30a796d2393b06fc9 (try_scrolling): When computing the distance from the scroll margin to PT, try moving some distance past the window bottom before giving up. diff -r 683eaeb4c921 -r 299572dfe42e src/xdisp.c --- a/src/xdisp.c Mon Oct 27 18:32:39 2008 +0000 +++ b/src/xdisp.c Mon Oct 27 18:33:06 2008 +0000 @@ -12636,17 +12636,15 @@ /* Compute scroll margin height in pixels. We scroll when point is within this distance from the top or bottom of the window. */ if (scroll_margin > 0) - { - this_scroll_margin = min (scroll_margin, WINDOW_TOTAL_LINES (w) / 4); - this_scroll_margin *= FRAME_LINE_HEIGHT (f); - } + this_scroll_margin = min (scroll_margin, WINDOW_TOTAL_LINES (w) / 4) + * FRAME_LINE_HEIGHT (f); else this_scroll_margin = 0; /* Force scroll_conservatively to have a reasonable value, to avoid - overflow while computing how much to scroll. Note that it's - fairly common for users to supply scroll-conservatively equal to - `most-positive-fixnum', which can be larger than INT_MAX. */ + overflow while computing how much to scroll. Note that the user + can supply scroll-conservatively equal to `most-positive-fixnum', + which can be larger than INT_MAX. */ if (scroll_conservatively > scroll_limit) { scroll_conservatively = scroll_limit; @@ -12668,7 +12666,7 @@ too_near_end: - /* Decide whether we have to scroll down. */ + /* Decide whether to scroll down. */ if (PT > CHARPOS (startp)) { int scroll_margin_y; @@ -12683,17 +12681,17 @@ if (PT > CHARPOS (it.current.pos)) { - /* Point is in the scroll margin at the bottom of the - window, or below. Compute the distance from the scroll - margin to PT, and give up if the distance is greater than - scroll_max. */ - move_it_to (&it, PT, -1, it.last_visible_y - 1, -1, - MOVE_TO_POS | MOVE_TO_Y); - - /* To make point visible, we must move the window start down - so that the cursor line is visible, which means we have - to add in the height of the cursor line. */ - dy = line_bottom_y (&it) - scroll_margin_y; + int y0 = line_bottom_y (&it); + + /* Compute the distance from the scroll margin to PT + (including the height of the cursor line). Moving the + iterator unconditionally to PT can be slow if PT is far + away, so stop 10 lines past the window bottom (is there a + way to do the right thing quickly?). */ + move_it_to (&it, PT, -1, + it.last_visible_y + 10 * FRAME_LINE_HEIGHT (f), + -1, MOVE_TO_POS | MOVE_TO_Y); + dy = line_bottom_y (&it) - y0; if (dy > scroll_max) return SCROLLING_FAILED; @@ -12704,14 +12702,11 @@ if (scroll_down_p) { - /* Move the window start down. If scrolling conservatively, - move it just enough down to make point visible. If - scroll_step is set, move it down by scroll_step. */ - start_display (&it, w, startp); - + /* Point is in or below the bottom scroll margin, so move the + window start down. If scrolling conservatively, move it just + enough down to make point visible. If scroll_step is set, + move it down by scroll_step. */ if (scroll_conservatively) - /* Set AMOUNT_TO_SCROLL to at least one line, - and at most scroll_conservatively lines. */ amount_to_scroll = min (max (dy, FRAME_LINE_HEIGHT (f)), FRAME_LINE_HEIGHT (f) * scroll_conservatively); @@ -12733,10 +12728,10 @@ if (amount_to_scroll <= 0) return SCROLLING_FAILED; - /* If moving by amount_to_scroll leaves STARTP unchanged, - move it down one screen line. */ - + start_display (&it, w, startp); move_it_vertically (&it, amount_to_scroll); + + /* If STARTP is unchanged, move it down another screen line. */ if (CHARPOS (it.current.pos) == CHARPOS (startp)) move_it_by_lines (&it, 1, 1); startp = it.current.pos;