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