emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 1afa295: Improve velocity calculation in momentum scrolling


From: Po Lu
Subject: master 1afa295: Improve velocity calculation in momentum scrolling
Date: Fri, 3 Dec 2021 01:04:45 -0500 (EST)

branch: master
commit 1afa295aed81357fddf9694bfe68ed0e6d159a2d
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Improve velocity calculation in momentum scrolling
    
    * lisp/pixel-scroll.el
    (pixel-scroll-precision-momentum-factor): Remove option.
    (pixel-scroll-precision-initial-velocity-factor)
    (pixel-scroll-precision-momentum-min-velocity): New user
    options.
    (pixel-scroll-accumulate-velocity): Clear velocity ring
    if sign is different.
    (pixel-scroll-calculate-velocity): Use current time.
    (pixel-scroll-start-momentum): Use better algorithm.
---
 lisp/pixel-scroll.el | 74 ++++++++++++++++++++++++++++++++++------------------
 1 file changed, 49 insertions(+), 25 deletions(-)

diff --git a/lisp/pixel-scroll.el b/lisp/pixel-scroll.el
index 3c764ff..1c2d956 100644
--- a/lisp/pixel-scroll.el
+++ b/lisp/pixel-scroll.el
@@ -121,8 +121,14 @@ This is only effective if supported by your mouse or 
touchpad."
   :type 'float
   :version "29.1")
 
-(defcustom pixel-scroll-precision-momentum-factor 0.95
-  "Factor by which to reduce scroll velocity on each momentum scroll"
+(defcustom pixel-scroll-precision-momentum-min-velocity 10.0
+  "The minimum scrolled pixels per second before momentum scrolling starts."
+  :group 'mouse
+  :type 'float
+  :version "29.1")
+
+(defcustom pixel-scroll-precision-initial-velocity-factor 0.25
+  "Factor applied to the initial velocity before momentum scrolling begins."
   :group 'mouse
   :type 'float
   :version "29.1")
@@ -524,8 +530,13 @@ It is a vector of the form [ VELOCITY TIME ]."
 (defun pixel-scroll-accumulate-velocity (delta)
   "Accumulate DELTA into the current window's kinetic scroll state."
   (let* ((state (pixel-scroll-kinetic-state))
+         (ring (aref state 0))
          (time (aref state 1)))
-    (when (and time (> (- (float-time) time) 0.5))
+    (when (or (and time (> (- (float-time) time) 0.5))
+              (and (not (ring-empty-p ring))
+                   (not (eq (< delta 0)
+                            (< (cdr (ring-ref ring 0))
+                               0)))))
       (aset state 0 (make-ring 10)))
     (ring-insert (aref state 0)
                  (cons (aset state 1 (float-time))
@@ -538,8 +549,7 @@ It is a vector of the form [ VELOCITY TIME ]."
          (total 0))
     (dolist (tem elts)
       (setq total (+ total (cdr tem))))
-    (/ total (* (- (caar elts)
-                   (caar (last elts)))
+    (/ total (* (- (float-time) (caar elts))
                 100))))
 
 (defun pixel-scroll-start-momentum (event)
@@ -555,26 +565,40 @@ It is a vector of the form [ VELOCITY TIME ]."
           (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)))))
+                              (when (> (abs (aref state 0))
+                                       
pixel-scroll-precision-momentum-min-velocity)
+                                (let* ((velocity (* (aref state 0)
+                                                    
pixel-scroll-precision-initial-velocity-factor))
+                                       (original-velocity velocity)
+                                       (time-spent 0))
+                                  (if (> velocity 0)
+                                      (while (and (> velocity 0)
+                                                  (<= time-spent
+                                                      
pixel-scroll-precision-momentum-seconds))
+                                        (when (> (round velocity) 0)
+                                          (pixel-scroll-precision-scroll-up 
(round velocity)))
+                                        (setq velocity (- velocity
+                                                          (/ original-velocity
+                                                             (/ 
pixel-scroll-precision-momentum-seconds
+                                                                
pixel-scroll-precision-momentum-tick))))
+                                        (redisplay t)
+                                        (sit-for 
pixel-scroll-precision-momentum-tick)
+                                        (setq time-spent (+ time-spent
+                                                            
pixel-scroll-precision-momentum-tick))))
+                                  (while (and (< velocity 0)
+                                              (<= time-spent
+                                                  
pixel-scroll-precision-momentum-seconds))
+                                    (when (> (round (abs velocity)) 0)
+                                      (pixel-scroll-precision-scroll-down 
(round
+                                                                           
(abs velocity))))
+                                    (setq velocity (+ velocity
+                                                      (/ (abs 
original-velocity)
+                                                         (/ 
pixel-scroll-precision-momentum-seconds
+                                                            
pixel-scroll-precision-momentum-tick))))
+                                    (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))))))))
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]