diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/evdev-mt-touchpad.c | 36 | ||||
-rw-r--r-- | src/evdev.c | 1 | ||||
-rw-r--r-- | src/evdev.h | 1 |
3 files changed, 31 insertions, 7 deletions
diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c index 6718b616..257af999 100644 --- a/src/evdev-mt-touchpad.c +++ b/src/evdev-mt-touchpad.c @@ -1521,18 +1521,29 @@ tp_init_accel(struct tp_dispatch *tp, double diagonal) } static uint32_t -tp_scroll_config_scroll_method_get_methods(struct libinput_device *device) +tp_scroll_get_methods(struct tp_dispatch *tp) { - struct evdev_device *evdev = (struct evdev_device*)device; - struct tp_dispatch *tp = (struct tp_dispatch*)evdev->dispatch; uint32_t methods = LIBINPUT_CONFIG_SCROLL_EDGE; - if (tp->ntouches >= 2) + /* 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) methods |= LIBINPUT_CONFIG_SCROLL_2FG; return methods; } +static uint32_t +tp_scroll_config_scroll_method_get_methods(struct libinput_device *device) +{ + struct evdev_device *evdev = (struct evdev_device*)device; + struct tp_dispatch *tp = (struct tp_dispatch*)evdev->dispatch; + + return tp_scroll_get_methods(tp); +} + static enum libinput_config_status tp_scroll_config_scroll_method_set_method(struct libinput_device *device, enum libinput_config_scroll_method method) @@ -1564,10 +1575,21 @@ tp_scroll_config_scroll_method_get_method(struct libinput_device *device) static enum libinput_config_scroll_method tp_scroll_get_default_method(struct tp_dispatch *tp) { - if (tp->ntouches >= 2) - return LIBINPUT_CONFIG_SCROLL_2FG; + uint32_t methods; + enum libinput_config_scroll_method method; + + methods = tp_scroll_get_methods(tp); + + if (methods & LIBINPUT_CONFIG_SCROLL_2FG) + method = LIBINPUT_CONFIG_SCROLL_2FG; else - return LIBINPUT_CONFIG_SCROLL_EDGE; + method = LIBINPUT_CONFIG_SCROLL_EDGE; + + if ((methods & method) == 0) + log_bug_libinput(tp_libinput_context(tp), + "Invalid default scroll method %d\n", + method); + return method; } static enum libinput_config_scroll_method diff --git a/src/evdev.c b/src/evdev.c index 78d1f5df..0fc5a649 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -1542,6 +1542,7 @@ evdev_read_model_flags(struct evdev_device *device) { "LIBINPUT_MODEL_WACOM_TOUCHPAD", EVDEV_MODEL_WACOM_TOUCHPAD }, { "LIBINPUT_MODEL_ALPS_TOUCHPAD", EVDEV_MODEL_ALPS_TOUCHPAD }, { "LIBINPUT_MODEL_SYNAPTICS_SERIAL_TOUCHPAD", EVDEV_MODEL_SYNAPTICS_SERIAL_TOUCHPAD }, + { "LIBINPUT_MODEL_JUMPING_SEMI_MT", EVDEV_MODEL_JUMPING_SEMI_MT }, { NULL, EVDEV_MODEL_DEFAULT }, }; const struct model_map *m = model_map; diff --git a/src/evdev.h b/src/evdev.h index 36eac217..cc61c5fb 100644 --- a/src/evdev.h +++ b/src/evdev.h @@ -105,6 +105,7 @@ enum evdev_device_model { EVDEV_MODEL_WACOM_TOUCHPAD = (1 << 7), EVDEV_MODEL_ALPS_TOUCHPAD = (1 << 8), EVDEV_MODEL_SYNAPTICS_SERIAL_TOUCHPAD = (1 << 9), + EVDEV_MODEL_JUMPING_SEMI_MT = (1 << 10), }; struct mt_slot { |