From d8c383b25edce88a0812edafc349e360d8d03dc9 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Wed, 8 Dec 2021 18:29:05 +0800 Subject: [PATCH] Improve precision scroll interpolation * lisp/pixel-scroll.el (pixel-scroll-precision-interpolation-total-time) (pixel-scroll-precision-interpolation-factor): Add better default values. (pixel-scroll-precision-interpolate): Save deltas and run loop inside `while-no-input' instead. --- lisp/pixel-scroll.el | 45 +++++++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/lisp/pixel-scroll.el b/lisp/pixel-scroll.el index af21f365b38..b322bf9a53d 100644 --- a/lisp/pixel-scroll.el +++ b/lisp/pixel-scroll.el @@ -141,13 +141,13 @@ Nil means to not interpolate such scrolls." number) :version "29.1") -(defcustom pixel-scroll-precision-interpolation-total-time 0.01 +(defcustom pixel-scroll-precision-interpolation-total-time 0.1 "The total time in seconds to spend interpolating a large scroll." :group 'mouse :type 'float :version "29.1") -(defcustom pixel-scroll-precision-interpolation-factor 2.0 +(defcustom pixel-scroll-precision-interpolation-factor 4.0 "A factor to apply to the distance of an interpolated scroll." :group 'mouse :type 'float @@ -544,20 +544,35 @@ animation." (let ((percentage 0) (total-time pixel-scroll-precision-interpolation-total-time) (factor pixel-scroll-precision-interpolation-factor) + (last-time (float-time)) (time-elapsed 0.0) - (between-scroll 0.001)) - (while (< percentage 1) - (sit-for between-scroll) - (setq time-elapsed (+ time-elapsed between-scroll) - percentage (/ time-elapsed total-time)) - (if (< delta 0) - (pixel-scroll-precision-scroll-down - (ceiling (abs (* (* delta factor) - (/ between-scroll total-time))))) - (pixel-scroll-precision-scroll-up - (ceiling (* (* delta factor) - (/ between-scroll total-time))))) - (redisplay t)))) + (between-scroll 0.001) + (rem (window-parameter nil 'interpolated-scroll-remainder)) + (time (window-parameter nil 'interpolated-scroll-remainder-time))) + (when (and rem time + (< (- (float-time) time) 1.0)) + (setq delta (+ delta rem))) + (while-no-input + (unwind-protect + (while (< percentage 1) + (redisplay t) + (sleep-for between-scroll) + (setq time-elapsed (+ time-elapsed + (- (float-time) last-time)) + percentage (/ time-elapsed total-time)) + (if (< delta 0) + (pixel-scroll-precision-scroll-down + (ceiling (abs (* (* delta factor) + (/ between-scroll total-time))))) + (pixel-scroll-precision-scroll-up + (ceiling (* (* delta factor) + (/ between-scroll total-time))))) + (setq last-time (float-time))) + (when (< percentage 1) + (set-window-parameter nil 'interpolated-scroll-remainder + (* delta (- 1 percentage))) + (set-window-parameter nil 'interpolated-scroll-remainder-time + (float-time))))))) (defun pixel-scroll-precision-scroll-up (delta) "Scroll the current window up by DELTA pixels." -- 2.39.5