From: Po Lu Date: Fri, 3 Dec 2021 02:12:29 +0000 (+0800) Subject: Make momentum scrolling much nicer X-Git-Tag: emacs-29.0.90~3624^2 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=67191f7eee3f2a4e83897c3d820f8c13c629dedb;p=emacs.git Make momentum scrolling much nicer * lisp/pixel-scroll.el (pixel-scroll-precision-momentum-tick): Set default value to 0.01. (pixel-scroll-precision-momentum-seconds): New user option. (pixel-scroll-start-momentum): Improvements to momentum algorithm. --- diff --git a/lisp/pixel-scroll.el b/lisp/pixel-scroll.el index 00d9bf684ee..3c764ff65ab 100644 --- a/lisp/pixel-scroll.el +++ b/lisp/pixel-scroll.el @@ -109,12 +109,18 @@ This is only effective if supported by your mouse or touchpad." :type 'boolean :version "29.1") -(defcustom pixel-scroll-precision-momentum-tick 0.16 +(defcustom pixel-scroll-precision-momentum-tick 0.01 "Number of seconds between each momentum scroll." :group 'mouse :type 'float :version "29.1") +(defcustom pixel-scroll-precision-momentum-seconds 1.75 + "The maximum duration in seconds of momentum scrolling." + :group 'mouse + :type 'float + :version "29.1") + (defcustom pixel-scroll-precision-momentum-factor 0.95 "Factor by which to reduce scroll velocity on each momentum scroll" :group 'mouse @@ -546,26 +552,31 @@ It is a vector of the form [ VELOCITY TIME ]." (setq state (pixel-scroll-kinetic-state)) (when (and (aref state 1) (listp (aref state 0))) - (unwind-protect (progn - (aset state 0 - (/ (pixel-scroll-calculate-velocity state) 2)) - (let ((velocity (* (aref state 0) - pixel-scroll-precision-momentum-tick))) - (if (> velocity 0) - (while (> velocity 1) - (pixel-scroll-precision-scroll-up (round velocity)) - (setq velocity (* velocity - pixel-scroll-precision-momentum-factor)) - (redisplay t) - (sit-for pixel-scroll-precision-momentum-tick))) - (while (< velocity -1) - (pixel-scroll-precision-scroll-down (round (abs velocity))) - (setq velocity (* velocity - pixel-scroll-precision-momentum-factor)) - (redisplay t) - (sit-for pixel-scroll-precision-momentum-tick)))) - (aset state 0 (make-ring 10)) - (aset state 1 nil))))))) + (while-no-input + (unwind-protect (progn + (aset state 0 (pixel-scroll-calculate-velocity state)) + (let ((velocity (/ (aref state 0) 3)) + (time-spent 0)) + (if (> velocity 0) + (while (and (> velocity 0.2) + (<= time-spent pixel-scroll-precision-momentum-seconds)) + (pixel-scroll-precision-scroll-up (ceiling velocity)) + (setq velocity (* velocity pixel-scroll-precision-momentum-factor)) + (redisplay t) + (sit-for pixel-scroll-precision-momentum-tick) + (setq time-spent (+ time-spent + pixel-scroll-precision-momentum-tick)))) + (while (and (< velocity -0.4) + (<= time-spent + pixel-scroll-precision-momentum-seconds)) + (pixel-scroll-precision-scroll-down (floor (abs velocity))) + (setq velocity (* velocity pixel-scroll-precision-momentum-factor)) + (redisplay t) + (sit-for pixel-scroll-precision-momentum-tick) + (setq time-spent (+ time-spent + pixel-scroll-precision-momentum-tick))))) + (aset state 0 (make-ring 10)) + (aset state 1 nil)))))))) ;;;###autoload (define-minor-mode pixel-scroll-precision-mode