mirror of
https://gitlab.freedesktop.org/libinput/libinput.git
synced 2026-02-04 11:40:30 +01:00
touchpad: pretend the jumpy semi-mt touchpad is a single-touch touchpad
The first finger is accurate, it's just the second finger that is imprecise, so we can't handle it as a true touch. Instead, revert the device back to being a single-touch touchpad and use the fake touch bits for second finger handling. Two-finger scrolling thus becomes usable though we will lose out on other features like thumb detection. Useful scrolling trumps that though. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
parent
6933062dab
commit
7013a20f8b
3 changed files with 22 additions and 11 deletions
|
|
@ -1465,6 +1465,21 @@ 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,
|
||||
* 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.
|
||||
*/
|
||||
if (tp->semi_mt &&
|
||||
(device->model_flags & EVDEV_MODEL_JUMPING_SEMI_MT)) {
|
||||
tp->num_slots = 1;
|
||||
tp->slot = 0;
|
||||
tp->has_mt = false;
|
||||
}
|
||||
|
||||
ARRAY_FOR_EACH(max_touches, m) {
|
||||
if (libevdev_has_event_code(device->evdev,
|
||||
EV_KEY,
|
||||
|
|
@ -1526,11 +1541,7 @@ tp_scroll_get_methods(struct tp_dispatch *tp)
|
|||
{
|
||||
uint32_t methods = LIBINPUT_CONFIG_SCROLL_EDGE;
|
||||
|
||||
/* some Synaptics semi-mt touchpads have a terrible 2fg resolution,
|
||||
* causing scroll jumps. For all other 2fg touchpads, we enable 2fg
|
||||
* scrolling */
|
||||
if (tp->ntouches >= 2 &&
|
||||
(tp->device->model_flags & EVDEV_MODEL_JUMPING_SEMI_MT) == 0)
|
||||
if (tp->ntouches >= 2)
|
||||
methods |= LIBINPUT_CONFIG_SCROLL_2FG;
|
||||
|
||||
return methods;
|
||||
|
|
|
|||
|
|
@ -241,6 +241,9 @@ START_TEST(touchpad_1fg_multitap_n_drag_2fg)
|
|||
int range = _i,
|
||||
ntaps;
|
||||
|
||||
if (litest_is_synaptics_semi_mt(dev))
|
||||
return;
|
||||
|
||||
litest_enable_tap(dev->libinput_device);
|
||||
|
||||
litest_drain_events(li);
|
||||
|
|
|
|||
|
|
@ -402,14 +402,12 @@ START_TEST(touchpad_scroll_defaults)
|
|||
|
||||
method = libinput_device_config_scroll_get_methods(device);
|
||||
ck_assert(method & LIBINPUT_CONFIG_SCROLL_EDGE);
|
||||
if (libevdev_get_num_slots(evdev) > 1 &&
|
||||
!litest_is_synaptics_semi_mt(dev))
|
||||
if (libevdev_get_num_slots(evdev) > 1)
|
||||
ck_assert(method & LIBINPUT_CONFIG_SCROLL_2FG);
|
||||
else
|
||||
ck_assert((method & LIBINPUT_CONFIG_SCROLL_2FG) == 0);
|
||||
|
||||
if (libevdev_get_num_slots(evdev) > 1 &&
|
||||
!litest_is_synaptics_semi_mt(dev))
|
||||
if (libevdev_get_num_slots(evdev) > 1)
|
||||
expected = LIBINPUT_CONFIG_SCROLL_2FG;
|
||||
else
|
||||
expected = LIBINPUT_CONFIG_SCROLL_EDGE;
|
||||
|
|
@ -425,8 +423,7 @@ START_TEST(touchpad_scroll_defaults)
|
|||
status = libinput_device_config_scroll_set_method(device,
|
||||
LIBINPUT_CONFIG_SCROLL_2FG);
|
||||
|
||||
if (libevdev_get_num_slots(evdev) > 1 &&
|
||||
!litest_is_synaptics_semi_mt(dev))
|
||||
if (libevdev_get_num_slots(evdev) > 1)
|
||||
ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
|
||||
else
|
||||
ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_UNSUPPORTED);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue