mirror of
https://gitlab.freedesktop.org/libinput/libinput.git
synced 2026-01-11 07:30:15 +01:00
Merge branch 'wip/disable-semi-mt-gestures'
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
commit
f0fa09c73f
6 changed files with 33 additions and 53 deletions
|
|
@ -182,18 +182,7 @@ tp_gesture_get_direction(struct tp_dispatch *tp, struct tp_touch *touch)
|
|||
{
|
||||
struct normalized_coords normalized;
|
||||
struct device_float_coords delta;
|
||||
double move_threshold;
|
||||
|
||||
/*
|
||||
* Semi-mt touchpads have somewhat inaccurate coordinates when
|
||||
* 2 fingers are down, so use a slightly larger threshold.
|
||||
* Elantech semi-mt touchpads are accurate enough though.
|
||||
*/
|
||||
if (tp->semi_mt &&
|
||||
(tp->device->model_flags & EVDEV_MODEL_ELANTECH_TOUCHPAD) == 0)
|
||||
move_threshold = TP_MM_TO_DPI_NORMALIZED(4);
|
||||
else
|
||||
move_threshold = TP_MM_TO_DPI_NORMALIZED(1);
|
||||
double move_threshold = TP_MM_TO_DPI_NORMALIZED(1);
|
||||
|
||||
delta = device_delta(touch->point, touch->gesture.initial);
|
||||
|
||||
|
|
@ -219,11 +208,7 @@ tp_gesture_get_pinch_info(struct tp_dispatch *tp,
|
|||
delta = device_delta(first->point, second->point);
|
||||
normalized = tp_normalize_delta(tp, delta);
|
||||
*distance = normalized_length(normalized);
|
||||
|
||||
if (!tp->semi_mt)
|
||||
*angle = atan2(normalized.y, normalized.x) * 180.0 / M_PI;
|
||||
else
|
||||
*angle = 0.0;
|
||||
*angle = atan2(normalized.y, normalized.x) * 180.0 / M_PI;
|
||||
|
||||
*center = device_average(first->point, second->point);
|
||||
}
|
||||
|
|
@ -285,7 +270,9 @@ tp_gesture_handle_state_none(struct tp_dispatch *tp, uint64_t time)
|
|||
|
||||
if (first == second)
|
||||
return GESTURE_STATE_NONE;
|
||||
}
|
||||
|
||||
} else if (!tp->gesture.enabled)
|
||||
return GESTURE_STATE_SCROLL;
|
||||
|
||||
tp->gesture.initial_time = time;
|
||||
first->gesture.initial = first->point;
|
||||
|
|
@ -362,7 +349,7 @@ tp_gesture_handle_state_unknown(struct tp_dispatch *tp, uint64_t time)
|
|||
} else if (tp->gesture.enabled) {
|
||||
return GESTURE_STATE_SWIPE;
|
||||
}
|
||||
} else if (tp->gesture.enabled) {
|
||||
} else {
|
||||
tp_gesture_init_pinch(tp);
|
||||
return GESTURE_STATE_PINCH;
|
||||
}
|
||||
|
|
@ -378,16 +365,7 @@ tp_gesture_handle_state_scroll(struct tp_dispatch *tp, uint64_t time)
|
|||
if (tp->scroll.method != LIBINPUT_CONFIG_SCROLL_2FG)
|
||||
return GESTURE_STATE_SCROLL;
|
||||
|
||||
/* On some semi-mt models slot 0 is more accurate, so for semi-mt
|
||||
* we only use slot 0. */
|
||||
if (tp->semi_mt) {
|
||||
if (!tp->touches[0].dirty)
|
||||
return GESTURE_STATE_SCROLL;
|
||||
|
||||
delta = tp_get_delta(&tp->touches[0]);
|
||||
} else {
|
||||
delta = tp_get_average_touches_delta(tp);
|
||||
}
|
||||
delta = tp_get_average_touches_delta(tp);
|
||||
|
||||
/* scroll is not accelerated */
|
||||
delta = tp_filter_motion_unaccelerated(tp, &delta, time);
|
||||
|
|
@ -633,10 +611,10 @@ tp_gesture_handle_state(struct tp_dispatch *tp, uint64_t time)
|
|||
int
|
||||
tp_init_gesture(struct tp_dispatch *tp)
|
||||
{
|
||||
if (tp->device->model_flags & EVDEV_MODEL_JUMPING_SEMI_MT)
|
||||
tp->gesture.enabled = false;
|
||||
else
|
||||
tp->gesture.enabled = true;
|
||||
/* two-finger scrolling is always enabled, this flag just
|
||||
* decides whether we detect pinch. semi-mt devices are too
|
||||
* unreliable to do pinch gestures. */
|
||||
tp->gesture.enabled = !tp->semi_mt && tp->num_slots > 1;
|
||||
|
||||
tp->gesture.state = GESTURE_STATE_NONE;
|
||||
|
||||
|
|
|
|||
|
|
@ -751,6 +751,9 @@ tp_unhover_abs_distance(struct tp_dispatch *tp, uint64_t time)
|
|||
for (i = 0; i < tp->ntouches; i++) {
|
||||
t = tp_get_touch(tp, i);
|
||||
|
||||
if (!t->dirty)
|
||||
continue;
|
||||
|
||||
if (t->state == TOUCH_HOVERING) {
|
||||
if (t->distance == 0) {
|
||||
/* avoid jumps when landing a finger */
|
||||
|
|
@ -1495,17 +1498,22 @@ tp_init_slots(struct tp_dispatch *tp,
|
|||
|
||||
tp->semi_mt = libevdev_has_property(device->evdev, INPUT_PROP_SEMI_MT);
|
||||
|
||||
/* This device has a terrible resolution when two fingers are down,
|
||||
/* Semi-mt devices are not reliable for true multitouch data, so we
|
||||
* simply pretend they're single touch touchpads with BTN_TOOL bits.
|
||||
* Synaptics:
|
||||
* Terrible resolution when two fingers are down,
|
||||
* causing scroll jumps. The single-touch emulation ABS_X/Y is
|
||||
* accurate but the ABS_MT_POSITION touchpoints report the bounding
|
||||
* box and that causes jumps. So we simply pretend it's a single
|
||||
* touch touchpad with the BTN_TOOL bits.
|
||||
* See https://bugzilla.redhat.com/show_bug.cgi?id=1235175 for an
|
||||
* explanation.
|
||||
* box and that causes jumps. See https://bugzilla.redhat.com/1235175
|
||||
* Elantech:
|
||||
* On three-finger taps/clicks, one slot doesn't get a coordinate
|
||||
* assigned. See https://bugs.freedesktop.org/show_bug.cgi?id=93583
|
||||
* Alps:
|
||||
* If three fingers are set down in the same frame, one slot has the
|
||||
* coordinates 0/0 and may not get updated for several frames.
|
||||
* See https://bugzilla.redhat.com/show_bug.cgi?id=1295073
|
||||
*/
|
||||
if (tp->semi_mt &&
|
||||
(device->model_flags &
|
||||
(EVDEV_MODEL_JUMPING_SEMI_MT|EVDEV_MODEL_ELANTECH_TOUCHPAD))) {
|
||||
if (tp->semi_mt) {
|
||||
tp->num_slots = 1;
|
||||
tp->slot = 0;
|
||||
tp->has_mt = false;
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ START_TEST(gestures_cap)
|
|||
struct litest_device *dev = litest_current_device();
|
||||
struct libinput_device *device = dev->libinput_device;
|
||||
|
||||
if (litest_is_synaptics_semi_mt(dev))
|
||||
if (libevdev_has_property(dev->evdev, INPUT_PROP_SEMI_MT))
|
||||
ck_assert(!libinput_device_has_capability(device,
|
||||
LIBINPUT_DEVICE_CAP_GESTURE));
|
||||
else
|
||||
|
|
|
|||
|
|
@ -1500,18 +1500,22 @@ litest_touch_move_two_touches(struct litest_device *d,
|
|||
int steps, int sleep_ms)
|
||||
{
|
||||
for (int i = 0; i < steps - 1; i++) {
|
||||
litest_push_event_frame(d);
|
||||
litest_touch_move(d, 0, x0 + dx / steps * i,
|
||||
y0 + dy / steps * i);
|
||||
litest_touch_move(d, 1, x1 + dx / steps * i,
|
||||
y1 + dy / steps * i);
|
||||
litest_pop_event_frame(d);
|
||||
if (sleep_ms) {
|
||||
libinput_dispatch(d->libinput);
|
||||
msleep(sleep_ms);
|
||||
}
|
||||
libinput_dispatch(d->libinput);
|
||||
}
|
||||
litest_push_event_frame(d);
|
||||
litest_touch_move(d, 0, x0 + dx, y0 + dy);
|
||||
litest_touch_move(d, 1, x1 + dx, y1 + dy);
|
||||
litest_pop_event_frame(d);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
|
|
@ -552,16 +552,6 @@ litest_enable_buttonareas(struct litest_device *dev)
|
|||
litest_assert_int_eq(status, expected);
|
||||
}
|
||||
|
||||
static inline int
|
||||
litest_is_synaptics_semi_mt(struct litest_device *dev)
|
||||
{
|
||||
struct libevdev *evdev = dev->evdev;
|
||||
|
||||
return libevdev_has_property(evdev, INPUT_PROP_SEMI_MT) &&
|
||||
libevdev_get_id_vendor(evdev) == 0x2 &&
|
||||
libevdev_get_id_product(evdev) == 0x7;
|
||||
}
|
||||
|
||||
static inline void
|
||||
litest_enable_drag_lock(struct libinput_device *device)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -241,7 +241,7 @@ START_TEST(touchpad_1fg_multitap_n_drag_2fg)
|
|||
int range = _i,
|
||||
ntaps;
|
||||
|
||||
if (litest_is_synaptics_semi_mt(dev))
|
||||
if (libevdev_has_property(dev->evdev, INPUT_PROP_SEMI_MT))
|
||||
return;
|
||||
|
||||
litest_enable_tap(dev->libinput_device);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue