On Fri, Jan 15, 2016 at 12:06:27PM -0800, Bill Spitzak wrote: > Isn't dx_unaccelerated exactly equal to the differences between x values?
hah, yes. indeed. that actually means we can drop it from the API since a client can use the mm value instead, they are effectively equivalent (but more useful) than the raw device coordinates and account for uneven resolution better anyway. > 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). > > 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. Whether you use the device in an absolute or relative mode is a very user-specific thing, I doubt you can handle this automatically. mode is also a very tool-specific thing, you may want the mouse to be in relative mode but the pen in absolute mode. Cheers, Peter > > > On Thu, Jan 14, 2016 at 4:26 PM, Peter Hutterer <[email protected]> > wrote: > > > Instead of an explicit tablet mode that device must be changed into, let > > the > > caller decide which coordinates are preferred. The tablet mode may be > > application-specific and usually depends on the tool as well. > > > > This patch adds an interface to get a motion delta for the x/y axes in > > pixel-like coordinates and as raw unaccelerated delta. In the former case, > > libinput will provide some magic to convert the tablet data into something > > that resembles pixels from a mouse motion. In the latter case, we normalize > > to the x resolution so the caller doesn't have to account for uneven > > resolutions, but otherwise leave the data untouched. > > A caller can either query the x resolution and base the rest on that, or > > just > > guess a magic factor to apply. > > > > Signed-off-by: Peter Hutterer <[email protected]> > > --- > > doc/normalization-of-relative-motion.dox | 4 ++ > > doc/tablet-support.dox | 29 +++++++++++++++ > > src/libinput-private.h | 2 + > > src/libinput.c | 52 ++++++++++++++++++++++++++ > > src/libinput.h | 63 > > ++++++++++++++++++++++++++++++++ > > src/libinput.sym | 4 ++ > > 6 files changed, 154 insertions(+) > > > > diff --git a/doc/normalization-of-relative-motion.dox > > b/doc/normalization-of-relative-motion.dox > > index 31596a9..478e727 100644 > > --- a/doc/normalization-of-relative-motion.dox > > +++ b/doc/normalization-of-relative-motion.dox > > @@ -38,6 +38,10 @@ libinput scales unaccelerated touchpad motion to the > > resolution of the > > touchpad's x axis, i.e. the unaccelerated value for the y axis is: > > y = (x / resolution_x) * resolution_y > > > > +@section motion_normalization_tablet Normalization of tablet coordinates > > + > > +See @ref tablet-relative-motion > > + > > @section Setting custom DPI settings > > > > Devices usually do not advertise their resolution and libinput relies on > > diff --git a/doc/tablet-support.dox b/doc/tablet-support.dox > > index 7207a47..1bc8733 100644 > > --- a/doc/tablet-support.dox > > +++ b/doc/tablet-support.dox > > @@ -52,6 +52,35 @@ Note that the pressure threshold to trigger a logical > > tip event may be zero > > on some devices. On tools without pressure sensitivity, determining when a > > tip is down is device-specific. > > > > +@section tablet-relative-motion Relative motion for tablet tools > > + > > +libinput calculates the relative motion vector for each event and converts > > +it to the same coordinate space that a normal mouse device would use. For > > +the caller, this means that the delta coordinates returned by > > +libinput_event_tablet_tool_get_dx() and > > +libinput_event_tablet_tool_get_dy() can be used identical to the delta > > +coordinates from any other pointer event. Any resolution differences > > between > > +the x and y axes are accommodated for, a delta of N/N represents a 45 > > degree > > +diagonal move on the tablet. > > + > > +The delta coordinates are available for all tablet events, it is up to the > > +caller to decide when a tool should be used in relative mode. It is > > +recommended that mouse and lens cursor tool default to relative mode and > > +all pen-like tools to absolute mode. > > + > > +If a tool in relative mode must not use pointer acceleration, a caller > > +should use the delta coordinates returned by > > +libinput_event_tablet_tool_get_dx_unaccelerated() and > > +libinput_event_tablet_tool_get_dy_unaccelerated() instead. These > > +deltas are in raw device coordinates, it is up to the caller to map the > > raw > > +device units into pixel movements. libinput normalizes the coordinates to > > +the resolution of the x axis. Thus, an unaccelerated delta of N/N > > represents > > +a 45 degree diagonal move on the tablet. > > + > > +Callers that require exact physical distance should use the > > +absolute coordinates provided by libinput_event_tablet_tool_get_x() and > > +libinput_event_tablet_tool_get_y() and calculate the delta themselves. > > + > > @section tablet-axes Special axes on tablet tools > > > > A tablet tool usually provides additional information beyond x/y > > positional > > diff --git a/src/libinput-private.h b/src/libinput-private.h > > index ff43d00..1e6ae90 100644 > > --- a/src/libinput-private.h > > +++ b/src/libinput-private.h > > @@ -71,6 +71,8 @@ struct threshold { > > > > struct tablet_axes { > > struct device_coords point; > > + struct normalized_coords delta; > > + struct device_float_coords delta_raw; > > double distance; > > double pressure; > > struct normalized_range_coords tilt; > > diff --git a/src/libinput.c b/src/libinput.c > > index 2f80f03..2b09cff 100644 > > --- a/src/libinput.c > > +++ b/src/libinput.c > > @@ -1090,6 +1090,58 @@ libinput_event_tablet_tool_get_y(struct > > libinput_event_tablet_tool *event) > > } > > > > LIBINPUT_EXPORT double > > +libinput_event_tablet_tool_get_dx(struct libinput_event_tablet_tool > > *event) > > +{ > > + require_event_type(libinput_event_get_context(&event->base), > > + event->base.type, > > + 0, > > + LIBINPUT_EVENT_TABLET_TOOL_AXIS, > > + LIBINPUT_EVENT_TABLET_TOOL_TIP, > > + LIBINPUT_EVENT_TABLET_TOOL_PROXIMITY); > > + > > + return event->axes.delta.x; > > +} > > + > > +LIBINPUT_EXPORT double > > +libinput_event_tablet_tool_get_dy(struct libinput_event_tablet_tool > > *event) > > +{ > > + require_event_type(libinput_event_get_context(&event->base), > > + event->base.type, > > + 0, > > + LIBINPUT_EVENT_TABLET_TOOL_AXIS, > > + LIBINPUT_EVENT_TABLET_TOOL_TIP, > > + LIBINPUT_EVENT_TABLET_TOOL_PROXIMITY); > > + > > + return event->axes.delta.y; > > +} > > + > > +LIBINPUT_EXPORT double > > +libinput_event_tablet_tool_get_dx_unaccelerated(struct > > libinput_event_tablet_tool *event) > > +{ > > + require_event_type(libinput_event_get_context(&event->base), > > + event->base.type, > > + 0, > > + LIBINPUT_EVENT_TABLET_TOOL_AXIS, > > + LIBINPUT_EVENT_TABLET_TOOL_TIP, > > + LIBINPUT_EVENT_TABLET_TOOL_PROXIMITY); > > + > > + return event->axes.delta_raw.x; > > +} > > + > > +LIBINPUT_EXPORT double > > +libinput_event_tablet_tool_get_dy_unaccelerated(struct > > libinput_event_tablet_tool *event) > > +{ > > + require_event_type(libinput_event_get_context(&event->base), > > + event->base.type, > > + 0, > > + LIBINPUT_EVENT_TABLET_TOOL_AXIS, > > + LIBINPUT_EVENT_TABLET_TOOL_TIP, > > + LIBINPUT_EVENT_TABLET_TOOL_PROXIMITY); > > + > > + return event->axes.delta_raw.y; > > +} > > + > > +LIBINPUT_EXPORT double > > libinput_event_tablet_tool_get_pressure(struct libinput_event_tablet_tool > > *event) > > { > > require_event_type(libinput_event_get_context(&event->base), > > diff --git a/src/libinput.h b/src/libinput.h > > index 3b90f0b..2e838f6 100644 > > --- a/src/libinput.h > > +++ b/src/libinput.h > > @@ -1583,6 +1583,69 @@ libinput_event_tablet_tool_get_y(struct > > libinput_event_tablet_tool *event); > > /** > > * @ingroup event_tablet > > * > > + * Return the delta between the last event and the current event. > > + * If the tool employs pointer acceleration, the delta returned by this > > + * function is the accelerated delta. > > + * > > + * This value is in screen coordinate space, the delta is to be > > interpreted > > + * like the return value of libinput_event_pointer_get_dx(). > > + * See @ref tablet-relative-motion for more details. > > + * > > + * @param event The libinput tablet event > > + * @return The relative x movement since the last event > > + */ > > +double > > +libinput_event_tablet_tool_get_dx(struct libinput_event_tablet_tool > > *event); > > + > > +/** > > + * Return the unaccelerated delta between the last event and the current > > + * event. > > + * > > + * Relative unaccelerated motion deltas are raw device coordinates in the > > X > > + * resolution of the device. > > + * See @ref tablet-relative-motion for more details. > > + * > > + * @param event The libinput tablet event > > + * @return The unaccelerated relative x movement since the last event > > + */ > > +double > > +libinput_event_tablet_tool_get_dx_unaccelerated( > > + struct libinput_event_tablet_tool *event); > > + > > +/** > > + * @ingroup event_tablet > > + * > > + * Return the delta between the last event and the current event. > > + * If the tool employs pointer acceleration, the delta returned by this > > + * function is the accelerated delta. > > + * > > + * This value is in screen coordinate space, the delta is to be > > interpreted > > + * like the return value of libinput_event_pointer_get_dx(). > > + * See @ref tablet-relative-motion for more details. > > + * > > + * @param event The libinput tablet event > > + * @return The relative y movement since the last event > > + */ > > +double > > +libinput_event_tablet_tool_get_dy(struct libinput_event_tablet_tool > > *event); > > + > > +/** > > + * Return the unaccelerated delta between the last event and the current > > + * event. > > + * > > + * Relative unaccelerated motion deltas are raw device coordinates in the > > X > > + * resolution of the device. > > + * See @ref tablet-relative-motion for more details. > > + * > > + * @param event The libinput tablet event > > + * @return The unaccelerated relative y movement since the last event > > + */ > > +double > > +libinput_event_tablet_tool_get_dy_unaccelerated( > > + struct libinput_event_tablet_tool *event); > > +/** > > + * @ingroup event_tablet > > + * > > * Returns the current pressure being applied on the tool in use, > > normalized > > * to the range [0, 1]. > > * > > diff --git a/src/libinput.sym b/src/libinput.sym > > index 22a8dd8..0c40b1b 100644 > > --- a/src/libinput.sym > > +++ b/src/libinput.sym > > @@ -194,6 +194,10 @@ LIBINPUT_TABLET_SUPPORT { > > libinput_event_tablet_tool_tilt_y_has_changed; > > libinput_event_tablet_tool_wheel_has_changed; > > libinput_event_tablet_tool_slider_has_changed; > > + libinput_event_tablet_tool_get_dx; > > + libinput_event_tablet_tool_get_dy; > > + libinput_event_tablet_tool_get_dx_unaccelerated; > > + libinput_event_tablet_tool_get_dy_unaccelerated; > > libinput_event_tablet_tool_get_x; > > libinput_event_tablet_tool_get_y; > > libinput_event_tablet_tool_get_pressure; > > -- > > 2.5.0 > > > > _______________________________________________ > > wayland-devel mailing list > > [email protected] > > http://lists.freedesktop.org/mailman/listinfo/wayland-devel > > _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
