]> git.eshelyaron.com Git - emacs.git/commitdiff
Make it work to pixel scroll by deltas larger than the window
authorPo Lu <luangruo@yahoo.com>
Sat, 4 Dec 2021 01:09:28 +0000 (09:09 +0800)
committerPo Lu <luangruo@yahoo.com>
Sat, 4 Dec 2021 01:09:28 +0000 (09:09 +0800)
* lisp/pixel-scroll.el
(pixel-scroll-precision-scroll-down-page):
(pixel-scroll-precision-scroll-up-page): New functions.

(pixel-scroll-precision-scroll-up)
(pixel-scroll-precision-scroll-down): Make it safe to scroll
by deltas larger than the current window.

lisp/pixel-scroll.el

index 1c2d95613e5cb60a1feb51ba3320cb1b8a62a9e7..740aaf93c79e1fd394be955ef31f58706d535efa 100644 (file)
@@ -401,10 +401,7 @@ Otherwise, redisplay will reset the window's vscroll."
   (set-window-start nil (pixel-point-at-unseen-line) t)
   (set-window-vscroll nil vscroll t))
 
-;; FIXME: This doesn't work when DELTA is larger than the height
-;; of the current window, and someone should probably fix that
-;; at some point.
-(defun pixel-scroll-precision-scroll-down (delta)
+(defun pixel-scroll-precision-scroll-down-page (delta)
   "Scroll the current window down by DELTA pixels.
 Note that this function doesn't work if DELTA is larger than
 the height of the current window."
@@ -440,8 +437,18 @@ the height of the current window."
         (set-window-start nil desired-start t))
       (set-window-vscroll nil desired-vscroll t))))
 
-(defun pixel-scroll-precision-scroll-up (delta)
-  "Scroll the current window up by DELTA pixels."
+(defun pixel-scroll-precision-scroll-down (delta)
+  "Scroll the current window down by DELTA pixels."
+  (let ((max-height (window-text-height nil t)))
+    (while (> delta max-height)
+      (pixel-scroll-precision-scroll-down-page max-height)
+      (setq delta (- delta max-height)))
+    (pixel-scroll-precision-scroll-down-page delta)))
+
+(defun pixel-scroll-precision-scroll-up-page (delta)
+  "Scroll the current window up by DELTA pixels.
+Note that this function doesn't work if DELTA is larger than
+the height of the current window."
   (let* ((edges (window-edges nil t nil t))
          (max-y (- (nth 3 edges)
                    (nth 1 edges)))
@@ -490,6 +497,14 @@ the height of the current window."
                 (set-window-vscroll nil desired-vscroll t))
             (set-window-vscroll nil (abs delta) t)))))))
 
+(defun pixel-scroll-precision-scroll-up (delta)
+  "Scroll the current window up by DELTA pixels."
+  (let ((max-height (window-text-height nil t)))
+    (while (> delta max-height)
+      (pixel-scroll-precision-scroll-up-page max-height)
+      (setq delta (- delta max-height)))
+    (pixel-scroll-precision-scroll-up-page delta)))
+
 ;; FIXME: This doesn't _always_ work when there's an image above the
 ;; current line that is taller than the window, and scrolling can
 ;; sometimes be jumpy in that case.