[PATCH weston 15/19] tablet: Add support for reporting pressure, distance, and tilt in weston
Stephen Chandler Paul
thatslyude at gmail.com
Wed Aug 6 16:08:05 PDT 2014
Signed-off-by: Stephen Chandler Paul <thatslyude at gmail.com>
---
src/compositor.h | 13 +++++++++
src/input.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++----
src/libinput-device.c | 57 ++++++++++++++++++++++++++++++++++++
3 files changed, 146 insertions(+), 5 deletions(-)
diff --git a/src/compositor.h b/src/compositor.h
index 081be57..5d49c1d 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -50,6 +50,9 @@ extern "C" {
const __typeof__( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
+#define WL_TABLET_AXIS_MAX 65535
+#define WL_TABLET_AXIS_MIN (-65535)
+
struct weston_transform {
struct weston_matrix matrix;
struct wl_list link;
@@ -447,6 +450,7 @@ struct weston_tablet {
enum wl_tablet_manager_tablet_type type;
uint32_t vid;
uint32_t pid;
+ enum wl_tablet_axis_flag supported_axes;
struct weston_output *output;
};
@@ -1134,6 +1138,15 @@ void
notify_tablet_motion(struct weston_tablet *tablet, uint32_t time,
wl_fixed_t x, wl_fixed_t y);
void
+notify_tablet_pressure(struct weston_tablet *tablet, uint32_t time,
+ wl_fixed_t pressure);
+void
+notify_tablet_distance(struct weston_tablet *tablet, uint32_t time,
+ wl_fixed_t distance);
+void
+notify_tablet_tilt(struct weston_tablet *tablet, uint32_t time,
+ wl_fixed_t tilt_x, wl_fixed_t tilt_y);
+void
notify_tablet_button(struct weston_tablet *tablet, uint32_t time,
uint32_t button, enum wl_tablet_button_state state);
void
diff --git a/src/input.c b/src/input.c
index baafd70..b7e7e0b 100644
--- a/src/input.c
+++ b/src/input.c
@@ -481,6 +481,48 @@ default_grab_tablet_motion(struct weston_tablet_grab *grab,
}
static void
+default_grab_tablet_pressure(struct weston_tablet_grab *grab,
+ uint32_t time, wl_fixed_t pressure)
+{
+ struct weston_tablet *tablet = grab->tablet;
+ struct wl_resource *resource;
+ struct wl_list *resource_list = &tablet->focus_resource_list;
+
+ if (!wl_list_empty(resource_list)) {
+ wl_resource_for_each(resource, resource_list)
+ wl_tablet_send_pressure(resource, time, pressure);
+ }
+}
+
+static void
+default_grab_tablet_distance(struct weston_tablet_grab *grab,
+ uint32_t time, wl_fixed_t distance)
+{
+ struct weston_tablet *tablet = grab->tablet;
+ struct wl_resource *resource;
+ struct wl_list *resource_list = &tablet->focus_resource_list;
+
+ if (!wl_list_empty(resource_list)) {
+ wl_resource_for_each(resource, resource_list)
+ wl_tablet_send_distance(resource, time, distance);
+ }
+}
+
+static void
+default_grab_tablet_tilt(struct weston_tablet_grab *grab,
+ uint32_t time, wl_fixed_t tilt_x, wl_fixed_t tilt_y)
+{
+ struct weston_tablet *tablet = grab->tablet;
+ struct wl_resource *resource;
+ struct wl_list *resource_list = &tablet->focus_resource_list;
+
+ if (!wl_list_empty(resource_list)) {
+ wl_resource_for_each(resource, resource_list)
+ wl_tablet_send_tilt(resource, time, tilt_x, tilt_y);
+ }
+}
+
+static void
default_grab_tablet_down(struct weston_tablet_grab *grab, uint32_t time)
{
struct weston_tablet *tablet = grab->tablet;
@@ -547,9 +589,9 @@ static struct weston_tablet_grab_interface default_tablet_grab_interface = {
default_grab_tablet_motion,
default_grab_tablet_down,
default_grab_tablet_up,
- NULL,
- NULL,
- NULL,
+ default_grab_tablet_pressure,
+ default_grab_tablet_distance,
+ default_grab_tablet_tilt,
default_grab_tablet_button,
default_grab_tablet_frame,
default_grab_tablet_cancel,
@@ -1892,7 +1934,8 @@ notify_tablet_added(struct weston_tablet *tablet)
wl_resource_set_user_data(tablet_resource, tablet);
wl_tablet_manager_send_device_added(resource, tablet_resource,
tablet->name, tablet->vid,
- tablet->pid, 0, 0);
+ tablet->pid, 0,
+ tablet->supported_axes);
}
}
@@ -1926,6 +1969,33 @@ notify_tablet_motion(struct weston_tablet *tablet, uint32_t time,
}
WL_EXPORT void
+notify_tablet_pressure(struct weston_tablet *tablet, uint32_t time,
+ wl_fixed_t pressure)
+{
+ struct weston_tablet_grab *grab = tablet->grab;
+
+ grab->interface->pressure(grab, time, pressure);
+}
+
+WL_EXPORT void
+notify_tablet_distance(struct weston_tablet *tablet, uint32_t time,
+ wl_fixed_t distance)
+{
+ struct weston_tablet_grab *grab = tablet->grab;
+
+ grab->interface->distance(grab, time, distance);
+}
+
+WL_EXPORT void
+notify_tablet_tilt(struct weston_tablet *tablet, uint32_t time,
+ wl_fixed_t tilt_x, wl_fixed_t tilt_y)
+{
+ struct weston_tablet_grab *grab = tablet->grab;
+
+ grab->interface->tilt(grab, time, tilt_x, tilt_y);
+}
+
+WL_EXPORT void
notify_tablet_frame(struct weston_tablet *tablet)
{
struct weston_tablet_grab *grab = tablet->grab;
@@ -2437,7 +2507,8 @@ bind_tablet_manager(struct wl_client *client, void *data, uint32_t version,
wl_tablet_manager_send_device_added(resource, tablet_resource,
tablet->name, tablet->vid,
- tablet->pid, 0, 0);
+ tablet->pid, 0,
+ tablet->supported_axes);
}
}
diff --git a/src/libinput-device.c b/src/libinput-device.c
index 6294466..040748d 100644
--- a/src/libinput-device.c
+++ b/src/libinput-device.c
@@ -313,6 +313,49 @@ handle_tablet_axis(struct libinput_device *libinput_device,
wl_fixed_from_double(x),
wl_fixed_from_double(y));
}
+ if (libinput_event_tablet_axis_has_changed(axis_event,
+ LIBINPUT_TABLET_AXIS_PRESSURE)) {
+ double pressure;
+ uint32_t time;
+
+ time = libinput_event_tablet_get_time(axis_event);
+ pressure = libinput_event_tablet_get_axis_value(
+ axis_event, LIBINPUT_TABLET_AXIS_PRESSURE)
+ * WL_TABLET_AXIS_MAX;
+
+ notify_tablet_pressure(tablet, time,
+ wl_fixed_from_double(pressure));
+ }
+ if (libinput_event_tablet_axis_has_changed(axis_event,
+ LIBINPUT_TABLET_AXIS_DISTANCE)) {
+ double distance;
+ uint32_t time;
+
+ time = libinput_event_tablet_get_time(axis_event);
+ distance = libinput_event_tablet_get_axis_value(
+ axis_event, LIBINPUT_TABLET_AXIS_DISTANCE)
+ * WL_TABLET_AXIS_MAX;
+
+ notify_tablet_distance(tablet, time,
+ wl_fixed_from_double(distance));
+ }
+ if (libinput_event_tablet_axis_has_changed(axis_event,
+ LIBINPUT_TABLET_AXIS_TILT_X) ||
+ libinput_event_tablet_axis_has_changed(axis_event,
+ LIBINPUT_TABLET_AXIS_TILT_Y)) {
+ double tilt_x, tilt_y;
+ uint32_t time;
+
+ time = libinput_event_tablet_get_time(axis_event);
+ tilt_x = libinput_event_tablet_get_axis_value(
+ axis_event, LIBINPUT_TABLET_AXIS_TILT_X) * WL_TABLET_AXIS_MAX;
+ tilt_y = libinput_event_tablet_get_axis_value(
+ axis_event, LIBINPUT_TABLET_AXIS_TILT_Y) * WL_TABLET_AXIS_MAX;
+
+ notify_tablet_tilt(tablet, time,
+ wl_fixed_from_double(tilt_x),
+ wl_fixed_from_double(tilt_y));
+ }
notify_tablet_frame(tablet);
}
@@ -567,6 +610,20 @@ evdev_device_create(struct libinput_device *libinput_device,
LIBINPUT_DEVICE_CAP_TABLET)) {
struct weston_tablet *tablet = weston_seat_add_tablet(seat);
+ if (libinput_tablet_has_axis(libinput_device,
+ LIBINPUT_TABLET_AXIS_PRESSURE))
+ tablet->supported_axes |= WL_TABLET_AXIS_FLAG_PRESSURE;
+
+ if (libinput_tablet_has_axis(libinput_device,
+ LIBINPUT_TABLET_AXIS_DISTANCE))
+ tablet->supported_axes |= WL_TABLET_AXIS_FLAG_DISTANCE;
+
+ if (libinput_tablet_has_axis(libinput_device,
+ LIBINPUT_TABLET_AXIS_TILT_X) &&
+ libinput_tablet_has_axis(libinput_device,
+ LIBINPUT_TABLET_AXIS_TILT_Y))
+ tablet->supported_axes |= WL_TABLET_AXIS_FLAG_TILT;
+
tablet->name = strdup(libinput_device_get_name(libinput_device));
tablet->vid = libinput_device_get_id_vendor(libinput_device);
tablet->pid = libinput_device_get_id_product(libinput_device);
--
1.8.5.5
More information about the wayland-devel
mailing list