[PATCH libinput 02/23] evdev: Add basic support for tablet devices
Hans de Goede
hdegoede at redhat.com
Mon Jun 16 03:15:07 PDT 2014
Hi,
On 06/13/2014 05:28 AM, Stephen Chandler Paul wrote:
> These devices set the LIBINPUT_DEVICE_CAP_STYLUS flag, and emit a lot more axis
> information then mice and touchpads. As such, tablet events are in a whole new
> group of events that is separate from everything else.
>
> In this commit, only X and Y axes are reported in libinput.
>
> Based off the patch originally written by Carlos Garnacho
>
> Signed-off-by: Stephen Chandler Paul <thatslyude at gmail.com>
> ---
> src/Makefile.am | 2 +
> src/evdev-tablet.c | 170 +++++++++++++++++++++++++++++++++++++++++++++++++
> src/evdev-tablet.h | 64 +++++++++++++++++++
> src/evdev.c | 8 +++
> src/evdev.h | 3 +
> src/libinput-private.h | 6 ++
> src/libinput-util.h | 2 +
> src/libinput.c | 108 +++++++++++++++++++++++++++++++
> src/libinput.h | 121 ++++++++++++++++++++++++++++++++++-
> 9 files changed, 483 insertions(+), 1 deletion(-)
> create mode 100644 src/evdev-tablet.c
> create mode 100644 src/evdev-tablet.h
>
> diff --git a/src/Makefile.am b/src/Makefile.am
> index bf56184..b880a69 100644
> --- a/src/Makefile.am
> +++ b/src/Makefile.am
> @@ -11,6 +11,8 @@ libinput_la_SOURCES = \
> libinput-util.h \
> evdev.c \
> evdev.h \
> + evdev-tablet.c \
> + evdev-tablet.h \
> evdev-mt-touchpad.c \
> evdev-mt-touchpad.h \
> evdev-mt-touchpad-tap.c \
> diff --git a/src/evdev-tablet.c b/src/evdev-tablet.c
> new file mode 100644
> index 0000000..5c73bcb
> --- /dev/null
> +++ b/src/evdev-tablet.c
> @@ -0,0 +1,170 @@
> +/*
> + * Copyright © 2014 Red Hat, Inc.
> + * Copyright © 2014 Stephen Chandler "Lyude" Paul
> + *
> + * Permission to use, copy, modify, distribute, and sell this software and
> + * its documentation for any purpose is hereby granted without fee, provided
> + * that the above copyright notice appear in all copies and that both that
> + * copyright notice and this permission notice appear in supporting
> + * documentation, and that the name of the copyright holders not be used in
> + * advertising or publicity pertaining to distribution of the software
> + * without specific, written prior permission. The copyright holders make
> + * no representations about the suitability of this software for any
> + * purpose. It is provided "as is" without express or implied warranty.
> + *
> + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
> + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
> + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
> + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
> + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
> + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
> + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> + */
> +#include "config.h"
> +#include "evdev-tablet.h"
> +
> +#include <assert.h>
> +#include <math.h>
> +#include <stdbool.h>
> +#include <string.h>
> +
> +#define tablet_set_status(tablet_,s_) (tablet_->status |= (s_))
> +#define tablet_unset_status(tablet_,s_) (tablet_->status &= ~(s_))
> +#define tablet_has_status(tablet_,s_) (!!(tablet_->status & s_))
> +
> +static void
> +tablet_process_absolute(struct tablet_dispatch *tablet,
> + struct evdev_device *device,
> + struct input_event *e,
> + uint32_t time)
> +{
> + enum libinput_tablet_axis axis;
> +
> + switch (e->code) {
> + case ABS_X:
> + case ABS_Y:
> + axis = evcode_to_axis(e->code);
> + if (axis == LIBINPUT_TABLET_AXIS_NONE) {
> + log_bug_libinput("Invalid ABS event code %#x\n",
> + e->code);
> + break;
> + }
> +
> + tablet->absinfo[axis] = libevdev_get_abs_info(device->evdev,
> + e->code);
> +
> + set_bit(tablet->changed_axes, axis);
> + tablet_set_status(tablet, TABLET_AXES_UPDATED);
> + break;
> + default:
> + log_info("Unhandled ABS event code %#x\n", e->code);
> + break;
> + }
> +}
> +
> +static void
> +tablet_notify_axes(struct tablet_dispatch *tablet,
> + struct evdev_device *device,
> + uint32_t time)
> +{
> + struct libinput_device *base = &device->base;
> + bool axis_update_needed = false;
> + int a;
> +
> + for (a = 0; a < LIBINPUT_TABLET_AXIS_CNT; a++) {
> + if (!bit_is_set(tablet->changed_axes, a))
> + continue;
> +
> + switch (a) {
> + case LIBINPUT_TABLET_AXIS_X:
> + case LIBINPUT_TABLET_AXIS_Y:
> + tablet->axes[a] = tablet->absinfo[a]->value;
> + break;
> + default:
> + log_bug_libinput("Invalid axis update: %d\n", a);
> + break;
> + }
> +
> + axis_update_needed = true;
> + }
> +
> + if (axis_update_needed) {
> + tablet_notify_axis(base, time, tablet->changed_axes, tablet->axes);
This looks like this function is recursing into itself, it took me 3 times
reading the code to see this is tablet_notify_axes vs tablet_notify_axis
1 letter difference in the name really is not enough, please rename one of the
functions to make the name more unique.
With that fixed this patch is:
Reviewed-by: Hans de Goede <hdegoede at redhat.com>
Regards,
Hans
> + memset(tablet->changed_axes, 0, sizeof(tablet->changed_axes));
> + }
> +}
> +
> +static void
> +tablet_flush(struct tablet_dispatch *tablet,
> + struct evdev_device *device,
> + uint32_t time)
> +{
> + if (tablet_has_status(tablet, TABLET_AXES_UPDATED)) {
> + tablet_notify_axes(tablet, device, time);
> + tablet_unset_status(tablet, TABLET_AXES_UPDATED);
> + }
> +}
> +
> +static void
> +tablet_process(struct evdev_dispatch *dispatch,
> + struct evdev_device *device,
> + struct input_event *e,
> + uint64_t time)
> +{
> + struct tablet_dispatch *tablet =
> + (struct tablet_dispatch *)dispatch;
> +
> + switch (e->type) {
> + case EV_ABS:
> + tablet_process_absolute(tablet, device, e, time);
> + break;
> + case EV_SYN:
> + tablet_flush(tablet, device, time);
> + break;
> + default:
> + log_error("Unexpected event type %#x\n", e->type);
> + break;
> + }
> +}
> +
> +static void
> +tablet_destroy(struct evdev_dispatch *dispatch)
> +{
> + struct tablet_dispatch *tablet =
> + (struct tablet_dispatch*)dispatch;
> +
> + free(tablet);
> +}
> +
> +static struct evdev_dispatch_interface tablet_interface = {
> + tablet_process,
> + tablet_destroy
> +};
> +
> +static int
> +tablet_init(struct tablet_dispatch *tablet,
> + struct evdev_device *device)
> +{
> + tablet->base.interface = &tablet_interface;
> + tablet->device = device;
> + tablet->status = TABLET_NONE;
> +
> + return 0;
> +}
> +
> +struct evdev_dispatch *
> +evdev_tablet_create(struct evdev_device *device)
> +{
> + struct tablet_dispatch *tablet;
> +
> + tablet = zalloc(sizeof *tablet);
> + if (!tablet)
> + return NULL;
> +
> + if (tablet_init(tablet, device) != 0) {
> + tablet_destroy(&tablet->base);
> + return NULL;
> + }
> +
> + return &tablet->base;
> +}
> diff --git a/src/evdev-tablet.h b/src/evdev-tablet.h
> new file mode 100644
> index 0000000..d832c17
> --- /dev/null
> +++ b/src/evdev-tablet.h
> @@ -0,0 +1,64 @@
> +/*
> + * Copyright © 2014 Red Hat, Inc.
> + * Copyright © 2014 Stephen Chandler "Lyude" Paul
> + *
> + * Permission to use, copy, modify, distribute, and sell this software and
> + * its documentation for any purpose is hereby granted without fee, provided
> + * that the above copyright notice appear in all copies and that both that
> + * copyright notice and this permission notice appear in supporting
> + * documentation, and that the name of the copyright holders not be used in
> + * advertising or publicity pertaining to distribution of the software
> + * without specific, written prior permission. The copyright holders make
> + * no representations about the suitability of this software for any
> + * purpose. It is provided "as is" without express or implied warranty.
> + *
> + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
> + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
> + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
> + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
> + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
> + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
> + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> + */
> +
> +
> +#ifndef EVDEV_TABLET_H
> +#define EVDEV_TABLET_H
> +
> +#include "evdev.h"
> +
> +enum tablet_status {
> + TABLET_NONE = 0,
> + TABLET_AXES_UPDATED = 1 << 0
> +};
> +
> +struct tablet_dispatch {
> + struct evdev_dispatch base;
> + struct evdev_device *device;
> + unsigned char status;
> + unsigned char changed_axes[NCHARS(LIBINPUT_TABLET_AXIS_CNT)];
> + const struct input_absinfo *absinfo[LIBINPUT_TABLET_AXIS_CNT];
> + double axes[LIBINPUT_TABLET_AXIS_CNT];
> +};
> +
> +static inline enum libinput_tablet_axis
> +evcode_to_axis(const uint32_t evcode)
> +{
> + enum libinput_tablet_axis axis;
> +
> + switch (evcode) {
> + case ABS_X:
> + axis = LIBINPUT_TABLET_AXIS_X;
> + break;
> + case ABS_Y:
> + axis = LIBINPUT_TABLET_AXIS_Y;
> + break;
> + default:
> + axis = LIBINPUT_TABLET_AXIS_NONE;
> + break;
> + }
> +
> + return axis;
> +}
> +
> +#endif
> diff --git a/src/evdev.c b/src/evdev.c
> index 03f52e4..597977c 100644
> --- a/src/evdev.c
> +++ b/src/evdev.c
> @@ -672,7 +672,15 @@ evdev_configure_device(struct evdev_device *device)
> device->dispatch = evdev_mt_touchpad_create(device);
> log_info("input device '%s', %s is a touchpad\n",
> device->devname, device->devnode);
> + } else if (!libevdev_has_event_code(device->evdev, EV_KEY, BTN_TOOL_FINGER) &&
> + libevdev_has_event_code(device->evdev, EV_KEY, BTN_TOOL_PEN) &&
> + has_abs) {
> + device->dispatch = evdev_tablet_create(device);
> + device->seat_caps |= EVDEV_DEVICE_TABLET;
> + log_info("input device '%s', %s is a tablet\n",
> + device->devname, device->devnode);
> }
> +
> for (i = KEY_ESC; i < KEY_MAX; i++) {
> if (i >= BTN_MISC && i < KEY_OK)
> continue;
> diff --git a/src/evdev.h b/src/evdev.h
> index bcb7e79..1164b7c 100644
> --- a/src/evdev.h
> +++ b/src/evdev.h
> @@ -127,6 +127,9 @@ evdev_touchpad_create(struct evdev_device *device);
> struct evdev_dispatch *
> evdev_mt_touchpad_create(struct evdev_device *device);
>
> +struct evdev_dispatch *
> +evdev_tablet_create(struct evdev_device *device);
> +
> void
> evdev_device_proces_event(struct libinput_event *event);
>
> diff --git a/src/libinput-private.h b/src/libinput-private.h
> index f0bda1f..f6ba51c 100644
> --- a/src/libinput-private.h
> +++ b/src/libinput-private.h
> @@ -195,6 +195,12 @@ touch_notify_touch_up(struct libinput_device *device,
> int32_t seat_slot);
>
> void
> +tablet_notify_axis(struct libinput_device *device,
> + uint32_t time,
> + unsigned char *changed_axes,
> + double *axes);
> +
> +void
> touch_notify_frame(struct libinput_device *device,
> uint32_t time);
> #endif /* LIBINPUT_PRIVATE_H */
> diff --git a/src/libinput-util.h b/src/libinput-util.h
> index 4488fbf..a1d6616 100644
> --- a/src/libinput-util.h
> +++ b/src/libinput-util.h
> @@ -76,6 +76,8 @@ int list_empty(const struct list *list);
> #define min(a, b) (((a) < (b)) ? (a) : (b))
> #define max(a, b) (((a) > (b)) ? (a) : (b))
>
> +#define NCHARS(x) ((size_t)(((x) + 7) / 8))
> +
> #define LIBINPUT_EXPORT __attribute__ ((visibility("default")))
>
> static inline void *
> diff --git a/src/libinput.c b/src/libinput.c
> index 5b10a10..fee500e 100644
> --- a/src/libinput.c
> +++ b/src/libinput.c
> @@ -80,6 +80,13 @@ struct libinput_event_touch {
> double y;
> };
>
> +struct libinput_event_tablet {
> + struct libinput_event base;
> + uint32_t time;
> + double *axes;
> + unsigned char changed_axes[NCHARS(LIBINPUT_TABLET_AXIS_CNT)];
> +};
> +
> static void
> libinput_default_log_func(enum libinput_log_priority priority,
> void *data,
> @@ -191,6 +198,7 @@ libinput_event_get_pointer_event(struct libinput_event *event)
> case LIBINPUT_EVENT_TOUCH_MOTION:
> case LIBINPUT_EVENT_TOUCH_CANCEL:
> case LIBINPUT_EVENT_TOUCH_FRAME:
> + case LIBINPUT_EVENT_TABLET_AXIS:
> break;
> }
>
> @@ -217,6 +225,7 @@ libinput_event_get_keyboard_event(struct libinput_event *event)
> case LIBINPUT_EVENT_TOUCH_MOTION:
> case LIBINPUT_EVENT_TOUCH_CANCEL:
> case LIBINPUT_EVENT_TOUCH_FRAME:
> + case LIBINPUT_EVENT_TABLET_AXIS:
> break;
> }
>
> @@ -243,6 +252,34 @@ libinput_event_get_touch_event(struct libinput_event *event)
> case LIBINPUT_EVENT_TOUCH_CANCEL:
> case LIBINPUT_EVENT_TOUCH_FRAME:
> return (struct libinput_event_touch *) event;
> + case LIBINPUT_EVENT_TABLET_AXIS:
> + break;
> + }
> +
> + return NULL;
> +}
> +
> +LIBINPUT_EXPORT struct libinput_event_tablet *
> +libinput_event_get_tablet_event(struct libinput_event *event)
> +{
> + switch (event->type) {
> + case LIBINPUT_EVENT_NONE:
> + abort(); /* not used as actual event type */
> + case LIBINPUT_EVENT_DEVICE_ADDED:
> + case LIBINPUT_EVENT_DEVICE_REMOVED:
> + case LIBINPUT_EVENT_KEYBOARD_KEY:
> + case LIBINPUT_EVENT_POINTER_MOTION:
> + case LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE:
> + case LIBINPUT_EVENT_POINTER_BUTTON:
> + case LIBINPUT_EVENT_POINTER_AXIS:
> + case LIBINPUT_EVENT_TOUCH_DOWN:
> + case LIBINPUT_EVENT_TOUCH_UP:
> + case LIBINPUT_EVENT_TOUCH_MOTION:
> + case LIBINPUT_EVENT_TOUCH_CANCEL:
> + case LIBINPUT_EVENT_TOUCH_FRAME:
> + break;
> + case LIBINPUT_EVENT_TABLET_AXIS:
> + return (struct libinput_event_tablet *) event;
> }
>
> return NULL;
> @@ -267,6 +304,7 @@ libinput_event_get_device_notify_event(struct libinput_event *event)
> case LIBINPUT_EVENT_TOUCH_MOTION:
> case LIBINPUT_EVENT_TOUCH_CANCEL:
> case LIBINPUT_EVENT_TOUCH_FRAME:
> + case LIBINPUT_EVENT_TABLET_AXIS:
> break;
> }
>
> @@ -431,6 +469,51 @@ libinput_event_touch_get_y(struct libinput_event_touch *event)
> return event->y;
> }
>
> +LIBINPUT_EXPORT int
> +libinput_event_tablet_axis_has_changed(struct libinput_event_tablet *event,
> + enum libinput_tablet_axis axis) {
> + return (NCHARS(axis) <= sizeof(event->changed_axes)) ?
> + bit_is_set(event->changed_axes, axis) : 0;
> +}
> +
> +LIBINPUT_EXPORT double
> +libinput_event_tablet_get_axis_value(struct libinput_event_tablet *event,
> + enum libinput_tablet_axis axis)
> +{
> + return (axis >= 0 && axis < LIBINPUT_TABLET_AXIS_CNT) ?
> + event->axes[axis] : 0;
> +}
> +
> +LIBINPUT_EXPORT double
> +libinput_event_tablet_get_x_transformed(struct libinput_event_tablet *event,
> + uint32_t width)
> +{
> + struct evdev_device *device =
> + (struct evdev_device *) event->base.device;
> +
> + return evdev_device_transform_x(device,
> + event->axes[LIBINPUT_TABLET_AXIS_X],
> + width);
> +}
> +
> +LIBINPUT_EXPORT double
> +libinput_event_tablet_get_y_transformed(struct libinput_event_tablet *event,
> + uint32_t height)
> +{
> + struct evdev_device *device =
> + (struct evdev_device *) event->base.device;
> +
> + return evdev_device_transform_y(device,
> + event->axes[LIBINPUT_TABLET_AXIS_Y],
> + height);
> +}
> +
> +LIBINPUT_EXPORT uint32_t
> +libinput_event_tablet_get_time(struct libinput_event_tablet *event)
> +{
> + return event->time;
> +}
> +
> struct libinput_source *
> libinput_add_fd(struct libinput *libinput,
> int fd,
> @@ -1021,6 +1104,31 @@ touch_notify_frame(struct libinput_device *device,
> &touch_event->base);
> }
>
> +void
> +tablet_notify_axis(struct libinput_device *device,
> + uint32_t time,
> + unsigned char *changed_axes,
> + double *axes)
> +{
> + struct libinput_event_tablet *axis_event;
> +
> + axis_event = zalloc(sizeof *axis_event);
> + if (!axis_event)
> + return;
> +
> + *axis_event = (struct libinput_event_tablet) {
> + .time = time,
> + .axes = axes,
> + };
> +
> + memcpy(&axis_event->changed_axes,
> + changed_axes,
> + sizeof(axis_event->changed_axes));
> +
> + post_device_event(device,
> + LIBINPUT_EVENT_TABLET_AXIS,
> + &axis_event->base);
> +}
>
> static void
> libinput_post_event(struct libinput *libinput,
> diff --git a/src/libinput.h b/src/libinput.h
> index d6f2588..18bb726 100644
> --- a/src/libinput.h
> +++ b/src/libinput.h
> @@ -170,6 +170,19 @@ enum libinput_pointer_axis {
> };
>
> /**
> + * @ingroup device
> + *
> + * Available axis types for a device. It must have the @ref
> + * LIBINPUT_DEVICE_CAP_TABLET capability.
> + */
> +enum libinput_tablet_axis {
> + LIBINPUT_TABLET_AXIS_NONE = -1,
> + LIBINPUT_TABLET_AXIS_X = 0,
> + LIBINPUT_TABLET_AXIS_Y = 1,
> + LIBINPUT_TABLET_AXIS_CNT = LIBINPUT_TABLET_AXIS_Y + 1
> +};
> +
> +/**
> * @ingroup base
> *
> * Event type for events returned by libinput_get_event().
> @@ -213,7 +226,9 @@ enum libinput_event_type {
> * Signals the end of a set of touchpoints at one device sample
> * time. This event has no coordinate information attached.
> */
> - LIBINPUT_EVENT_TOUCH_FRAME
> + LIBINPUT_EVENT_TOUCH_FRAME,
> +
> + LIBINPUT_EVENT_TABLET_AXIS = 600
> };
>
> struct libinput;
> @@ -238,6 +253,15 @@ struct libinput_event_pointer;
> struct libinput_event_touch;
>
> /**
> + * @ingroup event_tablet
> + * @struct libinput_event_tablet
> + *
> + * Tablet event representing an axis update, button press, or tool update. Valid
> + * event types for this event are @ref LIBINPUT_EVENT_TABLET_AXIS.
> + */
> +struct libinput_event_tablet;
> +
> +/**
> * @defgroup event Accessing and destruction of events
> */
>
> @@ -330,6 +354,19 @@ libinput_event_get_touch_event(struct libinput_event *event);
> /**
> * @ingroup event
> *
> + * Return the tablet event that is this input event. If the event type does not
> + * match the tablet event types, this function returns NULL.
> + *
> + * The inverse of this function is libinput_event_tablet_get_base_event().
> + *
> + * @return A touch event, or NULL for other events
> + */
> +struct libinput_event_tablet *
> +libinput_event_get_tablet_event(struct libinput_event *event);
> +
> +/**
> + * @ingroup event
> + *
> * Return the device event that is this input event. If the event type does
> * not match the device event types, this function returns NULL.
> *
> @@ -756,6 +793,88 @@ struct libinput_event *
> libinput_event_touch_get_base_event(struct libinput_event_touch *event);
>
> /**
> + * @defgroup event_tablet Tablet events
> + *
> + * Events that come from tablet devices.
> + */
> +
> +/**
> + * @ingroup event_tablet
> + *
> + * Checks if an axis was updated in this event or return 0 otherwise.
> + * For tablet events that are not of type LIBINPUT_EVENT_TABLET_AXIS,
> + * this function returns 0.
> + *
> + * @note It is an application bug to call this function for events other than
> + * LIBINPUT_EVENT_TABLET_AXIS.
> + *
> + * @param event The libinput tablet event
> + * @param axis The axis to check for updates
> + * @return 1 if the axis was updated or 0 otherwise
> + */
> +int
> +libinput_event_tablet_axis_has_changed(struct libinput_event_tablet *event,
> + enum libinput_tablet_axis axis);
> +
> +/**
> + * @ingroup event_tablet
> + *
> + * Return the axis value of a given axis for a tablet. The interpretation of the
> + * value is dependent on the axis:
> + * - @ref LIBINPUT_TABLET_AXIS_X and @ref LIBINPUT_TABLET_AXIS_Y - the raw X and
> + * Y coordinates of the tablet tool. By default these are not transformed,
> + * however libinput provides libinput_event_tablet_get_x_transformed() and
> + * libinput_event_tablet_get_y_transformed() for transforming each respective
> + * axis value.
> + *
> + * For tablet events that are not of type @ref LIBINPUT_EVENT_TABLET_AXIS, this
> + * function returns 0.
> + *
> + * @param event The libinput tablet event
> + * @param axis The axis to retrieve the value of
> + * @return The current value of the the axis
> + */
> +double
> +libinput_event_tablet_get_axis_value(struct libinput_event_tablet *event,
> + enum libinput_tablet_axis axis);
> +
> +/**
> + * @ingroup event_tablet
> + *
> + * Return the current absolute x coordinate of the tablet event, transformed to
> + * screen coordinates.
> + *
> + * @param event The libinput tablet event
> + * @param width The current output screen width
> + * @return the current absolute x coordinate transformed to a screen coordinate
> + */
> +double
> +libinput_event_tablet_get_x_transformed(struct libinput_event_tablet *event,
> + uint32_t width);
> +
> +/**
> + * @ingroup event_tablet
> + *
> + * Return the current absolute y coordinate of the tablet event, transformed to
> + * screen coordinates.
> + *
> + * @param event The libinput tablet event
> + * @param height The current output screen height
> + * @return the current absolute y coordinate transformed to a screen coordinate
> + */
> +double
> +libinput_event_tablet_get_y_transformed(struct libinput_event_tablet *event,
> + uint32_t height);
> +/**
> + * @ingroup event_tablet
> + *
> + * @param event The libinput tablet event
> + * @return The event time for this event
> + */
> +uint32_t
> +libinput_event_tablet_get_time(struct libinput_event_tablet *event);
> +
> +/**
> * @defgroup base Initialization and manipulation of libinput contexts
> */
>
>
More information about the wayland-devel
mailing list