mirror of
https://gitlab.freedesktop.org/libinput/libinput.git
synced 2025-12-31 00:40:07 +01:00
tablet: split point vs delta handling up
Handle the delta in the end once we've updated the device state for all axes. This requires us to use the device history rather than the current state delta, and it also requires us to update both x and y whenever an axis change comes in. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Acked-by: Ping Cheng <pingc@wacom.com>
This commit is contained in:
parent
230af3f9fc
commit
88876e66fa
1 changed files with 28 additions and 33 deletions
|
|
@ -383,17 +383,14 @@ normalize_wheel(struct tablet_dispatch *tablet,
|
|||
}
|
||||
|
||||
static inline void
|
||||
tablet_handle_xy(struct tablet_dispatch *tablet,
|
||||
struct evdev_device *device,
|
||||
struct device_coords *point_out,
|
||||
struct device_coords *delta_out)
|
||||
tablet_update_xy(struct tablet_dispatch *tablet,
|
||||
struct evdev_device *device)
|
||||
{
|
||||
struct device_coords point;
|
||||
struct device_coords delta = { 0, 0 };
|
||||
const struct input_absinfo *absinfo;
|
||||
int value;
|
||||
|
||||
if (bit_is_set(tablet->changed_axes, LIBINPUT_TABLET_TOOL_AXIS_X)) {
|
||||
if (bit_is_set(tablet->changed_axes, LIBINPUT_TABLET_TOOL_AXIS_X) ||
|
||||
bit_is_set(tablet->changed_axes, LIBINPUT_TABLET_TOOL_AXIS_Y)) {
|
||||
absinfo = libevdev_get_abs_info(device->evdev, ABS_X);
|
||||
|
||||
if (device->left_handed.enabled)
|
||||
|
|
@ -401,14 +398,8 @@ tablet_handle_xy(struct tablet_dispatch *tablet,
|
|||
else
|
||||
value = absinfo->value;
|
||||
|
||||
if (!tablet_has_status(tablet,
|
||||
TABLET_TOOL_ENTERING_PROXIMITY))
|
||||
delta.x = value - tablet->axes.point.x;
|
||||
tablet->axes.point.x = value;
|
||||
}
|
||||
point.x = tablet->axes.point.x;
|
||||
|
||||
if (bit_is_set(tablet->changed_axes, LIBINPUT_TABLET_TOOL_AXIS_Y)) {
|
||||
absinfo = libevdev_get_abs_info(device->evdev, ABS_Y);
|
||||
|
||||
if (device->left_handed.enabled)
|
||||
|
|
@ -416,28 +407,36 @@ tablet_handle_xy(struct tablet_dispatch *tablet,
|
|||
else
|
||||
value = absinfo->value;
|
||||
|
||||
if (!tablet_has_status(tablet,
|
||||
TABLET_TOOL_ENTERING_PROXIMITY))
|
||||
delta.y = value - tablet->axes.point.y;
|
||||
tablet->axes.point.y = value;
|
||||
}
|
||||
point.y = tablet->axes.point.y;
|
||||
|
||||
*delta_out = delta;
|
||||
*point_out = point;
|
||||
evdev_transform_absolute(device, &tablet->axes.point);
|
||||
}
|
||||
}
|
||||
|
||||
static inline struct normalized_coords
|
||||
tool_process_delta(struct libinput_tablet_tool *tool,
|
||||
const struct evdev_device *device,
|
||||
const struct device_coords *delta,
|
||||
uint64_t time)
|
||||
tablet_tool_process_delta(struct tablet_dispatch *tablet,
|
||||
struct libinput_tablet_tool *tool,
|
||||
const struct evdev_device *device,
|
||||
uint64_t time)
|
||||
{
|
||||
const struct normalized_coords zero = { 0.0, 0.0 };
|
||||
const struct tablet_axes *last, *current;
|
||||
struct device_coords delta = { 0, 0 };
|
||||
struct device_float_coords accel;
|
||||
|
||||
accel.x = 1.0 * delta->x;
|
||||
accel.y = 1.0 * delta->y;
|
||||
if (!tablet_has_status(tablet,
|
||||
TABLET_TOOL_ENTERING_PROXIMITY) &&
|
||||
(bit_is_set(tablet->changed_axes, LIBINPUT_TABLET_TOOL_AXIS_X) ||
|
||||
bit_is_set(tablet->changed_axes, LIBINPUT_TABLET_TOOL_AXIS_Y))) {
|
||||
current = &tablet->axes;
|
||||
last = tablet_history_get(tablet, 0);
|
||||
|
||||
delta.x = current->point.x - last->point.x;
|
||||
delta.y = current->point.y - last->point.y;
|
||||
}
|
||||
|
||||
accel.x = 1.0 * delta.x;
|
||||
accel.y = 1.0 * delta.y;
|
||||
|
||||
if (device_float_is_zero(accel))
|
||||
return zero;
|
||||
|
|
@ -595,7 +594,6 @@ tablet_check_notify_axes(struct tablet_dispatch *tablet,
|
|||
{
|
||||
struct tablet_axes axes = {0};
|
||||
const char tmp[sizeof(tablet->changed_axes)] = {0};
|
||||
struct device_coords delta;
|
||||
bool rc = false;
|
||||
|
||||
if (memcmp(tmp, tablet->changed_axes, sizeof(tmp)) == 0) {
|
||||
|
|
@ -603,8 +601,7 @@ tablet_check_notify_axes(struct tablet_dispatch *tablet,
|
|||
goto out;
|
||||
}
|
||||
|
||||
tablet_handle_xy(tablet, device, &axes.point, &delta);
|
||||
|
||||
tablet_update_xy(tablet, device);
|
||||
tablet_update_pressure(tablet, device, tool);
|
||||
tablet_update_distance(tablet, device);
|
||||
tablet_update_slider(tablet, device);
|
||||
|
|
@ -614,6 +611,7 @@ tablet_check_notify_axes(struct tablet_dispatch *tablet,
|
|||
* already normalized and set if we have the mouse/lens tool */
|
||||
tablet_update_rotation(tablet, device);
|
||||
|
||||
axes.point = tablet->axes.point;
|
||||
axes.pressure = tablet->axes.pressure;
|
||||
axes.distance = tablet->axes.distance;
|
||||
axes.slider = tablet->axes.slider;
|
||||
|
|
@ -622,10 +620,7 @@ tablet_check_notify_axes(struct tablet_dispatch *tablet,
|
|||
axes.wheel_discrete = tablet->axes.wheel_discrete;
|
||||
axes.rotation = tablet->axes.rotation;
|
||||
|
||||
evdev_transform_absolute(device, &axes.point);
|
||||
evdev_transform_relative(device, &delta);
|
||||
|
||||
axes.delta = tool_process_delta(tool, device, &delta, time);
|
||||
axes.delta = tablet_tool_process_delta(tablet, tool, device, time);
|
||||
|
||||
*axes_out = axes;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue