[PATCH v2 weston 04/13] tablet: hook up libinput tablet events
Jonas Ådahl
jadahl at gmail.com
Sat Apr 30 09:58:15 UTC 2016
On Wed, Feb 03, 2016 at 03:28:08PM +1000, Peter Hutterer wrote:
> From: Stephen Chandler Paul <thatslyude at gmail.com>
>
> Co-authored-by: Peter Hutterer <peter.hutterer at who-t.net>
> Signed-off-by: Stephen Chandler Paul <thatslyude at gmail.com>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
Reviewed-by: Jonas Ådahl <jadahl at gmail.com> with one nit below.
> ---
> src/libinput-device.c | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 120 insertions(+)
>
> diff --git a/src/libinput-device.c b/src/libinput-device.c
> index be41091..31ce786 100644
> --- a/src/libinput-device.c
> +++ b/src/libinput-device.c
> @@ -429,6 +429,114 @@ handle_tablet_proximity(struct libinput_device *libinput_device,
> notify_tablet_tool_frame(tool, time);
> }
>
> +static void
> +handle_tablet_axis(struct libinput_device *libinput_device,
> + struct libinput_event_tablet_tool *axis_event)
> +{
> + struct evdev_device *device =
> + libinput_device_get_user_data(libinput_device);
> + struct weston_tablet_tool *tool;
> + struct weston_tablet *tablet = device->tablet;
> + struct libinput_tablet_tool *libinput_tool;
> + uint32_t time;
> + const int NORMALIZED_AXIS_MAX = 65535;
> +
> + libinput_tool = libinput_event_tablet_tool_get_tool(axis_event);
> + tool = libinput_tablet_tool_get_user_data(libinput_tool);
> + time = libinput_event_tablet_tool_get_time(axis_event);
> +
> + if (libinput_event_tablet_tool_x_has_changed(axis_event) ||
> + libinput_event_tablet_tool_y_has_changed(axis_event)) {
> + double x, y;
> + uint32_t width, height;
> +
> + width = tablet->output->current_mode->width;
> + height = tablet->output->current_mode->height;
> + x = libinput_event_tablet_tool_get_x_transformed(axis_event,
> + width);
> + y = libinput_event_tablet_tool_get_y_transformed(axis_event,
> + height);
> +
> + notify_tablet_tool_motion(tool, time,
> + wl_fixed_from_double(x),
> + wl_fixed_from_double(y));
> + }
> +
> + if (libinput_event_tablet_tool_pressure_has_changed(axis_event)) {
> + double pressure;
> +
> + pressure = libinput_event_tablet_tool_get_pressure(axis_event);
> + /* convert axis range [0.0, 1.0] to [0, 65535] */
> + pressure *= NORMALIZED_AXIS_MAX;
> + notify_tablet_tool_pressure(tool, time, pressure);
> + }
> +
> + if (libinput_event_tablet_tool_distance_has_changed(axis_event)) {
> + double distance;
> +
> + distance = libinput_event_tablet_tool_get_distance(axis_event);
> + /* convert axis range [0.0, 1.0] to [0, 65535] */
> + distance *= NORMALIZED_AXIS_MAX;
> + notify_tablet_tool_distance(tool, time, distance);
> + }
> +
> + if (libinput_event_tablet_tool_tilt_x_has_changed(axis_event) ||
> + libinput_event_tablet_tool_tilt_y_has_changed(axis_event)) {
> + double tx, ty;
> +
> + tx = libinput_event_tablet_tool_get_tilt_x(axis_event);
> + ty = libinput_event_tablet_tool_get_tilt_y(axis_event);
> + /* convert axis range [-1.0, 1.0] to [-65535, 65535] */
> + tx *= NORMALIZED_AXIS_MAX;
> + ty *= NORMALIZED_AXIS_MAX;
> + notify_tablet_tool_tilt(tool, time, tx, ty);
> + }
> +
> + notify_tablet_tool_frame(tool, time);
> +}
> +
> +static void
> +handle_tablet_tip(struct libinput_device *libinput_device,
> + struct libinput_event_tablet_tool *tip_event)
> +{
> + struct weston_tablet_tool *tool;
> + struct libinput_tablet_tool *libinput_tool;
> + uint32_t time;
> +
> + libinput_tool = libinput_event_tablet_tool_get_tool(tip_event);
> + tool = libinput_tablet_tool_get_user_data(libinput_tool);
> + time = libinput_event_tablet_tool_get_time(tip_event);
> +
> + if (libinput_event_tablet_tool_get_tip_state(tip_event) ==
> + LIBINPUT_TABLET_TOOL_TIP_DOWN)
> + notify_tablet_tool_down(tool, time);
nit: Indentation off.
Jonas
> + else
> + notify_tablet_tool_up(tool, time);
> +}
> +
> +
> +static void
> +handle_tablet_button(struct libinput_device *libinput_device,
> + struct libinput_event_tablet_tool *button_event)
> +{
> + struct weston_tablet_tool *tool;
> + struct libinput_tablet_tool *libinput_tool;
> + uint32_t time, button;
> + enum zwp_tablet_tool_v1_button_state state;
> +
> + libinput_tool = libinput_event_tablet_tool_get_tool(button_event);
> + tool = libinput_tablet_tool_get_user_data(libinput_tool);
> + time = libinput_event_tablet_tool_get_time(button_event);
> + button = libinput_event_tablet_tool_get_button(button_event);
> + if (libinput_event_tablet_tool_get_button_state(button_event) ==
> + LIBINPUT_BUTTON_STATE_PRESSED)
> + state = ZWP_TABLET_TOOL_V1_BUTTON_STATE_PRESSED;
> + else
> + state = ZWP_TABLET_TOOL_V1_BUTTON_STATE_RELEASED;
> +
> + notify_tablet_tool_button(tool, time, button, state);
> +}
> +
> int
> evdev_device_process_event(struct libinput_event *event)
> {
> @@ -482,6 +590,18 @@ evdev_device_process_event(struct libinput_event *event)
> handle_tablet_proximity(libinput_device,
> libinput_event_get_tablet_tool_event(event));
> break;
> + case LIBINPUT_EVENT_TABLET_TOOL_TIP:
> + handle_tablet_tip(libinput_device,
> + libinput_event_get_tablet_tool_event(event));
> + break;
> + case LIBINPUT_EVENT_TABLET_TOOL_AXIS:
> + handle_tablet_axis(libinput_device,
> + libinput_event_get_tablet_tool_event(event));
> + break;
> + case LIBINPUT_EVENT_TABLET_TOOL_BUTTON:
> + handle_tablet_button(libinput_device,
> + libinput_event_get_tablet_tool_event(event));
> + break;
> default:
> handled = 0;
> weston_log("unknown libinput event %d\n",
> --
> 2.5.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