2015-03-05 14:14:07 +10:00
|
|
|
/**
|
|
|
|
|
@page tablet-support Tablet support
|
|
|
|
|
|
|
|
|
|
This page provides details about the graphics tablet
|
|
|
|
|
support in libinput. Note that the term "tablet" in libinput refers to
|
|
|
|
|
graphics tablets only (e.g. Wacom Intuos), not to tablet devices like the
|
|
|
|
|
Apple iPad.
|
|
|
|
|
|
2015-11-16 16:36:05 +10:00
|
|
|
@image html tablet.svg "Illustration of a graphics tablet"
|
|
|
|
|
|
|
|
|
|
@section tablet-tools Tablet buttons vs. tablet tools
|
|
|
|
|
|
|
|
|
|
Most tablets provide two types of devices. The pysical tablet often provides
|
|
|
|
|
a number of buttons and a touch ring or strip. Interaction on the drawing
|
|
|
|
|
surface of the tablet requires a tool, usually in the shape of a stylus.
|
|
|
|
|
The libinput interface exposed by devices with the @ref
|
|
|
|
|
LIBINPUT_DEVICE_CAP_TABLET_TOOL applies only to events generated by tools.
|
|
|
|
|
|
2016-01-05 13:19:56 +10:00
|
|
|
Touch events on the tablet integrated into a screen itself are exposed
|
|
|
|
|
through the @ref LIBINPUT_DEVICE_CAP_TOUCH capability. Touch events on a
|
|
|
|
|
standalone tablet are exposed through the @ref LIBINPUT_DEVICE_CAP_POINTER
|
|
|
|
|
capability. In both cases, the kernel usually provides a separate event
|
|
|
|
|
node for the touch device, resulting in a separate libinput device.
|
|
|
|
|
See libinput_device_get_device_group() for information on how to associate
|
|
|
|
|
the touch part with other devices exposed by the same physical hardware.
|
2015-11-16 16:36:05 +10:00
|
|
|
|
|
|
|
|
@section tablet-tip Tool tip events vs. button events
|
|
|
|
|
|
|
|
|
|
The primary use of a tablet tool is to draw on the surface of the tablet.
|
|
|
|
|
When the tool tip comes into contact with the surface, libinput sends an
|
|
|
|
|
event of type @ref LIBINPUT_EVENT_TABLET_TOOL_TIP, and again when the tip
|
|
|
|
|
ceases contact with the surface.
|
|
|
|
|
|
|
|
|
|
Tablet tools may send button events; these are exclusively for extra buttons
|
2016-01-05 13:19:56 +10:00
|
|
|
unrelated to the tip. A button event is independent of the tip and can while
|
|
|
|
|
the tip is down or up.
|
2015-11-16 16:36:05 +10:00
|
|
|
|
|
|
|
|
@section tablet-axes Special axes on tablet tools
|
|
|
|
|
|
|
|
|
|
A tablet tool usually provides additional information beyond x/y positional
|
|
|
|
|
information and the tip state. A tool may provide the distance to the tablet
|
|
|
|
|
surface and the pressure exerted on the tip when in contact. Some tablets
|
|
|
|
|
additionally provide tilt information along the x and y axis.
|
|
|
|
|
|
|
|
|
|
@image html tablet-axes.svg "Illustration of the distance, pressure and tilt axes"
|
|
|
|
|
|
|
|
|
|
The granularity and precision of these axes varies between tablet devices
|
|
|
|
|
and cannot usually be mapped into a physical unit.
|
2016-01-05 13:19:56 +10:00
|
|
|
libinput normalizes distance and pressure into the [0, 1] range and the tilt
|
|
|
|
|
axes into the [-1, 1] range with 0 as the neutral point.
|
2015-11-16 16:36:05 +10:00
|
|
|
|
|
|
|
|
While the normalization range is identical for these axes, a caller should
|
2016-01-05 13:19:56 +10:00
|
|
|
not interpret identical values as identical across axes, i.e. a value v1 on
|
|
|
|
|
the distance axis has no relation to the same value v1 on the pressure axis.
|
2015-11-16 16:36:05 +10:00
|
|
|
|
|
|
|
|
@section tablet-fake-proximity Handling of proximity events
|
2015-03-05 14:14:07 +10:00
|
|
|
|
2016-01-05 13:19:56 +10:00
|
|
|
libinput's @ref LIBINPUT_EVENT_TABLET_TOOL_PROXIMITY events notify a caller
|
|
|
|
|
when a tool comes into sensor range or leaves the sensor range. On some
|
|
|
|
|
tools this range does not represent the physical range but a reduced
|
|
|
|
|
tool-specific logical range. If the range is reduced, this is done
|
|
|
|
|
transparent to the caller.
|
|
|
|
|
|
|
|
|
|
For example, the Wacom mouse and lens cursor tools are usually
|
|
|
|
|
used in relative mode, lying flat on the tablet. Movement typically follows
|
|
|
|
|
the interaction normal mouse movements have, i.e. slightly lift the tool and
|
|
|
|
|
place it in a separate location. The proximity detection on Wacom
|
|
|
|
|
tablets however extends further than the user may lift the mouse, i.e. the
|
2016-01-05 13:33:51 +10:00
|
|
|
tool may not be lifted out of physical proximity. For such tools, libinput
|
|
|
|
|
provides software-emulated proximity.
|
2015-03-05 14:14:07 +10:00
|
|
|
|
2015-12-01 11:07:57 +10:00
|
|
|
@section tablet-pressure-offset Pressure offset on worn-out tools
|
|
|
|
|
|
|
|
|
|
When a tool is used for an extended period it can wear down physically. A
|
|
|
|
|
worn-down tool may never return a zero pressure value. Even when hovering
|
|
|
|
|
above the surface, the pressure value returned by the tool is nonzero,
|
|
|
|
|
creating a fake surface touch and making interaction with the tablet less
|
|
|
|
|
predictable.
|
|
|
|
|
|
|
|
|
|
libinput automatically detects pressure offsets and rescales the remaining
|
|
|
|
|
pressure range into the available range, making pressure-offsets transparent
|
|
|
|
|
to the caller. A tool with a pressure offset will thus send a 0 pressure
|
|
|
|
|
value for the detected offset and nonzero pressure values for values higher
|
|
|
|
|
than that offset.
|
|
|
|
|
|
|
|
|
|
Some limitations apply to avoid misdetection of pressure offsets,
|
|
|
|
|
specifically:
|
|
|
|
|
- pressure offset is only detected on proximity in, and if a device is
|
|
|
|
|
capable of detection distances,
|
|
|
|
|
- pressure offset is only detected if the distance between the tool and the
|
|
|
|
|
tablet is high enough,
|
|
|
|
|
- pressure offset is only used if it is 20% or less of the pressure range
|
|
|
|
|
available to the tool. A pressure offset higher than 20% indicates either
|
|
|
|
|
a misdetection or a tool that should be replaced, and
|
|
|
|
|
- if a pressure value less than the current pressure offset is seen, the
|
|
|
|
|
offset resets to that value.
|
|
|
|
|
|
|
|
|
|
Pressure offsets are not detected on @ref LIBINPUT_TABLET_TOOL_TYPE_MOUSE
|
|
|
|
|
and @ref LIBINPUT_TABLET_TOOL_TYPE_LENS tools.
|
|
|
|
|
|
2015-12-15 08:29:00 +10:00
|
|
|
@section tablet-serial-numbers Tracking unique tools
|
|
|
|
|
|
|
|
|
|
Some tools provide hardware information that enables libinput to uniquely
|
|
|
|
|
identify the physical device. For example, tools compatible with the Wacom
|
|
|
|
|
Intuos 4, Intuos 5, Intuos Pro and Cintiq series are uniquely identifiable
|
2015-12-15 12:39:52 +10:00
|
|
|
through a serial number. libinput does not specify how a tool can be
|
|
|
|
|
identified uniquely, a caller should use libinput_tablet_tool_is_unique() to
|
|
|
|
|
check if the tool is unique.
|
2015-12-15 08:29:00 +10:00
|
|
|
|
|
|
|
|
libinput creates a struct libinput_tablet_tool on the first proximity in of
|
|
|
|
|
this tool. By default, this struct is destroyed on proximity out and
|
|
|
|
|
re-initialized on the next proximity in. If a caller keeps a reference to
|
|
|
|
|
the tool by using libinput_tablet_tool_ref() libinput re-uses this struct
|
|
|
|
|
whenever that same physical tool comes into proximity on any tablet
|
|
|
|
|
recognized by libinput. It is possible to attach tool-specific virtual state
|
|
|
|
|
to the tool. For example, a graphics program such as the GIMP may assign a
|
|
|
|
|
specific color to each tool, allowing the artist to use the tools like
|
|
|
|
|
physical pens of different color. In multi-tablet setups it is also
|
|
|
|
|
possible to track the tool across devices.
|
|
|
|
|
|
|
|
|
|
If the tool does not have a unique identifier, libinput creates a single
|
|
|
|
|
struct libinput_tablet_tool per tool type on each tablet the tool is used
|
|
|
|
|
on.
|
|
|
|
|
|
2016-01-05 13:19:56 +10:00
|
|
|
@section tablet-tool-types Vendor-specific tablet tool types
|
|
|
|
|
|
|
|
|
|
libinput supports a number of high-level tool types that describe the
|
|
|
|
|
general interaction expected with the tool. For example, a user would expect
|
|
|
|
|
a tool of type @ref LIBINPUT_TABLET_TOOL_TYPE_PEN to interact with a
|
|
|
|
|
graphics application taking pressure and tilt into account. The default
|
|
|
|
|
virtual tool assigned should be a drawing tool, e.g. a virtual pen or brush.
|
|
|
|
|
A tool of type @ref LIBINPUT_TABLET_TOOL_TYPE_ERASER would normally be
|
|
|
|
|
mapped to an eraser-like virtual tool. See @ref libinput_tablet_tool_type
|
|
|
|
|
for the list of all available tools.
|
|
|
|
|
|
|
|
|
|
Vendors may provide more fine-grained information about the tool in use by
|
|
|
|
|
adding a hardware-specific tool ID. libinput provides this ID to the caller
|
|
|
|
|
with libinput_tablet_tool_get_tool_id() but makes no promises about the
|
|
|
|
|
content or format of the ID.
|
|
|
|
|
|
|
|
|
|
libinput currently supports Wacom-style tool IDs as provided on the Wacom
|
|
|
|
|
Intuos 3, 4, 5, Wacon Cintiq and Wacom Intuos Pro series. The tool ID can
|
|
|
|
|
be used to distinguish between e.g. a Wacom Classic Pen or a Wacom Pro Pen.
|
|
|
|
|
It is the caller's responsibility to interpret the tool ID.
|
|
|
|
|
|
2015-03-05 14:14:07 +10:00
|
|
|
*/
|