emacs-diffs
[Top][All Lists]
Advanced

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

master d8c383b: Improve precision scroll interpolation


From: Po Lu
Subject: master d8c383b: Improve precision scroll interpolation
Date: Wed, 8 Dec 2021 05:30:48 -0500 (EST)

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

    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 af21f36..b322bf9 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."



reply via email to

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