summaryrefslogtreecommitdiff
path: root/lisp/pixel-scroll.el
diff options
context:
space:
mode:
authorPo Lu <luangruo@yahoo.com>2021-12-03 10:12:29 +0800
committerPo Lu <luangruo@yahoo.com>2021-12-03 10:12:29 +0800
commit67191f7eee3f2a4e83897c3d820f8c13c629dedb (patch)
treea723e93a63cbea63f93b2741c6a302763f1af455 /lisp/pixel-scroll.el
parentef2c386829418a2c279ddf0ed217ee725bebed2f (diff)
downloademacs-67191f7eee3f2a4e83897c3d820f8c13c629dedb.tar.gz
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.
Diffstat (limited to 'lisp/pixel-scroll.el')
-rw-r--r--lisp/pixel-scroll.el53
1 files changed, 32 insertions, 21 deletions
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