touchpad: tp_current_touch: Fix off by one error

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
evdev: keep the absinfo struct around instead of min/max

We'll need that later for conversion to mm.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
evdev: force a resolution of 1 where no resolution is set

Avoids nasty surprises later when we divide by 0. This matters particularly
when testing a device through uinput, which can't set the resolution.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Change absolute and touch events to use mm as default unit

Instead of device-specific coordinates that the caller can't interpret without
knowing the range anyway, return mm as the default value.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Add a function to get the size of a device

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
evdev: Continue updating axes internally when tool leaves proximity

Axis changes are now still processed by libinput regardless of whether or not
the tool is in proximity, however we refrain from reporting them unless the tool
is in proximity. This stops bad distance events from being reported without
needing a huge mess of conditional statements in sanitize_axes(). The tool is
now counted as back in proximity when a tool update is received instead of when
an axis update is received.

Signed-off-by: Stephen Chandler Paul <thatslyude@gmail.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
evdev: Add tablet_mark_all_axes_changed()

Occasionally all the axes that are valid for a device need to be marked as
updated for the caller's sake.

Signed-off-by: Stephen Chandler Paul <thatslyude@gmail.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
evdev: Update all axes when the tool comes back into proximity

Signed-off-by: Stephen Chandler Paul <thatslyude@gmail.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
test: Add tests for serial numbers on tools

These tests make sure that any tablets with the capability to report a tool's
serial number do so properly, that the tool changes when another tool of the
same type with a different serial number is used, and that libinput doesn't
change the current tool when -1 is reported as the serial number (-1 is used for
special purposes by the linuxwacom driver).

Signed-off-by: Stephen Chandler Paul <thatslyude@gmail.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Merge branch 'master' into tablet-support
tablet: provide x/y by default in mm off the top/left corner

Given that tablets may not have the same x/y resolution, raw or normalized
values are mostly meaningless and likely to be handled the wrong way.
Providing x/y in mm is the only constant, meaningful value.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
tablet: normalize the distance to 0..1

The actual data provided by current tablets is not anywhere close to accurate.
While it'd be nice to have this in mm, this is unlikely to happen anytime
soon. Use the same 0..1 normalized range as pressure has.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
tablet: ignore pad buttons

We've got big plans for handling pad buttons, and the interface will likely
be different for those. Meanwhile, discard any pad button events so no-one can
get too used to them.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Add a couple missing @ref tags

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
tablet: always return 0 for axis values on non-axis events

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
tablet: copy the axis state into the tablet event

If we just keep a ref in the event we may have updated the device state since,
giving the caller the wrong events

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
tablet: add support for relative x/y axes

Wacom tablets have one tool that is always in relative mode (BTN_TOOL_MOUSE)
https://store.wacom.com/us/en/product/KC210/

That tool sports a serial and tool ID as well as supporting ABS_DISTANCE and
rotation. The tool itself doesn't actually send relative events, but it's
pretty useless as absolute device as it has no positioning indicators.

Add a new tablet event type for relative x/y coordinates. All other axes
remain the same.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
tablet: hook up relative axes events

For the BTN_TOOL_MOUSE tool only, all other tools continue to send absolute
x/y positions.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>