]> git.eshelyaron.com Git - emacs.git/commitdiff
(window_scroll_pixel_based): Fix scrolling in the wrong
authorKim F. Storm <storm@cua.dk>
Mon, 24 Jan 2005 13:22:29 +0000 (13:22 +0000)
committerKim F. Storm <storm@cua.dk>
Mon, 24 Jan 2005 13:22:29 +0000 (13:22 +0000)
direction if window height was smaller than next-screen-context-lines.
Now always scroll at least one line in the requested direction.
Ensure that we actually do scroll backwards when requested to do so.

src/window.c

index bdc105da3ede03289a60b74e47b45f0aada308f9..07b197cef753df1ba65fca69faa600753195cff5 100644 (file)
@@ -4580,7 +4580,9 @@ window_scroll_pixel_based (window, n, whole, noerror)
          int px;
          int dy = WINDOW_FRAME_LINE_HEIGHT (w);
          if (whole)
-           dy = window_box_height (w) - next_screen_context_lines * dy;
+           dy = max ((window_box_height (w)
+                      - next_screen_context_lines * dy),
+                     dy);
          dy *= n;
 
          if (n < 0 && (px = XINT (XCAR (tem))) > 0)
@@ -4615,18 +4617,26 @@ window_scroll_pixel_based (window, n, whole, noerror)
   start_display (&it, w, start);
   if (whole)
     {
-      int screen_full = (window_box_height (w)
-                        - next_screen_context_lines * FRAME_LINE_HEIGHT (it.f));
-      int dy = n * screen_full;
+      int start_pos = IT_CHARPOS (it);
+      int dy = WINDOW_FRAME_LINE_HEIGHT (w);
+      dy = max ((window_box_height (w)
+                - next_screen_context_lines * dy),
+               dy) * n;
 
       /* Note that move_it_vertically always moves the iterator to the
          start of a line.  So, if the last line doesn't have a newline,
         we would end up at the start of the line ending at ZV.  */
       if (dy <= 0)
-       move_it_vertically_backward (&it, -dy);
+       {
+         move_it_vertically_backward (&it, -dy);
+         /* Ensure we actually does move, e.g. in case we are currently
+            looking at an image that is taller that the window height.  */
+         while (start_pos == IT_CHARPOS (it)
+                && start_pos > BEGV)
+           move_it_by_lines (&it, -1, 1);
+       }
       else if (dy > 0)
        {
-         int start_pos = IT_CHARPOS (it);
          move_it_to (&it, ZV, -1, it.current_y + dy, -1,
                      MOVE_TO_POS | MOVE_TO_Y);
          /* Ensure we actually does move, e.g. in case we are currently