summaryrefslogtreecommitdiff
path: root/doc/pointer-acceleration.dox
blob: f6237c6b9f91df5aa8933b540aba0c75b4310008 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/**
@page pointer-acceleration  Pointer acceleration

libinput uses device-specific pointer acceleration methods, with the default
being the @ref ptraccel-linear. The methods share common properties, such as
@ref ptraccel-velocity.

This page explains the high-level concepts used in the code. It aims to
provide an overview for developers and is not necessarily useful for
users.

@section ptraccel-profiles Pointer acceleration profiles

The profile decides the general method of pointer acceleration.
libinput currently supports two profiles: "adaptive" and "flat". The aptive
profile is the default profile for all devices and takes the current speed
of the device into account when deciding on acceleration. The flat profile
is simply a constant factor applied to all device deltas, regardless of the
speed of motion (see @ref ptraccel-profile-flat). Most of this document
describes the adaptive pointer acceleration.

@section ptraccel-velocity Velocity calculation

The device's speed of movement is measured across multiple input events
through so-called "trackers". Each event prepends a the tracker item, each
subsequent tracker contains the delta of that item to the current position,
the timestamp of the event that created it and the cardinal direction of the
movement at the time. If a device moves into the same direction, the
velocity is calculated across multiple trackers. For example, if a device
moves steadily for 10 events to the left, the velocity is calculated across
all 10 events.

Whenever the movement changes direction or significantly changes speed, the
velocity is calculated from the direction/speed change only. For example, if
a device moves steadily for 8 events to the left and then 2 events to the
right, the velocity is only that of the last 2 events.

An extra time limit prevents events that are too old to factor into the
velocity calculation. For example, if a device moves steadily for 5 events
to the left, then pauses, then moves again for 5 events to the left, only
the last 5 events are used for velocity calculation.

The velocity is then used to calculate the acceleration factor

@section ptraccel-factor Acceleration factor

The acceleration factor is the final outcome of the pointer acceleration
calculations. It is a unitless factor that is applied to the current delta,
a factor of 2 doubles the delta (i.e. speeds up the movement), a factor of
less than 1 reduces the delta (i.e. slows the movement).

Any factor less than 1 requires the user to move the device further to move
the visible pointer. This is called deceleration and enables high precision
target selection through subpixel movements. libinput's current maximum
deceleration factor is 0.3 (i.e. slow down to 30% of the pointer speed).

A factor higher than 1 moves the pointer further than the physical device
moves. This is acceleration and allows a user to cross the screen quickly
but effectively skips pixels. libinput's current maximum acceleration factor
is 3.5.

@section ptraccel-linear Linear pointer acceleration

The linear pointer acceleration method is the default for most pointer
devices. It provides deceleration at very slow movements, a 1:1 mapping for
regular movements and a linear increase to the maximum acceleration factor
for fast movements.

Linear pointer acceleration applies to devices with above 1000dpi resolution
and after @ref motion_normalization is applied.

@image html ptraccel-linear.svg "Linear pointer acceleration"

The image above shows the linear pointer acceleration settings at various
speeds. The line for 0.0 is the default acceleration curve, speed settings
above 0.0 accelerate sooner, faster and to a higher maximum acceleration.
Speed settings below 0 delay when acceleration kicks in, how soon the
maximum acceleration is reached and the maximum acceleration factor.

Extremely low speed settings provide no acceleration and additionally
decelerate all movement by a constant factor.

@section ptraccel-low-dpi Pointer acceleration for low-dpi devices

Low-dpi devices are those with a physical resolution of less than 1000 dots
per inch (dpi). The pointer acceleration is adjusted to provide roughly the
same feel for all devices at normal to high speeds. At slow speeds, the
pointer acceleration works on device-units rather than normalized
coordinates (see @ref motion_normalization).

@image html ptraccel-low-dpi.svg "Pointer acceleration for low-dpi devices"

The image above shows the default pointer acceleration curve for a speed of
0.0 at different DPI settings. A device with low DPI has the acceleration
applied sooner and with a stronger acceleration factor.

@section ptraccel-touchpad Pointer acceleration on touchpads

Touchpad pointer acceleration uses the same approach as the @ref
ptraccel-linear profile, with a constant deceleration factor applied. The
user expectation of how much a pointer should move in response to finger
movement is different to that of a mouse device, hence the constant
deceleration factor.

@image html ptraccel-touchpad.svg "Pointer acceleration curve for touchpads"

The image above shows the touchpad acceleration profile in comparison to the
@ref ptraccel-linear. The shape of the curve is identical but vertically squashed.

@section ptraccel-trackpoint Pointer acceleration on trackpoints

Trackpoint hardware is quite varied in how it reacts to user pressure and
unlike other devices it cannot easily be normalized for physical properties.
Measuring pressure objectively across a variety of hardware is nontrivial.
libinput relies on some sytem-wide configured properties, specifically the
@ref udev_config. The two properties that influence trackpoint acceleration
````POINTINGSTICK_CONST_ACCEL```` which is a constant factor applied to the
trackpoint's motion data. For example, a factor of 3 will see all input data
multipled by 3. This multiplication is done by libinput.

Additionally, some trackpoints provide the ability to adjust the sensitivity in
hardware by modifying a sysfs file on the serio node. The udev property
````POINTINGSTICK_SENSITIVITY```` indicates the desired value, a udev
builtin is expected to apply this to the device, i.e.  libinput does not
handle this property. Once applied, the sensitivity adjusts the deltas
coming out of the hardware.

Trackpoint pointer acceleration uses the @ref ptraccel-low-dpi profile, with a
constant acceleration factor taking the place of the DPI settings.

@image html ptraccel-trackpoint.svg "Pointer acceleration curves for trackpoints"

The image above shows the trackpoint acceleration profile in comparison to the
@ref ptraccel-linear.

The constant acceleration factor, usually applied in
@ref udev_config, shapes the acceleration profile and is pre-applied before
any user-specific acceleration adjustments.

@section ptraccel-profile-flat The flat pointer acceleration profile

In a flat profile, the acceleration factor is constant regardless of the
velocity of the pointer and each delta (dx, dy) results in an accelerated delta
(dx * factor, dy * factor). This provides 1:1 movement between the device
and the pointer on-screen.

@section ptraccel-tablet Pointer acceleration on tablets

Pointer acceleration for relative motion on tablet devices is a flat
acceleration, with the speed seeting slowing down or speeding up the pointer
motion by a constant factor. Tablets do not allow for switchable profiles.

*/