Subject: bug#57526: 29.0.50; Precise pixel-scrolling works great with touchpad but not with mouse wheel

From: Tassilo Horn <[email-masked]>
Date: Thu, 01 Sep 2022 15:48:43 +0200

1. emacs -Q
2. In *scratch* evaluate

(pixel-scroll-mode 1)
(setq pixel-scroll-precision-use-momentum t)
(pixel-scroll-precision-mode 1)

The result for me is that scrolling with my notebook's touchpad is
precise and uses momentum.  But scrolling with the mouse wheel seems to
scroll about 8 lines with each "click" of the wheel in one redisplay (so
it's not smooth at all) and there seems to be no momentum (which is
probably correct because the wheel doesn't give the ability to stop
momentum scrolling).  C-h k reports that wheel-down/up are bound to
pixel-scroll-precision.  On the touchpad it seems next to wheel-down/up
events a final touch-end event is generated starting the momentum
scrolling.

The reason for the difference is that the EVENTs passed to
pixel-scroll-precision have very different delta values.  The touchpad
events command emacs to scroll about 20 pixels, the mouse wheel events
command it to scroll 150 pixels.

I see there's some interpolation feature which might be relevant but I
don't get into that code path because (device-class last-event-frame
last-event-device) returns core-keyboard instead of mouse.  I get that
value in both the case where I scrolled using touchpad as well as mouse.
When I typed something with the real keyboard, it says just keyboard.

In GNU Emacs 29.0.50 (build 13, x86_64-pc-linux-gnu, GTK+ Version
 3.24.34, cairo version 1.17.6) of 2022-09-01 built on thinkpad-t440p
Repository revision: 67b85decc7702c24f2904e60e3eecfc2bfca5ab6
Repository branch: master
System Description: Arch Linux

Configured using:
 'configure --with-pgtk --with-native-compilation --with-xinput2'

Configured features:
ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ JPEG
JSON LCMS2 LIBOTF LIBSYSTEMD LIBXML2 MODULES NATIVE_COMP NOTIFY INOTIFY
PDUMPER PGTK PNG RSVG SECCOMP SOUND SQLITE3 THREADS TIFF
TOOLKIT_SCROLL_BARS WEBP XIM GTK3 ZLIB

Important settings:
  value of $LC_MONETARY: de_DE.utf8
  value of $LC_NUMERIC: de_DE.utf8
  value of $LC_TIME: de_DE.utf8
  value of $LANG: en_US.UTF-8
  locale-coding-system: utf-8-unix

Major mode: ELisp/l

Minor modes in effect:
  symbol-overlay-mode: t
  display-fill-column-indicator-mode: t
  editorconfig-mode: t
  debbugs-browse-mode: t
  hl-todo-mode: t
  global-aggressive-indent-mode: t
  aggressive-indent-mode: t
  pdf-occur-global-minor-mode: t
  dirvish-override-dired-mode: t
  diredfl-global-mode: t
  which-key-mode: t
  highlight-parentheses-mode: t
  global-corfu-mode: t
  corfu-mode: t
  yas-global-mode: t
  yas-minor-mode: t
  outline-minor-mode: t
  global-git-commit-mode: t
  magit-auto-revert-mode: t
  auto-revert-mode: t
  bug-reference-prog-mode: t
  vertico-mode: t
  marginalia-mode: t
  minibuffer-depth-indicate-mode: t
  electric-pair-mode: t
  recentf-mode: t
  pixel-scroll-precision-mode: t
  pixel-scroll-mode: t
  override-global-mode: t
  save-place-mode: t
  savehist-mode: t
  shell-dirtrack-mode: t
  puni-global-mode: t
  puni-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  show-paren-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  column-number-mode: t
  line-number-mode: t
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t

Load-path shadows:
~/Repos/el/mu/build/mu4e/mu4e hides ~/Repos/el/mu/mu4e/mu4e
~/Repos/el/mu/build/mu4e/mu4e-main hides ~/Repos/el/mu/mu4e/mu4e-main
~/Repos/el/mu/build/mu4e/mu4e-view hides ~/Repos/el/mu/mu4e/mu4e-view
~/Repos/el/mu/build/mu4e/mu4e-org hides ~/Repos/el/mu/mu4e/mu4e-org
~/Repos/el/mu/build/mu4e/mu4e-lists hides ~/Repos/el/mu/mu4e/mu4e-lists
~/Repos/el/mu/build/mu4e/mu4e-actions hides ~/Repos/el/mu/mu4e/mu4e-actions
~/Repos/el/mu/build/mu4e/mu4e-helpers hides ~/Repos/el/mu/mu4e/mu4e-helpers
~/Repos/el/mu/build/mu4e/mu4e-search hides ~/Repos/el/mu/mu4e/mu4e-search
~/Repos/el/mu/build/mu4e/mu4e-server hides ~/Repos/el/mu/mu4e/mu4e-server
~/Repos/el/mu/build/mu4e/mu4e-obsolete hides ~/Repos/el/mu/mu4e/mu4e-obsolete
~/Repos/el/mu/build/mu4e/mu4e-update hides ~/Repos/el/mu/mu4e/mu4e-update
~/Repos/el/mu/build/mu4e/mu4e-context hides ~/Repos/el/mu/mu4e/mu4e-context
~/Repos/el/mu/build/mu4e/mu4e-draft hides ~/Repos/el/mu/mu4e/mu4e-draft
~/Repos/el/mu/build/mu4e/mu4e-bookmarks hides ~/Repos/el/mu/mu4e/mu4e-bookmarks
~/Repos/el/mu/build/mu4e/mu4e-message hides ~/Repos/el/mu/mu4e/mu4e-message
~/Repos/el/mu/build/mu4e/mu4e-compose hides ~/Repos/el/mu/mu4e/mu4e-compose
~/Repos/el/mu/build/mu4e/mu4e-headers hides ~/Repos/el/mu/mu4e/mu4e-headers
~/Repos/el/mu/build/mu4e/mu4e-mark hides ~/Repos/el/mu/mu4e/mu4e-mark
~/Repos/el/mu/build/mu4e/mu4e-contacts hides ~/Repos/el/mu/mu4e/mu4e-contacts
~/Repos/el/mu/build/mu4e/mu4e-icalendar hides ~/Repos/el/mu/mu4e/mu4e-icalendar
~/Repos/el/mu/build/mu4e/mu4e-folders hides ~/Repos/el/mu/mu4e/mu4e-folders
~/Repos/el/mu/build/mu4e/mu4e-speedbar hides ~/Repos/el/mu/mu4e/mu4e-speedbar
~/Repos/el/mu/build/mu4e/mu4e-contrib hides ~/Repos/el/mu/mu4e/mu4e-contrib
~/Repos/el/mu/build/mu4e/mu4e-vars hides ~/Repos/el/mu/mu4e/mu4e-vars
/home/horn/.emacs.d/elpa/transient-20220806.2224/transient hides /home/horn/Repos/el/emacs/lisp/transient

Features:
(shadow emacsbug xref gnus-fun dabbrev cursor-sensor cape-keyword cape
shortdoc rect delsel executable symbol-overlay misearch multi-isearch
editorconfig-core editorconfig-core-handle editorconfig-fnmatch project
consult-vertico consult-icomplete consult compat-28 cl-print sort
gnus-cite mm-archive mail-extr qp textsec uni-scripts idna-mapping
ucs-normalize uni-confusable textsec-check view puni pulse
display-fill-column-indicator generic yaml-mode fish-mode cargo
cargo-process rust-utils rust-mode rust-rustfmt rust-playpen
rust-compile rust-cargo web-mode disp-table preview-latex tex-site
editorconfig elfeed-show elfeed-search vc-hg vc-bzr vc-src vc-sccs
vc-svn vc-cvs vc-rcs log-view debbugs-browse elfeed-csv elfeed
elfeed-curl elfeed-log elfeed-db elfeed-lib avl-tree generator url-queue
xml-query socks elpher hl-todo aggressive-indent rainbow-mode pdf-occur
tablist tablist-filter semantic/wisent/comp semantic/wisent
semantic/wisent/wisent semantic/util-modes semantic/util semantic
semantic/tag semantic/lex semantic/fw mode-local cedet pdf-isearch
pdf-misc pdf-tools pdf-view jka-compr pdf-cache pdf-info tq pdf-util
pdf-macs image-mode exif vc-git vc-dir ewoc epa-file rdictcc dirvish
so-long diredfl dired-x mu4e-icalendar gnus-icalendar org-capture
org-refile icalendar diary-lib diary-loaddefs mu4e mu4e-org org ob
ob-tangle ob-ref ob-lob ob-table ob-exp org-macro org-footnote org-src
ob-comint org-pcomplete org-list org-faces org-entities org-version
ob-emacs-lisp ob-core ob-eval org-table oc-basic bibtex ol org-keys oc
org-compat org-macs org-loaddefs mu4e-main mu4e-view cal-menu calendar
cal-loaddefs mu4e-headers mu4e-compose mu4e-draft mu4e-actions smtpmail
mu4e-search mu4e-lists mu4e-bookmarks mu4e-mark mu4e-message flow-fill
mule-util hl-line mu4e-contacts mu4e-update mu4e-folders mu4e-server
mu4e-context mu4e-obsolete mu4e-vars mu4e-helpers mu4e-config
magit-bookmark bookmark ido ecomplete auto-dictionary flyspell ispell
tramp-smb which-key highlight-parentheses restclient kind-icon svg-lib
corfu yasnippet forge-list forge-commands forge-semi forge-bitbucket
buck forge-gogs gogs forge-gitea gtea forge-gitlab glab forge-github
ghub-graphql treepy gsexp ghub let-alist forge-notify forge-revnote
forge-pullreq forge-issue forge-topic yaml forge-post markdown-mode
color thingatpt noutline outline forge-repo forge forge-core forge-db
closql emacsql-sqlite emacsql emacsql-compiler magit-submodule
magit-obsolete magit-blame magit-stash magit-reflog magit-bisect
magit-push magit-pull magit-fetch magit-clone magit-remote magit-commit
magit-sequence magit-notes magit-worktree magit-tag magit-merge
magit-branch magit-reset magit-files magit-refs magit-status magit
magit-repos magit-apply magit-wip magit-log which-func imenu edebug
debug backtrace find-func magit-diff smerge-mode diff diff-mode
git-commit log-edit pcvs-util add-log magit-core magit-autorevert
autorevert filenotify magit-margin magit-transient magit-process
with-editor server magit-mode magit-git magit-base magit-section crm
dash compat-27 compat-26 pcase visual-filename-abbrev rg vc
vc-dispatcher rg-info-hack advice rg-menu transient comp comp-cstr
compat compat-macs rg-ibuffer rg-result wgrep-rg wgrep rg-history
rg-header ibuf-ext ibuffer ibuffer-loaddefs grep compile debbugs
soap-client url-http url-auth url-gw nsm warnings rng-xsd rng-dt
rng-util xsd-regexp bug-reference vertico marginalia icomplete mb-depth
use-package-diminish ace-window avy elec-pair recentf tree-widget
pixel-scroll cua-base edmacro kmacro use-package-bind-key bind-key
diminish saveplace savehist smiley gnus-art mm-uu mml2015 mm-view
mml-smime smime gnutls dig gnus-sum shr pixel-fill kinsoku url-file svg
dom gnus-group gnus-undo gnus-start gnus-dbus dbus xml gnus-cloud nnimap
nnmail mail-source utf7 nnoo gnus-spec gnus-int gnus-range message
sendmail yank-media puny dired dired-loaddefs rfc822 mml mml-sec epa
derived epg rfc6068 epg-config mailabbrev gmm-utils mailheader gnus-win
gnus nnheader gnus-util text-property-search mail-utils range
doom-themes-ext-org doom-themes-ext-visual-bell face-remap
doom-Iosvkem-theme doom-themes doom-themes-base use-package-ensure
quelpa-use-package cl-extra use-package-core quelpa mm-decode mm-bodies
mm-encode mail-parse rfc2231 rfc2047 rfc2045 mm-util ietf-drums
mail-prsvr lisp-mnt help-fns radix-tree help-mode finder-inf tramp rx
tramp-loaddefs trampver tramp-integration cus-edit pp cus-load icons
wid-edit files-x tramp-compat shell pcomplete comint ansi-color ring
parse-time iso8601 time-date ls-lisp format-spec
aggressive-indent-autoloads cape-autoloads cargo-autoloads
clojure-mode-autoloads consult-eglot-autoloads consult-autoloads
corfu-autoloads csv-mode-autoloads debbugs-autoloads diredfl-autoloads
dirvish-autoloads doom-themes-autoloads editorconfig-autoloads
eglot-autoloads elfeed-autoloads elpher-autoloads ement-autoloads
expand-region-autoloads fish-mode-autoloads forge-autoloads
closql-autoloads ghub-autoloads hl-todo-autoloads magit-autoloads
git-commit-autoloads marginalia-autoloads markdown-mode-autoloads
pdf-tools-autoloads plz-autoloads puni-autoloads easy-mmode
quelpa-autoloads rainbow-mode-autoloads rcirc-color-autoloads
rust-mode-autoloads symbol-overlay-autoloads tablist-autoloads
taxy-magit-section-autoloads taxy-autoloads magit-section-autoloads
transient-autoloads use-package-autoloads bind-key-autoloads
vertico-autoloads web-mode-autoloads which-key-autoloads
with-editor-autoloads info compat-autoloads yaml-autoloads
yaml-mode-autoloads package browse-url url url-proxy url-privacy
url-expand url-methods url-history url-cookie generate-lisp-file
url-domsuf url-util mailcap url-handlers url-parse auth-source cl-seq
eieio eieio-core cl-macs password-cache json subr-x map byte-opt gv
bytecomp byte-compile cconv url-vars cl-loaddefs cl-lib rmc iso-transl
tooltip eldoc paren electric uniquify ediff-hook vc-hooks
lisp-float-type elisp-mode mwheel term/pgtk-win pgtk-win term/common-win
pgtk-dnd tool-bar dnd fontset image regexp-opt fringe tabulated-list
replace newcomment text-mode lisp-mode prog-mode register page tab-bar
menu-bar rfn-eshadow isearch easymenu timer select scroll-bar mouse
jit-lock font-lock syntax font-core term/tty-colors frame minibuffer
nadvice seq simple cl-generic indonesian philippine cham georgian
utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean
japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european
ethiopic indian cyrillic chinese composite emoji-zwj charscript charprop
case-table epa-hook jka-cmpr-hook help abbrev obarray oclosure
cl-preloaded button loaddefs faces cus-face macroexp files window
text-properties overlay sha1 md5 base64 format env code-pages mule
custom widget keymap hashtable-print-readable backquote threads dbusbind
inotify dynamic-setting system-font-setting font-render-setting cairo
gtk pgtk lcms2 multi-tty make-network-process native-compile emacs)

Memory information:
((conses 16 1145563 194767)
 (symbols 48 53673 11)
 (strings 32 285446 22601)
 (string-bytes 1 8850372)
 (vectors 16 150139)
 (vector-slots 8 3141153 227342)
 (floats 8 1206 1149)
 (intervals 56 28710 8078)
 (buffers 1000 40))