all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Tak Kunihiro <tkk@misasa.okayama-u.ac.jp>
To: valentjedi@gmail.com
Cc: tkk@misasa.okayama-u.ac.jp, 29737@debbugs.gnu.org
Subject: bug#29737: 27.0.50; pixel-scroll-mode is laggy
Date: Mon, 01 Jan 2018 09:58:38 +0900 (JST)	[thread overview]
Message-ID: <20180101.095838.502407685578664475.tkk@misasa.okayama-u.ac.jp> (raw)
In-Reply-To: <20171225.124845.1313473587937932282.tkk@misasa.okayama-u.ac.jp>

[-- Attachment #1: Type: Text/Plain, Size: 1152 bytes --]

I think that on scrolling of 1000 lines, smooth scroll is not
necessary.  User wants smooth scrolling only for the first spin of
mouse wheel.

This patch introduces a new variable `pixel-dead-time' and
`pixel-last-scroll-time'.  When another scroll request was delivered
within `pixel-dead-time', very likely user does not want smooth
scrolling.

On such situation, `scroll-down' is called instead of
`pixel-scroll-pixel-down'.  On theory there should not be lag because
of smoothing.

I tested the revised pixel-scroll-mode for a week and confirmed that
works good.  When `pixel-dead-time' is zero, its behavior is the same
as before.  I think `pixel-dead-time' 0.1 works better.

I'm sending ChangeLog and a patch relative to the current master.

* ChangeLog

Add a new algorithm to avoid lag when scrolling is in rush

* lisp/pixel-scroll.el (pixel-scroll-up): Invoke 'scroll-up' when called within 'pixel-dead-time'.
(pixel-scroll-down): Invoke 'scroll-down' when called within 'pixel-dead-time'.
(pixel-dead-time): Interval that requires for the next smooth scrolling.
(pixel-last-scroll-time): Time when the last scrolling was made. (Bug#29737)


[-- Attachment #2: pixel-scroll.el.diff --]
[-- Type: Text/X-Patch, Size: 4570 bytes --]

diff --git a/lisp/pixel-scroll.el b/lisp/pixel-scroll.el
index 70244873b4..07297d61b5 100644
--- a/lisp/pixel-scroll.el
+++ b/lisp/pixel-scroll.el
@@ -82,6 +82,15 @@ pixel-resolution-fine-flag
 pixel scroll, typing \\[next-line] or \\[previous-line] scrolls the window to make it
 fully visible, and undoes the effect of the pixel-level scroll.")
 
+(defvar pixel-dead-time 0.1
+  "Interval that requires for the next smooth scrolling in second.
+On another scrolling request within this period, the scrolling
+will be carried out without pixel resolution.  If zero, scrolling
+is with pixel resolution always.")
+
+(defvar pixel-last-scroll-time 0
+  "Time when the last scrolling was made in second since the epoch.")
+
 ;;;###autoload
 (define-minor-mode pixel-scroll-mode
   "A minor mode to scroll text pixel-by-pixel.
@@ -104,35 +113,51 @@ pixel-scroll-up
 This is an alternative of `scroll-up'.  Scope moves downward."
   (interactive)
   (or arg (setq arg 1))
-  (dotimes (ii arg) ; move scope downward
-    (let ((amt (if pixel-resolution-fine-flag
-                   (if (integerp pixel-resolution-fine-flag)
-                       pixel-resolution-fine-flag
-                     (frame-char-height))
-                 (pixel-line-height))))
-      (if (pixel-eob-at-top-p)            ; when end-of-the-buffer is close
-          (scroll-up 1)                   ; relay on robust method
-        (while (pixel-point-at-top-p amt) ; prevent too late (multi tries)
-          (vertical-motion 1))            ; move point downward
-        (pixel-scroll-pixel-up amt)))))   ; move scope downward
+  (if (pixel-scroll-in-rush-p)
+      (scroll-up arg)
+    (dotimes (ii arg)                    ; move scope downward
+      (let ((amt (if pixel-resolution-fine-flag
+                     (if (integerp pixel-resolution-fine-flag)
+                         pixel-resolution-fine-flag
+                       (frame-char-height))
+                   (pixel-line-height))))
+        (if (pixel-eob-at-top-p)      ; when end-of-the-buffer is close
+            (scroll-up 1)             ; relay on robust method
+          (while (pixel-point-at-top-p amt) ; prevent too late (multi tries)
+            (vertical-motion 1))            ; move point downward
+          (pixel-scroll-pixel-up amt))))))  ; move scope downward
 
 (defun pixel-scroll-down (&optional arg)
   "Scroll text of selected window down ARG lines.
 This is and alternative of `scroll-down'.  Scope moves upward."
   (interactive)
   (or arg (setq arg 1))
-  (dotimes (ii arg)
-    (let ((amt (if pixel-resolution-fine-flag
-                   (if (integerp pixel-resolution-fine-flag)
-                       pixel-resolution-fine-flag
-                     (frame-char-height))
-                 (pixel-line-height -1))))
-      (while (pixel-point-at-bottom-p amt) ; prevent too late (multi tries)
-        (vertical-motion -1))              ; move point upward
-      (if (or (pixel-bob-at-top-p amt)     ; when beginning-of-the-buffer is seen
-              (pixel-eob-at-top-p))        ; for file with a long line
-          (scroll-down 1)                  ; relay on robust method
-        (pixel-scroll-pixel-down amt)))))
+  (if (pixel-scroll-in-rush-p)
+      (scroll-down arg)
+    (dotimes (ii arg)
+      (let ((amt (if pixel-resolution-fine-flag
+                     (if (integerp pixel-resolution-fine-flag)
+                         pixel-resolution-fine-flag
+                       (frame-char-height))
+                   (pixel-line-height -1))))
+        (while (pixel-point-at-bottom-p amt) ; prevent too late (multi tries)
+          (vertical-motion -1))              ; move point upward
+        (if (or (pixel-bob-at-top-p amt) ; when beginning-of-the-buffer is seen
+                (pixel-eob-at-top-p))    ; for file with a long line
+            (scroll-down 1)              ; relay on robust method
+          (pixel-scroll-pixel-down amt))))))
+
+(defun pixel-scroll-in-rush-p ()
+  "Return non-nil if scroll is in rush.
+When scrolling request is delivered soon after the previous one,
+user is in hurry.  When the interval is larger than
+`pixel-dead-time', it is ready for another smooth scroll and this
+returns nil."
+  (let* ((current-time (float-time))
+         (scroll-in-rush-p (< (- current-time pixel-last-scroll-time)
+                              pixel-dead-time)))
+    (setq pixel-last-scroll-time current-time)
+    scroll-in-rush-p))
 
 (defun pixel-bob-at-top-p (amt)
   "Return non-nil if window-start is at beginning of the current buffer.

  reply	other threads:[~2018-01-01  0:58 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-12-16 17:55 bug#29737: 27.0.50; pixel-scroll-mode is laggy Valentin Ignatyev
2017-12-16 18:30 ` Eli Zaretskii
     [not found]   ` <CAO90aWvmqMg=wkt4YyqE8kDP_BNZjAih7AEdyP-Zt74OydpUHA@mail.gmail.com>
2017-12-16 19:33     ` Eli Zaretskii
2017-12-16 19:35       ` Valentin Ignatyev
2017-12-17  2:00       ` Tak Kunihiro
2017-12-22 10:22         ` Eli Zaretskii
2017-12-23  3:18           ` Tak Kunihiro
2017-12-23  9:20             ` Eli Zaretskii
2017-12-23 11:30               ` Valentin Ignatyev
2017-12-23 11:53                 ` Valentin Ignatyev
2017-12-24  2:28                   ` Tak Kunihiro
2017-12-24  5:18                     ` Valentin Ignatyev
2017-12-25  3:48                       ` Tak Kunihiro
2018-01-01  0:58                         ` Tak Kunihiro [this message]
2018-01-06 17:43                           ` Eli Zaretskii
2018-01-07  2:06                             ` Tak Kunihiro
2018-01-07  7:19                               ` Eli Zaretskii

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180101.095838.502407685578664475.tkk@misasa.okayama-u.ac.jp \
    --to=tkk@misasa.okayama-u.ac.jp \
    --cc=29737@debbugs.gnu.org \
    --cc=valentjedi@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.