Subject: Re: bug#29737: 27.0.50; pixel-scroll-mode is laggy

From: Tak Kunihiro <[email-masked]>
Date: Sun, 17 Dec 2017 11:00:45 +0900 (JST)

> While I see that scrolling became pixel-wise indeed, it is also very
> laggy. CPU blows up to 100% and ui hangs and freezes. It works ok if
> I scroll slowly though. It happens with all my plugins and
> customizations and if I run emacs with -Q flag. My OS is Arch Linux
> and I also have HiDPI screen (it's MacBook 11,4, mid-2015).

On the previous commit <8eb6870be690128fb1cbc012c55093813c39830c>, I
revised two functions.  I fixed `pixel-scroll-down' but I broke
`pixel-scroll-up'.  I apologize for the careless commit.

With the current and broken `pixel-scroll-up', when EOB is shown on
top of the screen, emacs hangs (or goes in infinite while loop).  The
pixel-scroll-up should be reverted to commit
<1bda71ec3b11eeb4d06c3da094a3cb21bac18d5c>.

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

* ChangeLog

Fix vertical cursor motion in pixel-scroll.el

* lisp/pixel-scroll.el (pixel-scroll-up): Do not try to move cursor down when EOB
is shown at the top.  This function is reverted to commit
1bda71ec3b11eeb4d06c3da094a3cb21bac18d5c. (bug#29737)

diff --git a/lisp/pixel-scroll.el b/lisp/pixel-scroll.el
index f64a439..7024487
--- a/lisp/pixel-scroll.el
+++ b/lisp/pixel-scroll.el
@@ -110,11 +110,11 @@ This is an alternative of `scroll-up'.  Scope moves downward."
                        pixel-resolution-fine-flag
                      (frame-char-height))
                  (pixel-line-height))))
-      (while (pixel-point-at-top-p amt) ; prevent too late (multi tries)
-        (vertical-motion 1))            ; move point downward
-      (if (pixel-eob-at-top-p)          ; when end-of-the-buffer is close
-          (scroll-up 1)                 ; relay on robust method
-        (pixel-scroll-pixel-up amt))))) ; move scope downward
+      (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.