From b867eb2216827fa90a8d3c647f80f77dc4ca3bf8 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Fri, 10 Dec 2021 10:33:00 +0800 Subject: Fix precision scrolling for stretch glyphs * lisp/pixel-scroll.el (pixel-scroll-precision-scroll-down-page): Simplify logic. (pixel-scroll-precision-interpolate): Block throw-on-input when actually scrolling. --- lisp/pixel-scroll.el | 68 +++++++++++++++++++++++----------------------------- 1 file changed, 30 insertions(+), 38 deletions(-) (limited to 'lisp/pixel-scroll.el') diff --git a/lisp/pixel-scroll.el b/lisp/pixel-scroll.el index ead841c9823..d7ce0bcdd9f 100644 --- a/lisp/pixel-scroll.el +++ b/lisp/pixel-scroll.el @@ -438,10 +438,12 @@ the height of the current window." (window-header-line-height)))) (object (posn-object desired-pos)) (desired-start (posn-point desired-pos)) - (scroll-area-total-height (cdr (window-text-pixel-size nil - (window-start) - (1- desired-start)))) - (desired-vscroll (- delta scroll-area-total-height)) + (current-vs (window-vscroll nil t)) + (start-posn (unless (eq desired-start (window-start)) + (posn-at-point desired-start))) + (desired-vscroll (if start-posn + (- delta (cdr (posn-x-y start-posn))) + (+ current-vs delta))) (edges (window-edges nil t)) (usable-height (- (nth 3 edges) (nth 1 edges))) @@ -453,33 +455,22 @@ the height of the current window." (end-pos (posn-at-x-y 0 (+ usable-height (window-tab-line-height) (window-header-line-height))))) - (if (or (overlayp object) - (stringp object) - (and (consp object) - (stringp (car object))) - (and (consp (posn-object end-pos)) - (> (cdr (posn-object-x-y end-pos)) 0))) - ;; We are either on an overlay or a string, so set vscroll - ;; directly. - (set-window-vscroll nil (+ (window-vscroll nil t) - delta) - t) - (when (and (or (< (point) next-pos)) - (let ((pos-visibility (pos-visible-in-window-p next-pos nil t))) - (and pos-visibility - (or (eq (length pos-visibility) 2) - (when-let* ((posn (posn-at-point next-pos))) - (> (cdr (posn-object-width-height posn)) - usable-height)))))) - (goto-char next-pos)) - (set-window-start nil (if (zerop (window-hscroll)) - desired-start - (save-excursion - (goto-char desired-start) - (beginning-of-visual-line) - (point))) - t) - (set-window-vscroll nil desired-vscroll t)))) + (when (and (or (< (point) next-pos)) + (let ((pos-visibility (pos-visible-in-window-p next-pos nil t))) + (and pos-visibility + (or (eq (length pos-visibility) 2) + (when-let* ((posn (posn-at-point next-pos))) + (> (cdr (posn-object-width-height posn)) + usable-height)))))) + (goto-char next-pos)) + (set-window-start nil (if (zerop (window-hscroll)) + desired-start + (save-excursion + (goto-char desired-start) + (beginning-of-visual-line) + (point))) + t) + (set-window-vscroll nil desired-vscroll t))) (defun pixel-scroll-precision-scroll-down (delta) "Scroll the current window down by DELTA pixels." @@ -558,13 +549,14 @@ animation." (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))))) + (let ((throw-on-input nil)) + (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))) (if (< percentage 1) (progn -- cgit v1.2.1 From e8d90a3fd402c0c67bf4b4b29ac26108ead8845d Mon Sep 17 00:00:00 2001 From: Po Lu Date: Fri, 10 Dec 2021 10:38:24 +0800 Subject: Remove unused let-bindings from pixel-scroll.el * lisp/pixel-scroll.el (pixel-scroll-precision-scroll-down-page): Remove unused bindings. --- lisp/pixel-scroll.el | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) (limited to 'lisp/pixel-scroll.el') diff --git a/lisp/pixel-scroll.el b/lisp/pixel-scroll.el index d7ce0bcdd9f..813fbb0711b 100644 --- a/lisp/pixel-scroll.el +++ b/lisp/pixel-scroll.el @@ -436,7 +436,6 @@ the height of the current window." (let* ((desired-pos (posn-at-x-y 0 (+ delta (window-tab-line-height) (window-header-line-height)))) - (object (posn-object desired-pos)) (desired-start (posn-point desired-pos)) (current-vs (window-vscroll nil t)) (start-posn (unless (eq desired-start (window-start)) @@ -451,10 +450,7 @@ the height of the current window." (goto-char desired-start) (when (zerop (vertical-motion (1+ scroll-margin))) (signal 'end-of-buffer nil)) - (point))) - (end-pos (posn-at-x-y 0 (+ usable-height - (window-tab-line-height) - (window-header-line-height))))) + (point)))) (when (and (or (< (point) next-pos)) (let ((pos-visibility (pos-visible-in-window-p next-pos nil t))) (and pos-visibility -- cgit v1.2.1 From 2e4740f04239ee441685b2f43d156efcf6359383 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Fri, 10 Dec 2021 11:25:10 +0800 Subject: Fix pixel scrolling upwards in Info buffers * lisp/pixel-scroll.el (pixel-point-and-height-at-unseen-line): Don't blindly trust window start to be the beginning of a visual line. --- lisp/pixel-scroll.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'lisp/pixel-scroll.el') diff --git a/lisp/pixel-scroll.el b/lisp/pixel-scroll.el index 813fbb0711b..432a5dc52cf 100644 --- a/lisp/pixel-scroll.el +++ b/lisp/pixel-scroll.el @@ -397,7 +397,10 @@ returns nil." The returned value is a cons of the position of the first character on the unseen line just above the scope of current window, and the pixel height of that line." - (let* ((pos0 (window-start)) + (let* ((pos0 (save-excursion + (goto-char (window-start)) + (beginning-of-visual-line) + (point))) (vscroll0 (window-vscroll nil t)) (line-height nil) (pos @@ -407,8 +410,7 @@ window, and the pixel height of that line." (point-min) (vertical-motion -1) (setq line-height - (cdr (window-text-pixel-size nil (point) - pos0))) + (cdr (window-text-pixel-size nil (point) pos0))) (point))))) ;; restore initial position (set-window-start nil pos0 t) -- cgit v1.2.1 From 59db96d83ae837b3a3d82a979cd97a271bcd86bf Mon Sep 17 00:00:00 2001 From: Po Lu Date: Fri, 10 Dec 2021 11:30:07 +0800 Subject: Fix bob detection when pixel scrolling upwards * lisp/pixel-scroll.el (pixel-point-and-height-at-unseen-line): Don't go to the beginning-of-visual-line if bobp. --- lisp/pixel-scroll.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'lisp/pixel-scroll.el') diff --git a/lisp/pixel-scroll.el b/lisp/pixel-scroll.el index 432a5dc52cf..29d8e7e0255 100644 --- a/lisp/pixel-scroll.el +++ b/lisp/pixel-scroll.el @@ -399,7 +399,8 @@ character on the unseen line just above the scope of current window, and the pixel height of that line." (let* ((pos0 (save-excursion (goto-char (window-start)) - (beginning-of-visual-line) + (unless (bobp) + (beginning-of-visual-line)) (point))) (vscroll0 (window-vscroll nil t)) (line-height nil) -- cgit v1.2.1 From 636704fab96bf32809adf392df84d9a80e40de21 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Fri, 10 Dec 2021 06:01:44 +0000 Subject: Stop setting `make-cursor-line-fully-visible' in precision scrolling * lisp/pixel-scroll.el (pixel-scroll-precision-mode): Stop setting `make-cursor-line-fully-visible'. --- lisp/pixel-scroll.el | 2 -- 1 file changed, 2 deletions(-) (limited to 'lisp/pixel-scroll.el') diff --git a/lisp/pixel-scroll.el b/lisp/pixel-scroll.el index 29d8e7e0255..5425462caf5 100644 --- a/lisp/pixel-scroll.el +++ b/lisp/pixel-scroll.el @@ -714,8 +714,6 @@ precisely, according to the turning of the mouse wheel." :group 'mouse :keymap pixel-scroll-precision-mode-map (setq mwheel-coalesce-scroll-events - (not pixel-scroll-precision-mode) - make-cursor-line-fully-visible (not pixel-scroll-precision-mode))) (provide 'pixel-scroll) -- cgit v1.2.1 From 6e865a7171d80cd91b54c6d71b88d960b920abe3 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Fri, 10 Dec 2021 14:20:32 +0800 Subject: Further reduce image-related stutter during precision scrolling * lisp/pixel-scroll.el (pixel-scroll-precision-scroll-down-page): Disable `scroll-preserve-screen-position' and `auto-window-vscroll' while scrolling. --- lisp/pixel-scroll.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'lisp/pixel-scroll.el') diff --git a/lisp/pixel-scroll.el b/lisp/pixel-scroll.el index 5425462caf5..336b555e77c 100644 --- a/lisp/pixel-scroll.el +++ b/lisp/pixel-scroll.el @@ -453,7 +453,9 @@ the height of the current window." (goto-char desired-start) (when (zerop (vertical-motion (1+ scroll-margin))) (signal 'end-of-buffer nil)) - (point)))) + (point))) + (scroll-preserve-screen-position nil) + (auto-window-vscroll nil)) (when (and (or (< (point) next-pos)) (let ((pos-visibility (pos-visible-in-window-p next-pos nil t))) (and pos-visibility -- cgit v1.2.1