xserver/dix
Peter Hutterer 0a22502c34 dix: switch scroll button emulation to multiples of increment
The current algorithm triggers a bug in Xwayland when two devices have
different granularity of scrolling. In Xwayland, the scroll increment is
1 and all physical devices scroll through the same (x)wayland pointer
device.

This may cause events to get lost when changing devices:
- mouse scrolls by full increment, current value is 1.0
  last scroll button was sent for valuator value 0.0,
  delta is 1.0 and we emulate a button event.
- touchpad scrolls by partial increment, current value is 1.3
  last scroll button was sent for valuator value 1.0, delta is 0.3
  and no button event is emulated
- mouse scrolls by full increment, current value is -0.7,
  last scroll button was sent for valuator value 1.0, delta is -0.7
  and no button event is emulated

Thus the wheel event appears to get lost. Xwayland cannot reliably
detect this case because we don't see the physical devices.

We can work around this by instead emulating buttons whenever we cross
a multiple of increment. However, this has a drawback:
high-resolution scroll devices can now trigger a button event storm by
jittering across the multiple of increment. e.g. in the example above
the touchpad moving from 1.3 to 1.0 would cause a click, despite this
being a third of an increment.

Fixes #1339

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Acked-by: Olivier Fourdan <ofourdan@redhat.com>
2023-02-16 10:25:16 +00:00
..
.gitignore Fix spelling/wording issues 2020-07-05 13:07:33 -07:00
BuiltInAtoms R6.6 is the Xorg base-line 2003-11-14 15:54:54 +00:00
atom.c atom: make FreeAtom static 2015-07-08 16:41:29 -04:00
buildatoms XFree86 4.3.0.1 2003-11-14 16:49:22 +00:00
colormap.c Fix spelling/wording issues 2020-07-05 13:07:33 -07:00
cursor.c dix: Remove -fn and -fc options to set default text/cursor fonts 2019-10-30 16:17:04 +00:00
devices.c dix: Clear device sprite after free in AttachDevice() 2023-02-09 23:54:11 +00:00
dispatch.c rootless: Use screen_x and screen_y instead of pixmap pointer hacks 2023-01-20 17:10:54 +00:00
dispatch.h Drop trailing whitespaces 2014-11-12 10:25:00 +10:00
dixfonts.c dix: Use memcpy() instead of memmove() when buffers are known not to overlap 2022-08-29 21:10:51 +00:00
dixutils.c os: Don't crash in AttendClient if the client is gone 2019-11-19 10:15:05 -08:00
enterleave.c Replace "the the" with a single "the" in docs & comments 2022-03-31 13:27:57 -07:00
enterleave.h dix: Unexport various implementation details 2015-07-08 16:40:57 -04:00
eventconvert.c xi: Implement conversions from internal to Xi2 gesture event structs 2021-05-30 13:26:37 +03:00
events.c dix: Use CopyPartialInternalEvent in EnqueueEvent 2023-01-25 02:02:48 +00:00
extension.c dix: Use memcpy() instead of memmove() when buffers are known not to overlap 2022-08-29 21:10:51 +00:00
gc.c Use ARRAY_SIZE all over the tree 2017-10-30 13:45:20 -04:00
gestures.c Implement gesture processing logic 2021-05-30 13:26:42 +03:00
getevents.c dix: switch scroll button emulation to multiples of increment 2023-02-16 10:25:16 +00:00
globals.c include: Remove now-empty site.h 2019-10-30 16:17:04 +00:00
glyphcurs.c Let calloc handle multiplication 2015-04-21 16:57:07 -07:00
grabs.c xi: Implement grab support for new gesture event types 2021-05-30 13:26:32 +03:00
initatoms.c Introduce a consistent coding style 2012-03-21 13:54:42 -07:00
inpututils.c Implement gesture processing logic 2021-05-30 13:26:42 +03:00
main.c dix: Remove pScratchPixmap and other associated ABI changes 2022-12-30 01:32:25 +00:00
meson.build dix: Implement internal gesture state handling 2021-05-30 13:26:39 +03:00
pixmap.c dix: Remove pScratchPixmap and other associated ABI changes 2022-12-30 01:32:25 +00:00
privates.c dix/privates.c: Avoid undefined behaviour after realloc() 2021-10-08 09:59:11 +00:00
property.c Xi: avoid integer truncation in length check of ProcXIChangeProperty 2022-12-14 11:02:40 +10:00
protocol.txt protocol.txt: add GLX req. 35 - SetClientInfo2ARB 2018-02-27 13:08:35 -05:00
ptrveloc.c Fix spelling/wording issues 2020-07-05 13:07:33 -07:00
region.c Fix spelling/wording issues 2020-07-05 13:07:33 -07:00
registry.c Build required portions of registry.c automatically [v2] 2014-09-18 15:29:29 -07:00
resource.c dix: Fix overzealous caching of ResourceClientBits() 2022-07-27 17:09:29 +02:00
selection.c dix: Push UpdateCurrentTimeIf down out of the main loop 2016-05-04 10:58:01 -04:00
stubmain.c Allow DDX to provide a main() 2013-07-23 23:56:58 +01:00
swaprep.c Fix spelling/wording issues 2020-07-05 13:07:33 -07:00
swapreq.c dix: Disallow GenericEvent in SendEvent request. 2017-06-19 11:58:50 +10:00
tables.c Drop trailing whitespaces 2014-11-12 10:25:00 +10:00
touch.c xwayland: add -noTouchPointerEmulation 2021-09-06 21:19:46 +00:00
window.c dix: Skip more code in SetRootClip for ROOT_CLIP_INPUT_ONLY 2022-09-12 10:51:05 +00:00