On Thu, 2015-02-26 at 14:33 +1000, Peter Hutterer wrote:
> Providing a relative axis in the axis_get_value() is inconsistent with the
> other axes, this will be fixed in a follow-up commit.
> 
> Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>
> Reviewed-by: Benjamin Tissoires <benjamin.tissoi...@gmail.com>
> ---
> Changes to v1:
> - s/break/continue/ in tablet_check_notify_axes
> - move the mouse wheel test into a separate commit, coming up soon
> 
>  src/evdev-tablet.c     | 56 
> ++++++++++++++++++++++++++++++++++++++++++++++++++
>  src/evdev-tablet.h     | 18 ++++++++++++++++
>  src/libinput-private.h |  2 +-
>  src/libinput.c         |  1 +
>  src/libinput.h         |  4 ++++
>  tools/event-debug.c    | 11 +++++++++-
>  6 files changed, 90 insertions(+), 2 deletions(-)
> 
> diff --git a/src/evdev-tablet.c b/src/evdev-tablet.c
> index db3f176..8de6fc4 100644
> --- a/src/evdev-tablet.c
> +++ b/src/evdev-tablet.c
> @@ -82,6 +82,10 @@ tablet_device_has_axis(struct tablet_dispatch *tablet,
>                           libevdev_has_event_code(evdev,
>                                                   EV_ABS,
>                                                   ABS_TILT_Y));
> +     } else if (axis == LIBINPUT_TABLET_AXIS_REL_WHEEL) {
> +             has_axis = libevdev_has_event_code(evdev,
> +                                                EV_REL,
> +                                                REL_WHEEL);
>       } else {
>               code = axis_to_evcode(axis);
>               has_axis = libevdev_has_event_code(evdev,
> @@ -251,6 +255,15 @@ convert_to_degrees(const struct input_absinfo *absinfo, 
> double offset)
>       return fmod(value * 360.0 + offset, 360.0);
>  }
>  
> +static inline double
> +normalize_wheel(struct tablet_dispatch *tablet,
> +             int value)
> +{
> +     struct evdev_device *device = tablet->device;
> +
> +     return value * device->scroll.wheel_click_angle;
> +}
> +
>  static void
>  tablet_check_notify_axes(struct tablet_dispatch *tablet,
>                        struct evdev_device *device,
> @@ -282,6 +295,11 @@ tablet_check_notify_axes(struct tablet_dispatch *tablet,
>                       axes[LIBINPUT_TABLET_AXIS_TILT_Y] = 0;
>                       axes[a] = tablet->axes[a];
>                       continue;
> +             } else if (a == LIBINPUT_TABLET_AXIS_REL_WHEEL) {
> +                     tablet->axes[a] = normalize_wheel(tablet,
> +                                                       tablet->deltas[a]);
> +                     axes[a] = tablet->axes[a];
> +                     continue;
>               }
>  
>               absinfo = libevdev_get_abs_info(device->evdev,
> @@ -442,6 +460,35 @@ tablet_process_key(struct tablet_dispatch *tablet,
>  }
>  
>  static void
> +tablet_process_relative(struct tablet_dispatch *tablet,
> +                     struct evdev_device *device,
> +                     struct input_event *e,
> +                     uint32_t time)
> +{
> +     enum libinput_tablet_axis axis;
> +     switch (e->code) {
Missing some whitespace here :)

Cheers,
        Lyude

> +     case REL_WHEEL:
> +             axis = rel_evcode_to_axis(e->code);
> +             if (axis == LIBINPUT_TABLET_AXIS_NONE) {
> +                     log_bug_libinput(device->base.seat->libinput,
> +                                      "Invalid ABS event code %#x\n",
> +                                      e->code);
> +                     break;
> +             }
> +             set_bit(tablet->changed_axes, axis);
> +             tablet->deltas[axis] = -1 * e->value;
> +             tablet_set_status(tablet, TABLET_AXES_UPDATED);
> +             break;
> +     default:
> +             log_info(tablet->device->base.seat->libinput,
> +                      "Unhandled relative axis %s (%#x)\n",
> +                      libevdev_event_code_get_name(EV_REL, e->code),
> +                      e->code);
> +             return;
> +     }
> +}
> +
> +static void
>  tablet_process_misc(struct tablet_dispatch *tablet,
>                   struct evdev_device *device,
>                   struct input_event *e,
> @@ -536,6 +583,11 @@ tool_set_bits_from_libwacom(const struct tablet_dispatch 
> *tablet,
>               break;
>       case WSTYLUS_PUCK:
>               copy_axis_cap(tablet, tool, LIBINPUT_TABLET_AXIS_ROTATION_Z);
> +             /* lens cursors don't have a wheel */
> +             if (!libwacom_stylus_has_lens(s))
> +                     copy_axis_cap(tablet,
> +                                   tool,
> +                                   LIBINPUT_TABLET_AXIS_REL_WHEEL);
>               break;
>       default:
>               break;
> @@ -579,6 +631,7 @@ tool_set_bits(const struct tablet_dispatch *tablet,
>       case LIBINPUT_TOOL_MOUSE:
>       case LIBINPUT_TOOL_LENS:
>               copy_axis_cap(tablet, tool, LIBINPUT_TABLET_AXIS_ROTATION_Z);
> +             copy_axis_cap(tablet, tool, LIBINPUT_TABLET_AXIS_REL_WHEEL);
>               break;
>       default:
>               break;
> @@ -826,6 +879,9 @@ tablet_process(struct evdev_dispatch *dispatch,
>       case EV_ABS:
>               tablet_process_absolute(tablet, device, e, time);
>               break;
> +     case EV_REL:
> +             tablet_process_relative(tablet, device, e, time);
> +             break;
>       case EV_KEY:
>               tablet_process_key(tablet, device, e, time);
>               break;
> diff --git a/src/evdev-tablet.h b/src/evdev-tablet.h
> index 7c472cf..ea103b0 100644
> --- a/src/evdev-tablet.h
> +++ b/src/evdev-tablet.h
> @@ -50,6 +50,7 @@ struct tablet_dispatch {
>       unsigned char status;
>       unsigned char changed_axes[NCHARS(LIBINPUT_TABLET_AXIS_MAX + 1)];
>       double axes[LIBINPUT_TABLET_AXIS_MAX + 1];
> +     double deltas[LIBINPUT_TABLET_AXIS_MAX + 1];
>       unsigned char axis_caps[NCHARS(LIBINPUT_TABLET_AXIS_MAX + 1)];
>  
>       /* Only used for tablets that don't report serial numbers */
> @@ -101,6 +102,23 @@ evcode_to_axis(const uint32_t evcode)
>       return axis;
>  }
>  
> +static inline enum libinput_tablet_axis
> +rel_evcode_to_axis(const uint32_t evcode)
> +{
> +     enum libinput_tablet_axis axis;
> +
> +     switch (evcode) {
> +     case REL_WHEEL:
> +             axis = LIBINPUT_TABLET_AXIS_REL_WHEEL;
> +             break;
> +     default:
> +             axis = LIBINPUT_TABLET_AXIS_NONE;
> +             break;
> +     }
> +
> +     return axis;
> +}
> +
>  static inline uint32_t
>  axis_to_evcode(const enum libinput_tablet_axis axis)
>  {
> diff --git a/src/libinput-private.h b/src/libinput-private.h
> index 84e5aaa..071204e 100644
> --- a/src/libinput-private.h
> +++ b/src/libinput-private.h
> @@ -30,7 +30,7 @@
>  #include "libinput.h"
>  #include "libinput-util.h"
>  
> -#define LIBINPUT_TABLET_AXIS_MAX LIBINPUT_TABLET_AXIS_SLIDER
> +#define LIBINPUT_TABLET_AXIS_MAX LIBINPUT_TABLET_AXIS_REL_WHEEL
>  
>  struct libinput_source;
>  
> diff --git a/src/libinput.c b/src/libinput.c
> index 9df3d48..2640321 100644
> --- a/src/libinput.c
> +++ b/src/libinput.c
> @@ -586,6 +586,7 @@ libinput_event_tablet_get_axis_value(struct 
> libinput_event_tablet *event,
>               case LIBINPUT_TABLET_AXIS_TILT_Y:
>               case LIBINPUT_TABLET_AXIS_ROTATION_Z:
>               case LIBINPUT_TABLET_AXIS_SLIDER:
> +             case LIBINPUT_TABLET_AXIS_REL_WHEEL:
>                       return event->axes[axis];
>               default:
>                       return 0;
> diff --git a/src/libinput.h b/src/libinput.h
> index 87d220b..5737873 100644
> --- a/src/libinput.h
> +++ b/src/libinput.h
> @@ -144,6 +144,7 @@ enum libinput_tablet_axis {
>       LIBINPUT_TABLET_AXIS_TILT_Y = 6,
>       LIBINPUT_TABLET_AXIS_ROTATION_Z = 7,
>       LIBINPUT_TABLET_AXIS_SLIDER = 8,
> +     LIBINPUT_TABLET_AXIS_REL_WHEEL = 9,
>  };
>  
>  /**
> @@ -1060,6 +1061,9 @@ libinput_event_tablet_axis_has_changed(struct 
> libinput_event_tablet *event,
>   *   position is with the buttons pointing up.
>   * - @ref LIBINPUT_TABLET_AXIS_SLIDER - A slider on the tool, normalized
>   *   from 0 to 1. e.g. the wheel-like tool on the Wacom Airbrush.
> + * - @ref LIBINPUT_TABLET_AXIS_REL_WHEEL - A relative wheel on the tool,
> + *   similar or equivalent to a mouse wheel. The value is a delta from the
> + *   device's previous position, in degrees.
>   *
>   * @note This function may be called for a specific axis even if
>   * libinput_event_tablet_axis_has_changed() returns 0 for that axis.
> diff --git a/tools/event-debug.c b/tools/event-debug.c
> index 94a90ec..09edac0 100644
> --- a/tools/event-debug.c
> +++ b/tools/event-debug.c
> @@ -293,7 +293,7 @@ print_tablet_axes(struct libinput_event_tablet *t)
>       struct libinput_tool *tool = libinput_event_tablet_get_tool(t);
>       double x, y;
>       double dist, pressure;
> -     double rotation, slider;
> +     double rotation, slider, wheel;
>  
>       x = libinput_event_tablet_get_axis_value(t, LIBINPUT_TABLET_AXIS_X);
>       y = libinput_event_tablet_get_axis_value(t, LIBINPUT_TABLET_AXIS_Y);
> @@ -350,6 +350,15 @@ print_tablet_axes(struct libinput_event_tablet *t)
>                      tablet_axis_changed_sym(t,
>                                      LIBINPUT_TABLET_AXIS_SLIDER));
>       }
> +
> +     if (libinput_tool_has_axis(tool, LIBINPUT_TABLET_AXIS_REL_WHEEL)) {
> +             wheel = libinput_event_tablet_get_axis_value(t,
> +                                     LIBINPUT_TABLET_AXIS_REL_WHEEL);
> +             printf("\twheel: %.2f%s",
> +                    wheel,
> +                    tablet_axis_changed_sym(t,
> +                                    LIBINPUT_TABLET_AXIS_REL_WHEEL));
> +     }
>  }
>  
>  static void


_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to