[PATCH libinput 17/24] tablet: Emit axis events on distance/pressure changes
Peter Hutterer
peter.hutterer at who-t.net
Sun Apr 27 22:07:46 PDT 2014
On Mon, Apr 21, 2014 at 07:11:26PM +0200, Carlos Garnacho wrote:
> Those have been made mutually exclusive, to make sure only one or the
> other is notified when there is some uncertainty from the device.
>
> Signed-off-by: Carlos Garnacho <carlosg at gnome.org>
> ---
> src/evdev-tablet.c | 29 +++++++++++++++++++++++++++++
> 1 file changed, 29 insertions(+)
>
> diff --git a/src/evdev-tablet.c b/src/evdev-tablet.c
> index cc55c74..1054f5a 100644
> --- a/src/evdev-tablet.c
> +++ b/src/evdev-tablet.c
> @@ -216,6 +216,23 @@ tablet_process_misc(struct tablet_dispatch *tablet,
> }
>
> static void
> +sanitize_tablet_axes(struct tablet_dispatch *tablet)
> +{
> + struct axis_info *distance, *pressure;
> +
> + distance = tablet_get_axis(tablet, ABS_DISTANCE);
> + pressure = tablet_get_axis(tablet, ABS_PRESSURE);
> +
> + if (distance && pressure && distance->updated && pressure->updated) {
> + /* Keep distance and pressure mutually exclusive */
> + distance->updated = 0;
> + } else if (pressure && pressure->updated &&
> + !tablet_has_status(tablet, TABLET_HAS_CONTACT)) {
> + pressure->updated = 0;
> + }
what about an event where you go to distance 0 and pressure N in the same
SYN_REPORT? You need to check for != 0 on both axes, not just whether they
got updated.
Cheers,
Peter
> +}
> +
> +static void
> tablet_check_notify_tool(struct tablet_dispatch *tablet,
> struct evdev_device *device,
> uint32_t time,
> @@ -360,6 +377,8 @@ tablet_flush(struct tablet_dispatch *tablet,
> tablet_notify_buttons(tablet, device, time, 0);
>
> if (tablet->state.tool != LIBINPUT_TOOL_NONE) {
> + sanitize_tablet_axes(tablet);
> +
> if (tablet_has_status(tablet, TABLET_UPDATED)) {
> /* FIXME: apply hysteresis, calibration */
> x = li_fixed_from_int(device->abs.x);
> @@ -426,6 +445,16 @@ static void
> tablet_init_axes(struct tablet_dispatch *tablet,
> struct evdev_device *device)
> {
> + if (libevdev_has_event_code(device->evdev, EV_ABS, ABS_DISTANCE)) {
> + tablet_add_axis(tablet, device, ABS_DISTANCE,
> + LIBINPUT_POINTER_AXIS_DISTANCE);
> + }
> +
> + if (libevdev_has_event_code(device->evdev, EV_ABS, ABS_PRESSURE)) {
> + tablet_add_axis(tablet, device, ABS_PRESSURE,
> + LIBINPUT_POINTER_AXIS_PRESSURE);
> + }
> +
> if (libevdev_has_event_code(device->evdev, EV_ABS, ABS_TILT_X) &&
> libevdev_has_event_code(device->evdev, EV_ABS, ABS_TILT_Y)) {
> tablet_add_axis(tablet, device, ABS_TILT_X,
> --
> 1.9.0
>
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
>
More information about the wayland-devel
mailing list