* [Emacs Master d277123f4bf] pixel-scroll-precision-scroll-up-page feels pause, but pixel-scroll-precision-scroll-down-page is smooth
@ 2024-09-03 9:56 Eval EXEC
2024-09-03 18:14 ` JD Smith
0 siblings, 1 reply; 5+ messages in thread
From: Eval EXEC @ 2024-09-03 9:56 UTC (permalink / raw)
To: emacs-devel
Hello,
I'm help to test emacs master commit: d277123f4bf
I compile emacs source code by :
```bash
make extraclean
./autogen.sh \
&& ./configure CFLAGS='-O3 -mtune=native -march=native' \
--prefix=$(realpath ../emacs-build/$(git branch --show-current | sed
's/\//_/g'))\
--with-mps=yes \
--with-imagemagick \
--with-modules --with-x-toolkit=gtk3 --without-compress-install \
--without-toolkit-scroll-bars --with-native-compilation --with-mailutils\
--enable-link-time-optimization \
--with-tree-sitter --with-xinput2 \
--with-dbus --with-native-compilation=aot \
--with-file-notification=inotify\
&& make -j30 install
```
And I enable pixel-scroll-precision-mode by:
```elisp
(setq-default
pixel-scroll-precision-interpolate-mice nil
pixel-scroll-precision-interpolate-page t
pixel-scroll-precision-use-momentum nil
pixel-scroll-precision-momentum-seconds 2.0
pixel-scroll-precision-interpolation-between-scroll 1.0
pixel-scroll-precision-interpolation-total-time 0.1
pixel-scroll-precision-large-scroll-height nil
)
(pixel-scroll-precision-mode 1)
```
Then I open a rust project.
use touchpad to scroll up and down. When I use touchpad to
`triple-wheel-up`, I feel very lag and pause.
When I `triple-wheel-down`, it's very smooth.
So I `profiler-start` and scroll, then `profiler-report` get:
1. pixel-scroll-precision-scroll-up-page (very lag and pause)
```
923 68% - command-execute
923 68% - funcall-interactively
923 68% - pixel-scroll-precision
861 64% - pixel-scroll-precision-scroll-up
861 64% - pixel-scroll-precision-scroll-up-page
45 3% - eval
22 1% - mode--line-format-right-align
14 1% string-pixel-width
4 0% - eval
3 0% unless
1 0% - minions--prominent-modes
1 0% - cl-remove-if-not
1 0% cl-remove
14 1% - breadcrumb--header-line
13 0% - funcall
12 0% - breadcrumb-project-crumbs
10 0% - breadcrumb--project-crumbs-1
5 0% breadcrumb--format-project-node
2 0% file-name-nondirectory
2 0% split-string
1 0% directory-file-name
2 0% breadcrumb--summarize
1 0% - breadcrumb-imenu-crumbs
1 0% - let
1 0% - which-function
1 0% - add-log-current-defun
1 0% - treesit-add-log-current-defun
1 0% - treesit-defun-at-point
1 0% - treesit-thing-at-point
1 0% - treesit-thing-at
1 0% - treesit-parent-until
1 0% - #<byte-code-function 34C>
1 0% treesit-node-match-p
4 0% - tab-line-format
4 0% - tab-line-tabs-fixed-window-buffers
4 0% - let*
4 0% - sort
4 0% - tab-line-tabs-window-buffers
4 0% - let*
2 0% - seq-remove
1 0% function
2 0% - seq-difference
1 0% seq-reduce
2 0% - minions--prominent-modes
2 0% - cl-remove-if-not
2 0% - cl-remove
1 0% cl-delete
1 0% unless
1 0% - if
1 0% frame-parameter
1 0% mode-line-window-control
1 0% - window-edges
1 0% - window-current-scroll-bars
1 0% frame-current-scroll-bars
29 2% - error-message-string
23 1% - substitute-command-keys
13 0% generate-new-buffer
5 0% - #<byte-code-function E7B>
5 0% - kill-buffer
1 0% - replace-buffer-in-windows
1 0% - unrecord-window-buffer
1 0% window-normalize-window
23 1% - message
22 1% - apply
22 1% - ad-Advice-message
16 1% - apply
16 1% - #<primitive-function message>
1 0% - clear-minibuffer-message
1 0% timerp
1 0% get-buffer-window-list
4 0% - select-window
4 0% - apply
4 0% - ad-Advice-select-window
4 0% - evil-refresh-cursor
1 0% evil-state-property
1 0% evil-set-cursor
3 0% - #<byte-code-function 70F>
3 0% - internal--after-with-selected-window
3 0% - select-window
3 0% - apply
3 0% - ad-Advice-select-window
3 0% evil-refresh-cursor
1 0% abs
1 0% round
292 21% - redisplay_internal (C function)
9 0% - eval
4 0% - mode--line-format-right-align
2 0% string-pixel-width
3 0% - breadcrumb--header-line
3 0% - funcall
2 0% - breadcrumb-project-crumbs
1 0% - breadcrumb--project-crumbs-1
1 0% breadcrumb--format-project-node
1 0% breadcrumb--summarize
1 0% - breadcrumb-imenu-crumbs
1 0% - let
1 0% - which-function
1 0% - add-log-current-defun
1 0% - treesit-add-log-current-defun
1 0% - treesit-defun-at-point
1 0% - treesit-thing-at-point
1 0% - treesit-thing-at
1 0% treesit-node-at
1 0% - minions--prominent-modes
1 0% - cl-remove-if-not
1 0% cl-remove
1 0% tab-line-format
4 0% - tab-bar-make-keymap
4 0% - tab-bar-make-keymap-1
4 0% - tab-bar-format-list
4 0% - #<byte-code-function BB1>
3 0% - tab-bar-format-align-right
2 0% - tab-bar-format-list
2 0% - #<byte-code-function F83>
2 0% - keycast-tab-bar
2 0% - keycast--format
2 0% - format-spec
2 0% generate-new-buffer
1 0% string-pixel-width
1 0% - keycast-tab-bar
1 0% - keycast--format
1 0% - format-spec
1 0% - #<byte-code-function 1DC>
1 0% kill-buffer
62 4% - timer-event-handler
62 4% - apply
62 4% - #<native-comp-function
F616e6f6e796d6f75732d6c616d626461_anonymous_lambda_9>
62 4% jit-lock-context-fontify
11 0% - copilot--post-command
11 0% - apply
11 0% - exec/copilot-complete-advice
11 0% - if
11 0% - progn
9 0% - funcall
9 0% - #<interpreted-function EC0>
9 0% - funcall
9 0% - #<interpreted-function EE2>
9 0% - if
9 0% - progn
5 0% - funcall
5 0% - #<interpreted-function E0C>
5 0% - save-current-buffer
5 0% - apply
5 0% - #<interpreted-function FC3>
5 0% - let
5 0% - while
5 0% - let
5 0% - let*
3 0% - mapc
3 0% - #<interpreted-function BD5>
3 0% - let*
3 0% - add-hook
3 0% - lsp--create-request-cancel
3 0% - function
3 0% -
cconv-make-interpreted-closure
3 0% - macroexpand-all
3 0% - macroexp--expand-all
2 0% - macroexp--all-forms
2 0% - macroexp--expand-all
2 0% - macroexp--all-forms
2 0% - macroexp--expand-all
2 0% - macroexp--all-forms
2 0% - macroexp--expand-all
1 0% - macroexp--all-forms
1 0% -
macroexp--expand-all
1 0% -
macroexp--all-forms
1 0% -
macroexp--expand-all
1 0% -
macroexp-macroexpand
1 0% macroexpand-1
1 0% - macroexp--all-clauses
1 0% - macroexp--all-forms
1 0% - macroexp--expand-all
1 0% - macroexp--all-forms
1 0% - macroexp--expand-all
1 0% - macroexp--all-forms
1 0% - macroexp--expand-all
1 0% - macroexp--all-forms
1 0% -
macroexp--expand-all
1 0% -
macroexp--all-forms
1 0% -
macroexp--expand-all
1 0% -
macroexp--all-forms
1 0% -
macroexp--expand-all
1 0% -
macroexp-macroexpand
1 0% macroexpand-1
1 0% - lsp--position-to-point
1 0% - let*
1 0% - lsp--line-character-to-point
1 0% - or
1 0% - let
1 0% - if
1 0% - let*
1 0% - save-restriction
1 0% - save-excursion
1 0% forward-line
3 0% - lsp-document-highlight
3 0% - let
3 0% - lsp--document-highlight
3 0% - if
3 0% - progn
3 0% - let*
3 0% - if
3 0% - lsp-request-async
3 0% - let*
3 0% - progn
3 0% - lsp--send-request-async
3 0% - let*
3 0% - if
3 0% - let*
1 0% - seq-do
1 0% - function
1 0% -
cconv-make-interpreted-closure
1 0% - cconv-fv
1 0% - cconv-analyze-form
1 0% cconv--analyze-function
1 0% lsp--create-async-callback
1 0% - function
1 0% -
cconv-make-interpreted-closure
1 0% - cconv-fv
1 0% - cconv-analyze-form
1 0% - cconv--analyze-function
1 0% - cconv-analyze-form
1 0% - cconv-analyze-form
1 0% - cconv--analyze-function
1 0% #<native-comp-function
F616e6f6e796d6f75732d6c616d626461_anonymous_lambda_25>
1 0% - condition-case
1 0% - let
1 0% - save-current-buffer
1 0% - unwind-protect
1 0% - progn
1 0% - setq
1 0% - cons
1 0% - json-parse-buffer
1 0% - apply
1 0% - lsp-booster--advice-json-parse
1 0% - or
1 0% - if
1 0% - progn
1 0% - let
1 0% read
2 0% - apply
2 0% - #<native-comp-function copilot--post-command>
1 0% - s-starts-with-p
1 0% string-prefix-p
9 0% display-line-numbers-update-width
9 0% flycheck-error-list-update-source
7 0% - exec/lsp-document-highlight-now
7 0% - let
7 0% - if
7 0% - progn
7 0% - if
7 0% - progn
7 0% - if
7 0% - progn
7 0% - let
6 0% - bounds-of-thing-at-point
2 0% make-closure
2 0% - #<byte-code-function 42F>
2 0% - forward-thing
2 0% forward-symbol
1 0% re-search-forward
1 0% if
5 0% - winner-save-old-configurations
5 0% - winner-remember
1 0% - winner-win-data
1 0% window-edges
4 0% - flycheck-hide-error-buffer
4 0% flycheck-error-message-buffer
4 0% - sideline-flycheck--post-command
4 0% - sideline-flycheck--get-errors
3 0% - flycheck-overlay-errors-in
3 0% - flycheck-overlays-in
3 0% - flycheck-filter-overlays
2 0% - seq-filter
2 0% - seq-map
1 0% - apply
1 0% - #<byte-code-function 1B4>
1 0% mapcar
1 0% seq-sort
3 0% - flycheck-display-error-at-point-soon
3 0% - run-at-time
2 0% timer-relative-time
1 0% - timer-set-time
1 0% timer--time-setter
2 0% - jit-lock--antiblink-post-command
1 0% syntax--lbp
1 0% syntax-ppss
2 0% flycheck-error-list-highlight-errors
1 0% - corfu--auto-post-command
1 0% corfu--match-symbol-p
1 0% which-key--lighter-restore
1 0% - which-key--hide-popup
1 0% which-key--lighter-restore
1 0% - hl-line-highlight
1 0% - apply
1 0% #<native-comp-function hl-line-highlight>
1 0% flycheck-perform-deferred-syntax-check
1 0% - lsp--post-command
1 0% - lsp--idle-reschedule
1 0% - setq
1 0% - run-with-idle-timer
1 0% - timer-activate-when-idle
1 0% timer--activate
0 0% ...
```
2. pixel-scroll-precision-scroll-down-page (very smooth, no pause)
```
423 61% - redisplay_internal (C function)
24 3% - tab-bar-make-keymap
24 3% - tab-bar-make-keymap-1
24 3% - tab-bar-format-list
24 3% - #<byte-code-function 634>
16 2% - tab-bar-format-align-right
16 2% - tab-bar-format-list
16 2% - #<byte-code-function 544>
14 2% - keycast-tab-bar
14 2% - keycast--format
12 1% - format-spec
8 1% generate-new-buffer
3 0% - #<byte-code-function F35>
1 0% kill-buffer
2 0% format
2 0% - tab-bar-format-global
2 0% - #<native-comp-function
F616e6f6e796d6f75732d6c616d626461_anonymous_lambda_39>
2 0% - eval
2 0% - lsp--progress-status
2 0% - let
2 0% - s-join
2 0% - -keep
1 0% - #<interpreted-function 931>
1 0% - let
1 0% if
5 0% - keycast-tab-bar
5 0% - keycast--format
4 0% - format-spec
2 0% - #<byte-code-function 3A9>
2 0% - kill-buffer
1 0% tabspaces--local-buffer-p
2 0% generate-new-buffer
1 0% format
3 0% - tab-bar-format-global
3 0% - #<native-comp-function
F616e6f6e796d6f75732d6c616d626461_anonymous_lambda_39>
2 0% - eval
1 0% - lsp--progress-status
1 0% let
1 0% - flycheck-status-emoji-mode-line-text
1 0% - flycheck-status-emoji--check
1 0% - char-displayable-p
1 0% internal-char-font
20 2% - eval
10 1% - mode--line-format-right-align
5 0% string-pixel-width
3 0% - eval
2 0% - minions--prominent-modes
2 0% - cl-remove-if-not
2 0% - cl-remove
1 0% cl-delete
1 0% cdr
6 0% - breadcrumb--header-line
6 0% - funcall
4 0% - breadcrumb-project-crumbs
4 0% - breadcrumb--project-crumbs-1
2 0% directory-file-name
1 0% breadcrumb--format-project-node
1 0% split-string
2 0% - breadcrumb-imenu-crumbs
2 0% - let
2 0% - which-function
2 0% - add-log-current-defun
2 0% - treesit-add-log-current-defun
2 0% - treesit-defun-at-point
2 0% - treesit-thing-at-point
2 0% - treesit-thing-at
1 0% treesit-parent-until
1 0% treesit-node-at
2 0% - tab-line-format
2 0% - tab-line-tabs-fixed-window-buffers
2 0% - let*
2 0% - let
2 0% - seq-do-indexed
2 0% - seq-do
1 0% - mapc
1 0% - #<byte-code-function 74F>
1 0% - #<interpreted-function F23>
1 0% puthash
1 0% - minions--prominent-modes
1 0% - cl-remove-if-not
1 0% cl-remove
189 27% - command-execute
189 27% - funcall-interactively
189 27% - pixel-scroll-precision
187 27% - pixel-scroll-precision-scroll-down
187 27% - pixel-scroll-precision-scroll-down-page
81 11% - posn-at-point
81 11% - apply
81 11% - #<primitive-function posn-at-point>
30 4% - eval
13 1% - mode--line-format-right-align
7 1% - string-pixel-width
1 0% - #<byte-code-function 08B>
1 0% work-buffer--release
2 0% - eval
2 0% - minions--prominent-modes
2 0% - cl-remove-if-not
2 0% - cl-remove
1 0% cl-ldiff
11 1% - breadcrumb--header-line
11 1% - funcall
8 1% - breadcrumb-project-crumbs
8 1% - breadcrumb--project-crumbs-1
3 0% breadcrumb--format-project-node
2 0% - project-current
2 0% - apply
2 0% - exec-project-current-advice
1 0% - or
1 0% exec-project-current
1 0% split-string
1 0% project-root
1 0% file-name-nondirectory
2 0% - breadcrumb-imenu-crumbs
2 0% - let
2 0% - which-function
2 0% - add-log-current-defun
2 0% - treesit-add-log-current-defun
1 0% - treesit-defun-name
1 0% rust-ts-mode--defun-name
1 0% - treesit-defun-at-point
1 0% - treesit-thing-at-point
1 0% - treesit-thing-at
1 0% treesit-parent-until
2 0% - tab-line-format
2 0% - tab-line-tabs-fixed-window-buffers
2 0% - let*
1 0% - let
1 0% make-hash-table
1 0% - sort
1 0% - tab-line-tabs-window-buffers
1 0% - let*
1 0% - seq-difference
1 0% make-closure
2 0% propertize
2 0% - if
2 0% frame-parameter
33 4% - eval
14 2% - mode--line-format-right-align
11 1% - string-pixel-width
2 0% - #<byte-code-function 733>
2 0% work-buffer--release
2 0% symbol-overlay-refresh
1 0% - eval
1 0% propertize
11 1% - breadcrumb--header-line
10 1% - funcall
5 0% - breadcrumb-imenu-crumbs
5 0% - let
5 0% - which-function
5 0% - add-log-current-defun
5 0% - treesit-add-log-current-defun
3 0% - treesit-defun-at-point
3 0% - treesit-thing-at-point
3 0% - treesit-thing-at
3 0% treesit-parent-until
1 0% - treesit-defun-name
1 0% rust-ts-mode--defun-name
5 0% - breadcrumb-project-crumbs
4 0% - breadcrumb--project-crumbs-1
2 0% breadcrumb--format-project-node
1 0% file-name-nondirectory
1 0% - file-relative-name
1 0% - apply
1 0% - #<interpreted-function 4A2>
1 0% my-cacheable-file-relative-name
1 0% breadcrumb--summarize
1 0% - cl-remove-if
1 0% - cl-remove
1 0% - seq-empty-p
1 0% cl-type-of
4 0% - tab-line-format
3 0% - tab-line-tabs-fixed-window-buffers
3 0% - let*
3 0% - sort
2 0% - tab-line-tabs-window-buffers
2 0% - let*
1 0% - seq-difference
1 0% - seq-reduce
1 0% seq-empty-p
1 0% - seq-remove
1 0% seq-filter
3 0% - minions--prominent-modes
3 0% - cl-remove-if-not
3 0% - cl-remove
1 0% cl-delete
1 0% #<native-comp-function
F616e6f6e796d6f75732d6c616d626461_anonymous_lambda_8>
1 0% if
2 0% - select-window
2 0% - apply
2 0% - ad-Advice-select-window
2 0% evil-refresh-cursor
33 4% - timer-event-handler
33 4% - apply
33 4% - #<native-comp-function
F616e6f6e796d6f75732d6c616d626461_anonymous_lambda_9>
33 4% jit-lock-context-fontify
12 1% flycheck-error-list-update-source
8 1% - ...
7 1% - lsp--document-highlight
7 1% - if
7 1% - progn
7 1% - let*
7 1% - if
7 1% - lsp-request-async
7 1% - let*
7 1% - progn
7 1% - lsp--send-request-async
7 1% - let*
7 1% - if
7 1% - let*
4 0% - seq-do
4 0% - function
4 0% - cconv-make-interpreted-closure
4 0% - macroexpand-all
4 0% - macroexp--expand-all
4 0% - macroexp--all-forms
4 0% - macroexp--expand-all
4 0% - macroexp--all-forms
4 0% - macroexp--expand-all
4 0% - macroexp--all-forms
4 0% - macroexp--expand-all
2 0% - macroexp--all-forms
2 0% - macroexp--expand-all
2 0% - macroexp--all-forms
2 0% - macroexp--expand-all
2 0% - macroexp--all-forms
2 0% - macroexp--expand-all
2 0% - macroexp--all-forms
2 0% - macroexp--expand-all
2 0% - macroexp--all-forms
2 0% macroexp--expand-all
1 0% - macroexp--all-clauses
1 0% - macroexp--all-forms
1 0% - macroexp--expand-all
1 0% - macroexp--all-forms
1 0% - macroexp--expand-all
1 0% - macroexp--all-forms
1 0% - macroexp--expand-all
1 0% booleanp
1 0% function-get
2 0% - lsp--create-async-callback
2 0% - let
2 0% - function
2 0% - cconv-make-interpreted-closure
1 0% - macroexpand-all
1 0% - macroexp--expand-all
1 0% - macroexp--all-forms
1 0% - macroexp--expand-all
1 0% - macroexp--all-forms
1 0% - macroexp--expand-all
1 0% - macroexp--all-forms
1 0% macroexp--expand-all
1 0% - if
1 0% - let
1 0% - function
1 0% - cconv-make-interpreted-closure
1 0% - macroexpand-all
1 0% - macroexp--expand-all
1 0% - macroexp--all-forms
1 0% - macroexp--expand-all
1 0% - macroexp--all-forms
1 0% - macroexp--expand-all
1 0% function-get
1 0% - run-hooks
1 0% - lsp--update-inlay-hints
1 0% - if
1 0% - let*
1 0% - lsp-update-inlay-hints
1 0% - lsp-request-async
1 0% - let*
1 0% - progn
1 0% - lsp--send-request-async
1 0% - let*
1 0% - if
1 0% - let*
1 0% - function
1 0% - cconv-make-interpreted-closure
1 0% - cconv-fv
1 0% #<native-comp-function
F616e6f6e796d6f75732d6c616d626461_anonymous_lambda_29>
8 1% display-line-numbers-update-width
3 0% - flycheck-display-error-at-point-soon
3 0% - run-at-time
2 0% timer-relative-time
1 0% - timer-activate
1 0% - timer--activate
1 0% timer--time-less-p
3 0% - exec/lsp-document-highlight-now
3 0% - let
3 0% - if
2 0% - progn
1 0% - if
1 0% - progn
1 0% - if
1 0% - progn
1 0% - let
1 0% - bounds-of-thing-at-point
1 0% - #<byte-code-function BED>
1 0% - forward-thing
1 0% intern-soft
1 0% - let
1 0% - lsp--cancel-request
1 0% - mapcar
1 0% - #<interpreted-function 29A>
1 0% - let
1 0% - lsp-notify
1 0% - lsp--send-notification
1 0% - mapcar
1 0% - #<interpreted-function 188>
1 0% - let
1 0% - if
1 0% - lsp--log-io-p
1 0% plist-get
1 0% - and
1 0% - and
1 0% boundp
3 0% - winner-save-old-configurations
3 0% - winner-remember
1 0% - winner-win-data
1 0% - winner-sorted-window-list
1 0% #<native-comp-function
F616e6f6e796d6f75732d6c616d626461_anonymous_lambda_10>
2 0% - #<interpreted-function C15>
2 0% - let
2 0% - while
2 0% - if
2 0% - let*
1 0% - mapc
1 0% - #<interpreted-function 66F>
1 0% - let*
1 0% - add-hook
1 0% - lsp--create-request-cancel
1 0% - function
1 0% - cconv-make-interpreted-closure
1 0% - cconv-fv
1 0% - cconv-analyze-form
1 0% - cconv--analyze-function
1 0% - cconv-analyze-form
1 0% - cconv-analyze-form
1 0% - cconv-analyze-form
1 0% cconv-analyze-form
1 0% - if
1 0% - progn
1 0% - condition-case
1 0% - let
1 0% generate-new-buffer
1 0% - evil-repeat-pre-hook
1 0% - evil-repeat-start
1 0% evil-visual-state-p
1 0% keycast--update
1 0% - evil-repeat-post-hook
1 0% evil-repeat-stop
1 0% - sideline-flycheck--post-command
1 0% sideline-flycheck--get-errors
1 0% flycheck-error-list-highlight-errors
```
Why `pixel-scroll-precision-scroll-up-page` is very lag and pause, but
`pixel-scroll-precision-scroll-down-page` is very smooth?
Thank you
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Emacs Master d277123f4bf] pixel-scroll-precision-scroll-up-page feels pause, but pixel-scroll-precision-scroll-down-page is smooth
2024-09-03 9:56 [Emacs Master d277123f4bf] pixel-scroll-precision-scroll-up-page feels pause, but pixel-scroll-precision-scroll-down-page is smooth Eval EXEC
@ 2024-09-03 18:14 ` JD Smith
2024-09-04 1:13 ` Po Lu
0 siblings, 1 reply; 5+ messages in thread
From: JD Smith @ 2024-09-03 18:14 UTC (permalink / raw)
To: Eval EXEC, emacs-devel
> On Sep 3, 2024, at 5:56 AM, Eval EXEC <execvy@gmail.com> wrote:
>
> Then I open a rust project.
>
> use touchpad to scroll up and down. When I use touchpad to `triple-wheel-up`, I feel very lag and pause.
>
> When I `triple-wheel-down`, it's very smooth.
>
>
> Why `pixel-scroll-precision-scroll-up-page` is very lag and pause, but `pixel-scroll-precision-scroll-down-page` is very smooth?
This asymmetry is inherent to vscroll, which, although very fast, is only available "below" the displayed screen contents. To quote the FAQ of my ultra-scroll-mac[1] package:
• Scrolling asymmetry:
• vscroll is purely one-sided: you can only access a vscroll area beneath the current window view; there is no negative vscroll.
• Unlike window-start, window-end does not get updated promptly between redisplays and cannot always be trusted.
• For these two reasons, smooth scrolling up and scrolling down are not symmetric with each other (and will likely never be). You need different approaches for each.
• If the two approaches for scrolling up and down perform quite differently, the user will feel this difference.
The algorithms employed in ultra-scroll-mac are (in my testing) measurably faster than the ones in pixel-scroll-precision (from which it was inspired), although up is still slower than down. They also enable smooth scrolling past images which are taller than the window. See the functions `ultra-scroll-mac-up/down'.
Unfortunately this package only works on the Carbon emacs-mac port, which exposes rich scroll events with pixel-level delta data. But the core scroll algorithms could potentially be adapted to pixel-scroll-precision-mode, and I'd be happy to contribute them if anyone takes this up. I have also wondered whether other systems like Linux/GTK have standard APIs for delivering high-speed touchpad events, which would allow pixel-scroll-precision to get out of the business of simulating these.
[1] https://github.com/jdtsmith/ultra-scroll-mac
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Emacs Master d277123f4bf] pixel-scroll-precision-scroll-up-page feels pause, but pixel-scroll-precision-scroll-down-page is smooth
2024-09-03 18:14 ` JD Smith
@ 2024-09-04 1:13 ` Po Lu
2024-09-04 1:56 ` JD Smith
0 siblings, 1 reply; 5+ messages in thread
From: Po Lu @ 2024-09-04 1:13 UTC (permalink / raw)
To: JD Smith; +Cc: Eval EXEC, emacs-devel
JD Smith <jdtsmith@gmail.com> writes:
> Unfortunately this package only works on the Carbon emacs-mac port,
> which exposes rich scroll events with pixel-level delta data.
Really? Emacs has reported this data on all supported platforms since
29.1, as documented in (elisp)Misc Events. The interpolation
implemented by pixel-scroll.el is not designed for events carrying this
data but for those generated by mice.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Emacs Master d277123f4bf] pixel-scroll-precision-scroll-up-page feels pause, but pixel-scroll-precision-scroll-down-page is smooth
2024-09-04 1:13 ` Po Lu
@ 2024-09-04 1:56 ` JD Smith
2024-09-04 2:32 ` Po Lu
0 siblings, 1 reply; 5+ messages in thread
From: JD Smith @ 2024-09-04 1:56 UTC (permalink / raw)
To: Po Lu; +Cc: Eval EXEC, emacs-devel
> On Sep 3, 2024, at 9:13 PM, Po Lu <luangruo@yahoo.com> wrote:
>
> JD Smith <jdtsmith@gmail.com> writes:
>
>> Unfortunately this package only works on the Carbon emacs-mac port,
>> which exposes rich scroll events with pixel-level delta data.
>
> Really? Emacs has reported this data on all supported platforms since
> 29.1, as documented in (elisp)Misc Events. The interpolation
> implemented by pixel-scroll.el is not designed for events carrying this
> data but for those generated by mice.
Interesting, I actually hadn't seen those new wheel-up/down PIXEL-DELTA values. They come straight from the system?
These are the mouse event properties delivered on Carbon emacs:
;; (nth 3 event) is a plist that may contain the following keys:
;; :direction-inverted-from-device-p (boolean)
;; :delta-x, :delta-y, :delta-z (floats)
;; :scrolling-delta-x, :scrolling-delta-y (floats)
;; :phase, :momentum-phase (symbols)
;; possible value: `none', `began', `stationary', `changed',
;; `ended', `cancelled', or `may-begin'
;; :swipe-tracking-from-scroll-events-enabled-p (boolean)
The key of interest is :scrolling-delta-y (a float), which taps directly into the system scroll amount, as configured in settings (with momentum, etc.). I had the impression there was nothing equivalent in other emacs builds, and that was why pixel-scroll-precision has its own elisp-based "driver". So all the momentum/interpolation code in pixel-scroll is effectively to allow low resolution mice to simulate high scroll event rate trackpads?
Will take a closer look, thanks.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Emacs Master d277123f4bf] pixel-scroll-precision-scroll-up-page feels pause, but pixel-scroll-precision-scroll-down-page is smooth
2024-09-04 1:56 ` JD Smith
@ 2024-09-04 2:32 ` Po Lu
0 siblings, 0 replies; 5+ messages in thread
From: Po Lu @ 2024-09-04 2:32 UTC (permalink / raw)
To: JD Smith; +Cc: Eval EXEC, emacs-devel
JD Smith <jdtsmith@gmail.com> writes:
> Interesting, I actually hadn't seen those new wheel-up/down
> PIXEL-DELTA values. They come straight from the system?
Yes. They're provided by the X Input Extension on X, for example.
> pixel-scroll-precision has its own elisp-based "driver". So all the
> momentum/interpolation code in pixel-scroll is effectively to allow
> low resolution mice to simulate high scroll event rate trackpads?
The momentum code is not, but the interpolation is. Momentum enters
into effect when the system notifies Emacs that precision scrolling has
ceased and `pixel-scroll-precision-use-momentum' is enabled.
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2024-09-04 2:32 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-09-03 9:56 [Emacs Master d277123f4bf] pixel-scroll-precision-scroll-up-page feels pause, but pixel-scroll-precision-scroll-down-page is smooth Eval EXEC
2024-09-03 18:14 ` JD Smith
2024-09-04 1:13 ` Po Lu
2024-09-04 1:56 ` JD Smith
2024-09-04 2:32 ` Po Lu
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.