/**
@page trackpoints Trackpoints and Pointing Sticks

This page provides an overview of trackpoint handling in libinput, also
refered to as Pointing Stick or Trackstick. The device itself is usually a
round plastic stick between the G, H and B keys with a set of buttons below
the space bar.

@image html button-scrolling.svg "A trackpoint"

libinput always treats the buttons below the space bar as the buttons that
belong to the trackpoint even on the few laptops where the buttons are not
physically wired to the trackpoint device anyway, see @ref t440_support.

Trackpoint devices have @ref button_scrolling enabled by default. This may
interfer with middle-button dragging, if middle-button dragging is required
by a user then button scrolling must be disabled.

@section trackpoint_range Motion range on trackpoints

It is difficult to associate motion on a trackpoint with a physical
reference. Unlike mice or touchpads where the motion can be
measured in mm, the trackpoint only responds to pressure. Without special
equipment it is impossible to measure identical pressure values across
multiple laptops.

The values provided by a trackpoint are motion deltas, usually corresponding
to the pressure applied to the trackstick. For example, pressure towards the
screen on a laptop provides negative y deltas at a fixed rate (e.g. every
10ms). As the pressure increases, the delta increases too. As the pressure
decreases, the delta decreases until it hits the neutral state.

The delta range itself can vary greatly between laptops, some devices send a
maximum delta value of 30, others can go beyond 100. To normalize the motion
trackpoint, libinput uses the available delta range and fits its
acceleration curve into this range. This requires calibration by the user,
see @ref trackpoint_range_measure.

@section trackpoint_range_measure Measuring the trackpoint range

This section describes how to measure the trackpoint range and apply a hwdb
entry to make this range known to libinput. libinput provides the tool
`libinput measure trackpoint-range` for this task. This is an interactive
tool and prints its instructions on the commandline. Example output from
this tool is below:

@code
$ sudo libinput measure trackpoint-range
This tool measures the commonly used pressure range of the
trackpoint. Push the trackpoint:
- Four times around the screen edges
- From the top left to the bottom right and back, twice
- From the top right to the bottom left and back, twice
A minimum of 1000 events for each axis is required

Movements should emulate fast pointer movement on the screen
but not use excessive pressure that would not be used
during day-to-day movement. For best results, run this tool
several times to get an idea of the common range.

Trackpoint sends: max x: 19, max y: 23 samples [121, 121]
@endcode

Once sufficient samples have been collected, the tool prints a simplified
histogram for x and y axis deltas. This histogram should be used to
<b>estimate</b> the appropriate trackpoint range. For example, let's look at
the histogram below:

@code
Histogram for x axis deltas, in counts of 5
 -30:
 -29:
 -28: +
 -27: +
 -26: ++
 -25: ++++
 -24: +++++
 -23: ++
 -22: ++++++
 -21: +++
 -20: ++++
 -19: +++++++
 -18: ++++++++++++
 -17: ++++++++++++
 -16: ++++++++++++
 -15: ++++
 -14: +++++
 -13: +++++
 -12: ++++++
 -11: +++++
 -10: +++
  -9: ++++
  -8: +++++++
  -7: +++++++
  -6: ++++++++++++
  -5: ++++++++++++
  -4: ++++++++++++
  -3: +++++++++
  -2: +++++++++
  -1: ++++++++
   0: +++++++
   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:
@endcode

The 0 delta is the neutral state, each + represents 5 events with that
delta value. Note how the curve is distributed, it's not a classic bell
curve. That can be a factor of the input provided or the firmware-based
pointer acceleration.

Overall, the majority of events appear to be in the 0-25 range with a few
outliers. So the trackpoint range libinput should use for this particular
device would be 25. Note how there is a fair bit of guesswork involved, a
trackpoint's data is never clean enough to get a definitive value. It is
generally better to take a (slightly) smaller range than one too large.

The udev property to set is `LIBINPUT_ATTR_TRACKPOINT_RANGE=25`. See @ref
hwdb_modifying for details on how to apply this property.

*/

