<div dir="ltr"><div>Isn't dx_unaccelerated exactly equal to the differences between x values?<br><br></div><div>If not then I suspect the only difference is a linear scaling (ie between tablet-width/height or mm or whatever the xy are using and the pointer-like coordinates the dx are using).<br><br></div><div>I think it would be less confusing if everything used the same coordinate space. However having the driver indicate how big a "pointer like unit" is in this coordinate system is useful. A client can use this to automatically switch between absolute and relative mode depending on whether the scaling from pointer motion in absolute mode exceeds this value too much, or if the aspect ratio differs too much.<br><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jan 14, 2016 at 4:26 PM, Peter Hutterer <span dir="ltr"><<a href="mailto:peter.hutterer@who-t.net" target="_blank">peter.hutterer@who-t.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Instead of an explicit tablet mode that device must be changed into, let the<br>
caller decide which coordinates are preferred. The tablet mode may be<br>
application-specific and usually depends on the tool as well.<br>
<br>
This patch adds an interface to get a motion delta for the x/y axes in<br>
pixel-like coordinates and as raw unaccelerated delta. In the former case,<br>
libinput will provide some magic to convert the tablet data into something<br>
that resembles pixels from a mouse motion. In the latter case, we normalize<br>
to the x resolution so the caller doesn't have to account for uneven<br>
resolutions, but otherwise leave the data untouched.<br>
A caller can either query the x resolution and base the rest on that, or just<br>
guess a magic factor to apply.<br>
<br>
Signed-off-by: Peter Hutterer <<a href="mailto:peter.hutterer@who-t.net">peter.hutterer@who-t.net</a>><br>
---<br>
 doc/normalization-of-relative-motion.dox |  4 ++<br>
 doc/tablet-support.dox                   | 29 +++++++++++++++<br>
 src/libinput-private.h                   |  2 +<br>
 src/libinput.c                           | 52 ++++++++++++++++++++++++++<br>
 src/libinput.h                           | 63 ++++++++++++++++++++++++++++++++<br>
 src/libinput.sym                         |  4 ++<br>
 6 files changed, 154 insertions(+)<br>
<br>
diff --git a/doc/normalization-of-relative-motion.dox b/doc/normalization-of-relative-motion.dox<br>
index 31596a9..478e727 100644<br>
--- a/doc/normalization-of-relative-motion.dox<br>
+++ b/doc/normalization-of-relative-motion.dox<br>
@@ -38,6 +38,10 @@ libinput scales unaccelerated touchpad motion to the resolution of the<br>
 touchpad's x axis, i.e. the unaccelerated value for the y axis is:<br>
      y = (x / resolution_x) * resolution_y<br>
<br>
+@section motion_normalization_tablet Normalization of tablet coordinates<br>
+<br>
+See @ref tablet-relative-motion<br>
+<br>
 @section Setting custom DPI settings<br>
<br>
 Devices usually do not advertise their resolution and libinput relies on<br>
diff --git a/doc/tablet-support.dox b/doc/tablet-support.dox<br>
index 7207a47..1bc8733 100644<br>
--- a/doc/tablet-support.dox<br>
+++ b/doc/tablet-support.dox<br>
@@ -52,6 +52,35 @@ Note that the pressure threshold to trigger a logical tip event may be zero<br>
 on some devices. On tools without pressure sensitivity, determining when a<br>
 tip is down is device-specific.<br>
<br>
+@section tablet-relative-motion Relative motion for tablet tools<br>
+<br>
+libinput calculates the relative motion vector for each event and converts<br>
+it to the same coordinate space that a normal mouse device would use. For<br>
+the caller, this means that the delta coordinates returned by<br>
+libinput_event_tablet_tool_get_dx() and<br>
+libinput_event_tablet_tool_get_dy() can be used identical to the delta<br>
+coordinates from any other pointer event. Any resolution differences between<br>
+the x and y axes are accommodated for, a delta of N/N represents a 45 degree<br>
+diagonal move on the tablet.<br>
+<br>
+The delta coordinates are available for all tablet events, it is up to the<br>
+caller to decide when a tool should be used in relative mode. It is<br>
+recommended that mouse and lens cursor tool default to relative mode and<br>
+all pen-like tools to absolute mode.<br>
+<br>
+If a tool in relative mode must not use pointer acceleration, a caller<br>
+should use the delta coordinates returned by<br>
+libinput_event_tablet_tool_get_dx_unaccelerated() and<br>
+libinput_event_tablet_tool_get_dy_unaccelerated() instead. These<br>
+deltas are in raw device coordinates, it is up to the caller to map the raw<br>
+device units into pixel movements. libinput normalizes the coordinates to<br>
+the resolution of the x axis. Thus, an unaccelerated delta of N/N represents<br>
+a 45 degree diagonal move on the tablet.<br>
+<br>
+Callers that require exact physical distance should use the<br>
+absolute coordinates provided by libinput_event_tablet_tool_get_x() and<br>
+libinput_event_tablet_tool_get_y() and calculate the delta themselves.<br>
+<br>
 @section tablet-axes Special axes on tablet tools<br>
<br>
 A tablet tool usually provides additional information beyond x/y positional<br>
diff --git a/src/libinput-private.h b/src/libinput-private.h<br>
index ff43d00..1e6ae90 100644<br>
--- a/src/libinput-private.h<br>
+++ b/src/libinput-private.h<br>
@@ -71,6 +71,8 @@ struct threshold {<br>
<br>
 struct tablet_axes {<br>
        struct device_coords point;<br>
+       struct normalized_coords delta;<br>
+       struct device_float_coords delta_raw;<br>
        double distance;<br>
        double pressure;<br>
        struct normalized_range_coords tilt;<br>
diff --git a/src/libinput.c b/src/libinput.c<br>
index 2f80f03..2b09cff 100644<br>
--- a/src/libinput.c<br>
+++ b/src/libinput.c<br>
@@ -1090,6 +1090,58 @@ libinput_event_tablet_tool_get_y(struct libinput_event_tablet_tool *event)<br>
 }<br>
<br>
 LIBINPUT_EXPORT double<br>
+libinput_event_tablet_tool_get_dx(struct libinput_event_tablet_tool *event)<br>
+{<br>
+       require_event_type(libinput_event_get_context(&event->base),<br>
+                          event->base.type,<br>
+                          0,<br>
+                          LIBINPUT_EVENT_TABLET_TOOL_AXIS,<br>
+                          LIBINPUT_EVENT_TABLET_TOOL_TIP,<br>
+                          LIBINPUT_EVENT_TABLET_TOOL_PROXIMITY);<br>
+<br>
+       return event->axes.delta.x;<br>
+}<br>
+<br>
+LIBINPUT_EXPORT double<br>
+libinput_event_tablet_tool_get_dy(struct libinput_event_tablet_tool *event)<br>
+{<br>
+       require_event_type(libinput_event_get_context(&event->base),<br>
+                          event->base.type,<br>
+                          0,<br>
+                          LIBINPUT_EVENT_TABLET_TOOL_AXIS,<br>
+                          LIBINPUT_EVENT_TABLET_TOOL_TIP,<br>
+                          LIBINPUT_EVENT_TABLET_TOOL_PROXIMITY);<br>
+<br>
+       return event->axes.delta.y;<br>
+}<br>
+<br>
+LIBINPUT_EXPORT double<br>
+libinput_event_tablet_tool_get_dx_unaccelerated(struct libinput_event_tablet_tool *event)<br>
+{<br>
+       require_event_type(libinput_event_get_context(&event->base),<br>
+                          event->base.type,<br>
+                          0,<br>
+                          LIBINPUT_EVENT_TABLET_TOOL_AXIS,<br>
+                          LIBINPUT_EVENT_TABLET_TOOL_TIP,<br>
+                          LIBINPUT_EVENT_TABLET_TOOL_PROXIMITY);<br>
+<br>
+       return event->axes.delta_raw.x;<br>
+}<br>
+<br>
+LIBINPUT_EXPORT double<br>
+libinput_event_tablet_tool_get_dy_unaccelerated(struct libinput_event_tablet_tool *event)<br>
+{<br>
+       require_event_type(libinput_event_get_context(&event->base),<br>
+                          event->base.type,<br>
+                          0,<br>
+                          LIBINPUT_EVENT_TABLET_TOOL_AXIS,<br>
+                          LIBINPUT_EVENT_TABLET_TOOL_TIP,<br>
+                          LIBINPUT_EVENT_TABLET_TOOL_PROXIMITY);<br>
+<br>
+       return event->axes.delta_raw.y;<br>
+}<br>
+<br>
+LIBINPUT_EXPORT double<br>
 libinput_event_tablet_tool_get_pressure(struct libinput_event_tablet_tool *event)<br>
 {<br>
        require_event_type(libinput_event_get_context(&event->base),<br>
diff --git a/src/libinput.h b/src/libinput.h<br>
index 3b90f0b..2e838f6 100644<br>
--- a/src/libinput.h<br>
+++ b/src/libinput.h<br>
@@ -1583,6 +1583,69 @@ libinput_event_tablet_tool_get_y(struct libinput_event_tablet_tool *event);<br>
 /**<br>
  * @ingroup event_tablet<br>
  *<br>
+ * Return the delta between the last event and the current event.<br>
+ * If the tool employs pointer acceleration, the delta returned by this<br>
+ * function is the accelerated delta.<br>
+ *<br>
+ * This value is in screen coordinate space, the delta is to be interpreted<br>
+ * like the return value of libinput_event_pointer_get_dx().<br>
+ * See @ref tablet-relative-motion for more details.<br>
+ *<br>
+ * @param event The libinput tablet event<br>
+ * @return The relative x movement since the last event<br>
+ */<br>
+double<br>
+libinput_event_tablet_tool_get_dx(struct libinput_event_tablet_tool *event);<br>
+<br>
+/**<br>
+ * Return the unaccelerated delta between the last event and the current<br>
+ * event.<br>
+ *<br>
+ * Relative unaccelerated motion deltas are raw device coordinates in the X<br>
+ * resolution of the device.<br>
+ * See @ref tablet-relative-motion for more details.<br>
+ *<br>
+ * @param event The libinput tablet event<br>
+ * @return The unaccelerated relative x movement since the last event<br>
+ */<br>
+double<br>
+libinput_event_tablet_tool_get_dx_unaccelerated(<br>
+                               struct libinput_event_tablet_tool *event);<br>
+<br>
+/**<br>
+ * @ingroup event_tablet<br>
+ *<br>
+ * Return the delta between the last event and the current event.<br>
+ * If the tool employs pointer acceleration, the delta returned by this<br>
+ * function is the accelerated delta.<br>
+ *<br>
+ * This value is in screen coordinate space, the delta is to be interpreted<br>
+ * like the return value of libinput_event_pointer_get_dx().<br>
+ * See @ref tablet-relative-motion for more details.<br>
+ *<br>
+ * @param event The libinput tablet event<br>
+ * @return The relative y movement since the last event<br>
+ */<br>
+double<br>
+libinput_event_tablet_tool_get_dy(struct libinput_event_tablet_tool *event);<br>
+<br>
+/**<br>
+ * Return the unaccelerated delta between the last event and the current<br>
+ * event.<br>
+ *<br>
+ * Relative unaccelerated motion deltas are raw device coordinates in the X<br>
+ * resolution of the device.<br>
+ * See @ref tablet-relative-motion for more details.<br>
+ *<br>
+ * @param event The libinput tablet event<br>
+ * @return The unaccelerated relative y movement since the last event<br>
+ */<br>
+double<br>
+libinput_event_tablet_tool_get_dy_unaccelerated(<br>
+                               struct libinput_event_tablet_tool *event);<br>
+/**<br>
+ * @ingroup event_tablet<br>
+ *<br>
  * Returns the current pressure being applied on the tool in use, normalized<br>
  * to the range [0, 1].<br>
  *<br>
diff --git a/src/libinput.sym b/src/libinput.sym<br>
index 22a8dd8..0c40b1b 100644<br>
--- a/src/libinput.sym<br>
+++ b/src/libinput.sym<br>
@@ -194,6 +194,10 @@ LIBINPUT_TABLET_SUPPORT {<br>
        libinput_event_tablet_tool_tilt_y_has_changed;<br>
        libinput_event_tablet_tool_wheel_has_changed;<br>
        libinput_event_tablet_tool_slider_has_changed;<br>
+       libinput_event_tablet_tool_get_dx;<br>
+       libinput_event_tablet_tool_get_dy;<br>
+       libinput_event_tablet_tool_get_dx_unaccelerated;<br>
+       libinput_event_tablet_tool_get_dy_unaccelerated;<br>
        libinput_event_tablet_tool_get_x;<br>
        libinput_event_tablet_tool_get_y;<br>
        libinput_event_tablet_tool_get_pressure;<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.5.0<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
_______________________________________________<br>
wayland-devel mailing list<br>
<a href="mailto:wayland-devel@lists.freedesktop.org">wayland-devel@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/wayland-devel" rel="noreferrer" target="_blank">http://lists.freedesktop.org/mailman/listinfo/wayland-devel</a><br>
</div></div></blockquote></div><br></div>