From 2dd1b3ead0410149ccceed153dffdd5e83ef232b Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Thu, 30 Jul 2015 14:48:12 +1000 Subject: [PATCH 1/6] test: move the helper functions to the litest.h file To avoid duplication Signed-off-by: Peter Hutterer Reviewed-by: Hans de Goede --- test/litest.h | 93 ++++++++++++++++++++++ test/touchpad-buttons.c | 72 ++++++----------- test/touchpad-tap.c | 40 ++-------- test/touchpad.c | 171 ++++++++++++---------------------------- 4 files changed, 176 insertions(+), 200 deletions(-) diff --git a/test/litest.h b/test/litest.h index b5d0f491..8a4b33d1 100644 --- a/test/litest.h +++ b/test/litest.h @@ -472,6 +472,99 @@ litest_disable_tap(struct libinput_device *device) litest_assert_int_eq(status, expected); } +static inline bool +litest_has_2fg_scroll(struct litest_device *dev) +{ + struct libinput_device *device = dev->libinput_device; + + return !!(libinput_device_config_scroll_get_methods(device) & + LIBINPUT_CONFIG_SCROLL_2FG); +} + +static inline void +litest_enable_2fg_scroll(struct litest_device *dev) +{ + enum libinput_config_status status, expected; + struct libinput_device *device = dev->libinput_device; + + status = libinput_device_config_scroll_set_method(device, + LIBINPUT_CONFIG_SCROLL_2FG); + + expected = LIBINPUT_CONFIG_STATUS_SUCCESS; + litest_assert_int_eq(status, expected); +} + +static inline void +litest_enable_edge_scroll(struct litest_device *dev) +{ + enum libinput_config_status status, expected; + struct libinput_device *device = dev->libinput_device; + + status = libinput_device_config_scroll_set_method(device, + LIBINPUT_CONFIG_SCROLL_EDGE); + + expected = LIBINPUT_CONFIG_STATUS_SUCCESS; + litest_assert_int_eq(status, expected); +} + +static inline void +litest_enable_clickfinger(struct litest_device *dev) +{ + enum libinput_config_status status, expected; + struct libinput_device *device = dev->libinput_device; + + status = libinput_device_config_click_set_method(device, + LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER); + expected = LIBINPUT_CONFIG_STATUS_SUCCESS; + litest_assert_int_eq(status, expected); +} + +static inline void +litest_enable_buttonareas(struct litest_device *dev) +{ + enum libinput_config_status status, expected; + struct libinput_device *device = dev->libinput_device; + + status = libinput_device_config_click_set_method(device, + LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS); + expected = LIBINPUT_CONFIG_STATUS_SUCCESS; + 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) +{ + enum libinput_config_status status, expected; + + expected = LIBINPUT_CONFIG_STATUS_SUCCESS; + status = libinput_device_config_tap_set_drag_lock_enabled(device, + LIBINPUT_CONFIG_DRAG_LOCK_ENABLED); + + litest_assert_int_eq(status, expected); +} + +static inline void +litest_disable_drag_lock(struct libinput_device *device) +{ + enum libinput_config_status status, expected; + + expected = LIBINPUT_CONFIG_STATUS_SUCCESS; + status = libinput_device_config_tap_set_drag_lock_enabled(device, + LIBINPUT_CONFIG_DRAG_LOCK_DISABLED); + + litest_assert_int_eq(status, expected); +} + #define CK_DOUBLE_EQ_EPSILON 1E-3 #define ck_assert_double_eq(X,Y) \ do { \ diff --git a/test/touchpad-buttons.c b/test/touchpad-buttons.c index 2cd8133e..064c29ef 100644 --- a/test/touchpad-buttons.c +++ b/test/touchpad-buttons.c @@ -32,30 +32,6 @@ #include "libinput-util.h" #include "litest.h" -static void -enable_clickfinger(struct litest_device *dev) -{ - enum libinput_config_status status, expected; - struct libinput_device *device = dev->libinput_device; - - status = libinput_device_config_click_set_method(device, - LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER); - expected = LIBINPUT_CONFIG_STATUS_SUCCESS; - litest_assert_int_eq(status, expected); -} - -static void -enable_buttonareas(struct litest_device *dev) -{ - enum libinput_config_status status, expected; - struct libinput_device *device = dev->libinput_device; - - status = libinput_device_config_click_set_method(device, - LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS); - expected = LIBINPUT_CONFIG_STATUS_SUCCESS; - litest_assert_int_eq(status, expected); -} - START_TEST(touchpad_click_defaults_clickfinger) { struct litest_device *dev = litest_current_device(); @@ -141,7 +117,7 @@ START_TEST(touchpad_1fg_clickfinger) struct litest_device *dev = litest_current_device(); struct libinput *li = dev->libinput; - enable_clickfinger(dev); + litest_enable_clickfinger(dev); litest_drain_events(li); @@ -166,7 +142,7 @@ START_TEST(touchpad_1fg_clickfinger_no_touch) struct litest_device *dev = litest_current_device(); struct libinput *li = dev->libinput; - enable_clickfinger(dev); + litest_enable_clickfinger(dev); litest_drain_events(li); @@ -189,7 +165,7 @@ START_TEST(touchpad_2fg_clickfinger) struct litest_device *dev = litest_current_device(); struct libinput *li = dev->libinput; - enable_clickfinger(dev); + litest_enable_clickfinger(dev); litest_drain_events(li); @@ -219,7 +195,7 @@ START_TEST(touchpad_3fg_clickfinger) if (libevdev_get_num_slots(dev->evdev) < 3) return; - enable_clickfinger(dev); + litest_enable_clickfinger(dev); litest_drain_events(li); @@ -254,7 +230,7 @@ START_TEST(touchpad_3fg_clickfinger_btntool) !libevdev_has_event_code(dev->evdev, EV_KEY, BTN_TOOL_TRIPLETAP)) return; - enable_clickfinger(dev); + litest_enable_clickfinger(dev); litest_drain_events(li); @@ -293,7 +269,7 @@ START_TEST(touchpad_4fg_clickfinger) if (libevdev_get_num_slots(dev->evdev) < 4) return; - enable_clickfinger(dev); + litest_enable_clickfinger(dev); litest_drain_events(li); @@ -338,7 +314,7 @@ START_TEST(touchpad_4fg_clickfinger_btntool_2slots) !libevdev_has_event_code(dev->evdev, EV_KEY, BTN_TOOL_QUADTAP)) return; - enable_clickfinger(dev); + litest_enable_clickfinger(dev); litest_drain_events(li); @@ -384,7 +360,7 @@ START_TEST(touchpad_4fg_clickfinger_btntool_3slots) !libevdev_has_event_code(dev->evdev, EV_KEY, BTN_TOOL_TRIPLETAP)) return; - enable_clickfinger(dev); + litest_enable_clickfinger(dev); litest_drain_events(li); @@ -435,7 +411,7 @@ START_TEST(touchpad_2fg_clickfinger_distance) h < 50.0) small_touchpad = true; - enable_clickfinger(dev); + litest_enable_clickfinger(dev); litest_drain_events(li); @@ -490,7 +466,7 @@ START_TEST(touchpad_3fg_clickfinger_distance) if (libevdev_get_num_slots(dev->evdev) < 3) return; - enable_clickfinger(dev); + litest_enable_clickfinger(dev); litest_drain_events(li); @@ -524,7 +500,7 @@ START_TEST(touchpad_3fg_clickfinger_distance_btntool) if (libevdev_get_num_slots(dev->evdev) > 2) return; - enable_clickfinger(dev); + litest_enable_clickfinger(dev); litest_drain_events(li); @@ -628,7 +604,7 @@ START_TEST(touchpad_clickfinger_to_area_method) litest_drain_events(li); - enable_buttonareas(dev); + litest_enable_buttonareas(dev); litest_touch_down(dev, 0, 95, 95); litest_event(dev, EV_KEY, BTN_LEFT, 1); @@ -643,7 +619,7 @@ START_TEST(touchpad_clickfinger_to_area_method) litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_RELEASED); - enable_clickfinger(dev); + litest_enable_clickfinger(dev); litest_drain_events(li); @@ -671,7 +647,7 @@ START_TEST(touchpad_clickfinger_to_area_method_while_down) litest_drain_events(li); - enable_buttonareas(dev); + litest_enable_buttonareas(dev); litest_touch_down(dev, 0, 95, 95); litest_event(dev, EV_KEY, BTN_LEFT, 1); @@ -680,7 +656,7 @@ START_TEST(touchpad_clickfinger_to_area_method_while_down) litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED); - enable_clickfinger(dev); + litest_enable_clickfinger(dev); litest_event(dev, EV_KEY, BTN_LEFT, 0); litest_event(dev, EV_SYN, SYN_REPORT, 0); @@ -714,7 +690,7 @@ START_TEST(touchpad_area_to_clickfinger_method) struct litest_device *dev = litest_current_device(); struct libinput *li = dev->libinput; - enable_clickfinger(dev); + litest_enable_clickfinger(dev); litest_drain_events(li); @@ -732,7 +708,7 @@ START_TEST(touchpad_area_to_clickfinger_method) litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED); - enable_buttonareas(dev); + litest_enable_buttonareas(dev); litest_touch_down(dev, 0, 95, 95); litest_event(dev, EV_KEY, BTN_LEFT, 1); @@ -755,7 +731,7 @@ START_TEST(touchpad_area_to_clickfinger_method_while_down) struct litest_device *dev = litest_current_device(); struct libinput *li = dev->libinput; - enable_clickfinger(dev); + litest_enable_clickfinger(dev); litest_drain_events(li); @@ -766,7 +742,7 @@ START_TEST(touchpad_area_to_clickfinger_method_while_down) litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED); - enable_buttonareas(dev); + litest_enable_buttonareas(dev); litest_event(dev, EV_KEY, BTN_LEFT, 0); litest_event(dev, EV_SYN, SYN_REPORT, 0); @@ -797,7 +773,7 @@ START_TEST(touchpad_clickfinger_3fg_tool_position) struct litest_device *dev = litest_current_device(); struct libinput *li = dev->libinput; - enable_clickfinger(dev); + litest_enable_clickfinger(dev); litest_drain_events(li); /* one in thumb area, one in normal area + TRIPLETAP. spread is wide @@ -827,7 +803,7 @@ START_TEST(touchpad_clickfinger_4fg_tool_position) struct litest_device *dev = litest_current_device(); struct libinput *li = dev->libinput; - enable_clickfinger(dev); + litest_enable_clickfinger(dev); litest_drain_events(li); litest_touch_down(dev, 0, 5, 99); @@ -878,7 +854,7 @@ START_TEST(clickpad_btn_left) struct litest_device *dev = litest_current_device(); struct libinput *li = dev->libinput; - enable_buttonareas(dev); + litest_enable_buttonareas(dev); litest_drain_events(li); @@ -1487,7 +1463,7 @@ START_TEST(clickpad_topsoftbuttons_clickfinger) struct litest_device *dev = litest_current_device(); struct libinput *li = dev->libinput; - enable_clickfinger(dev); + litest_enable_clickfinger(dev); litest_drain_events(li); @@ -1534,7 +1510,7 @@ START_TEST(clickpad_topsoftbuttons_clickfinger_dev_disabled) libinput_device_config_send_events_set_mode(dev->libinput_device, LIBINPUT_CONFIG_SEND_EVENTS_DISABLED); - enable_clickfinger(dev); + litest_enable_clickfinger(dev); litest_drain_events(li); litest_touch_down(dev, 0, 90, 5); diff --git a/test/touchpad-tap.c b/test/touchpad-tap.c index f6986e70..00afcdbe 100644 --- a/test/touchpad-tap.c +++ b/test/touchpad-tap.c @@ -32,30 +32,6 @@ #include "libinput-util.h" #include "litest.h" -static inline void -enable_drag_lock(struct libinput_device *device) -{ - enum libinput_config_status status, expected; - - expected = LIBINPUT_CONFIG_STATUS_SUCCESS; - status = libinput_device_config_tap_set_drag_lock_enabled(device, - LIBINPUT_CONFIG_DRAG_LOCK_ENABLED); - - litest_assert_int_eq(status, expected); -} - -static inline void -disable_drag_lock(struct libinput_device *device) -{ - enum libinput_config_status status, expected; - - expected = LIBINPUT_CONFIG_STATUS_SUCCESS; - status = libinput_device_config_tap_set_drag_lock_enabled(device, - LIBINPUT_CONFIG_DRAG_LOCK_DISABLED); - - litest_assert_int_eq(status, expected); -} - START_TEST(touchpad_1fg_tap) { struct litest_device *dev = litest_current_device(); @@ -467,7 +443,7 @@ START_TEST(touchpad_1fg_multitap_n_drag_tap) ntaps; litest_enable_tap(dev->libinput_device); - enable_drag_lock(dev->libinput_device); + litest_enable_drag_lock(dev->libinput_device); litest_drain_events(li); @@ -540,7 +516,7 @@ START_TEST(touchpad_1fg_multitap_n_drag_tap_click) ntaps; litest_enable_tap(dev->libinput_device); - enable_drag_lock(dev->libinput_device); + litest_enable_drag_lock(dev->libinput_device); litest_drain_events(li); @@ -621,7 +597,7 @@ START_TEST(touchpad_1fg_tap_n_drag) struct libinput_event_pointer *ptrev __attribute__((unused)); litest_enable_tap(dev->libinput_device); - disable_drag_lock(dev->libinput_device); + litest_disable_drag_lock(dev->libinput_device); litest_drain_events(li); @@ -663,7 +639,7 @@ START_TEST(touchpad_1fg_tap_n_drag_draglock) struct libinput *li = dev->libinput; litest_enable_tap(dev->libinput_device); - enable_drag_lock(dev->libinput_device); + litest_enable_drag_lock(dev->libinput_device); litest_drain_events(li); @@ -704,7 +680,7 @@ START_TEST(touchpad_1fg_tap_n_drag_draglock_tap) struct libinput *li = dev->libinput; litest_enable_tap(dev->libinput_device); - enable_drag_lock(dev->libinput_device); + litest_enable_drag_lock(dev->libinput_device); litest_drain_events(li); @@ -746,7 +722,7 @@ START_TEST(touchpad_1fg_tap_n_drag_draglock_tap_click) struct libinput *li = dev->libinput; litest_enable_tap(dev->libinput_device); - enable_drag_lock(dev->libinput_device); + litest_enable_drag_lock(dev->libinput_device); litest_drain_events(li); @@ -791,7 +767,7 @@ START_TEST(touchpad_1fg_tap_n_drag_draglock_timeout) struct libinput *li = dev->libinput; litest_enable_tap(dev->libinput_device); - enable_drag_lock(dev->libinput_device); + litest_enable_drag_lock(dev->libinput_device); litest_drain_events(li); @@ -822,7 +798,7 @@ START_TEST(touchpad_2fg_tap_n_drag) struct libinput *li = dev->libinput; litest_enable_tap(dev->libinput_device); - disable_drag_lock(dev->libinput_device); + litest_disable_drag_lock(dev->libinput_device); litest_drain_events(li); diff --git a/test/touchpad.c b/test/touchpad.c index 84898618..a6989e79 100644 --- a/test/touchpad.c +++ b/test/touchpad.c @@ -32,75 +32,6 @@ #include "libinput-util.h" #include "litest.h" -static bool -has_2fg_scroll(struct litest_device *dev) -{ - struct libinput_device *device = dev->libinput_device; - - return !!(libinput_device_config_scroll_get_methods(device) & - LIBINPUT_CONFIG_SCROLL_2FG); -} - -static void -enable_2fg_scroll(struct litest_device *dev) -{ - enum libinput_config_status status, expected; - struct libinput_device *device = dev->libinput_device; - - status = libinput_device_config_scroll_set_method(device, - LIBINPUT_CONFIG_SCROLL_2FG); - - expected = LIBINPUT_CONFIG_STATUS_SUCCESS; - litest_assert_int_eq(status, expected); -} - -static void -enable_edge_scroll(struct litest_device *dev) -{ - enum libinput_config_status status, expected; - struct libinput_device *device = dev->libinput_device; - - status = libinput_device_config_scroll_set_method(device, - LIBINPUT_CONFIG_SCROLL_EDGE); - - expected = LIBINPUT_CONFIG_STATUS_SUCCESS; - litest_assert_int_eq(status, expected); -} - -static void -enable_clickfinger(struct litest_device *dev) -{ - enum libinput_config_status status, expected; - struct libinput_device *device = dev->libinput_device; - - status = libinput_device_config_click_set_method(device, - LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER); - expected = LIBINPUT_CONFIG_STATUS_SUCCESS; - litest_assert_int_eq(status, expected); -} - -static void -enable_buttonareas(struct litest_device *dev) -{ - enum libinput_config_status status, expected; - struct libinput_device *device = dev->libinput_device; - - status = libinput_device_config_click_set_method(device, - LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS); - expected = LIBINPUT_CONFIG_STATUS_SUCCESS; - litest_assert_int_eq(status, expected); -} - -static inline int -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; -} - START_TEST(touchpad_1fg_motion) { struct litest_device *dev = litest_current_device(); @@ -192,10 +123,10 @@ START_TEST(touchpad_2fg_scroll) struct litest_device *dev = litest_current_device(); struct libinput *li = dev->libinput; - if (!has_2fg_scroll(dev)) + if (!litest_has_2fg_scroll(dev)) return; - enable_2fg_scroll(dev); + litest_enable_2fg_scroll(dev); litest_drain_events(li); test_2fg_scroll(dev, 0.1, 40, 0); @@ -222,7 +153,7 @@ START_TEST(touchpad_2fg_scroll_slow_distance) const struct input_absinfo *y; double y_move; - if (!has_2fg_scroll(dev)) + if (!litest_has_2fg_scroll(dev)) return; /* We want to move > 5 mm. */ @@ -234,7 +165,7 @@ START_TEST(touchpad_2fg_scroll_slow_distance) y_move = 20.0; } - enable_2fg_scroll(dev); + litest_enable_2fg_scroll(dev); litest_drain_events(li); litest_touch_down(dev, 0, 49, 50); @@ -279,10 +210,10 @@ START_TEST(touchpad_2fg_scroll_source) struct libinput_event *event; struct libinput_event_pointer *ptrev; - if (!has_2fg_scroll(dev)) + if (!litest_has_2fg_scroll(dev)) return; - enable_2fg_scroll(dev); + litest_enable_2fg_scroll(dev); litest_drain_events(li); test_2fg_scroll(dev, 0, 30, 0); @@ -304,10 +235,10 @@ START_TEST(touchpad_2fg_scroll_semi_mt) struct litest_device *dev = litest_current_device(); struct libinput *li = dev->libinput; - if (!has_2fg_scroll(dev)) + if (!litest_has_2fg_scroll(dev)) return; - enable_2fg_scroll(dev); + litest_enable_2fg_scroll(dev); litest_drain_events(li); litest_touch_down(dev, 0, 20, 20); @@ -328,10 +259,10 @@ START_TEST(touchpad_2fg_scroll_return_to_motion) struct litest_device *dev = litest_current_device(); struct libinput *li = dev->libinput; - if (!has_2fg_scroll(dev)) + if (!litest_has_2fg_scroll(dev)) return; - enable_2fg_scroll(dev); + litest_enable_2fg_scroll(dev); litest_drain_events(li); /* start with motion */ @@ -399,10 +330,10 @@ START_TEST(touchpad_scroll_natural_2fg) struct litest_device *dev = litest_current_device(); struct libinput *li = dev->libinput; - if (!has_2fg_scroll(dev)) + if (!litest_has_2fg_scroll(dev)) return; - enable_2fg_scroll(dev); + litest_enable_2fg_scroll(dev); litest_drain_events(li); libinput_device_config_scroll_set_natural_scroll_enabled(dev->libinput_device, 1); @@ -425,7 +356,7 @@ START_TEST(touchpad_edge_scroll) struct libinput *li = dev->libinput; litest_drain_events(li); - enable_edge_scroll(dev); + litest_enable_edge_scroll(dev); litest_touch_down(dev, 0, 99, 20); litest_touch_move_to(dev, 0, 99, 20, 99, 80, 10, 0); @@ -472,13 +403,13 @@ 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 && - !is_synaptics_semi_mt(dev)) + !litest_is_synaptics_semi_mt(dev)) ck_assert(method & LIBINPUT_CONFIG_SCROLL_2FG); else ck_assert((method & LIBINPUT_CONFIG_SCROLL_2FG) == 0); if (libevdev_get_num_slots(evdev) > 1 && - !is_synaptics_semi_mt(dev)) + !litest_is_synaptics_semi_mt(dev)) expected = LIBINPUT_CONFIG_SCROLL_2FG; else expected = LIBINPUT_CONFIG_SCROLL_EDGE; @@ -495,7 +426,7 @@ START_TEST(touchpad_scroll_defaults) LIBINPUT_CONFIG_SCROLL_2FG); if (libevdev_get_num_slots(evdev) > 1 && - !is_synaptics_semi_mt(dev)) + !litest_is_synaptics_semi_mt(dev)) ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS); else ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_UNSUPPORTED); @@ -522,7 +453,7 @@ START_TEST(touchpad_edge_scroll_timeout) } litest_drain_events(li); - enable_edge_scroll(dev); + litest_enable_edge_scroll(dev); litest_touch_down(dev, 0, 99, 20); libinput_dispatch(li); @@ -568,7 +499,7 @@ START_TEST(touchpad_edge_scroll_no_motion) struct libinput *li = dev->libinput; litest_drain_events(li); - enable_edge_scroll(dev); + litest_enable_edge_scroll(dev); litest_touch_down(dev, 0, 99, 10); litest_touch_move_to(dev, 0, 99, 10, 99, 70, 10, 0); @@ -590,7 +521,7 @@ START_TEST(touchpad_edge_scroll_no_edge_after_motion) struct libinput *li = dev->libinput; litest_drain_events(li); - enable_edge_scroll(dev); + litest_enable_edge_scroll(dev); /* moving into the edge zone must not trigger scroll events */ litest_touch_down(dev, 0, 20, 20); @@ -612,7 +543,7 @@ START_TEST(touchpad_edge_scroll_source) struct libinput_event_pointer *ptrev; litest_drain_events(li); - enable_edge_scroll(dev); + litest_enable_edge_scroll(dev); litest_touch_down(dev, 0, 99, 20); litest_touch_move_to(dev, 0, 99, 20, 99, 80, 10, 0); @@ -637,7 +568,7 @@ START_TEST(touchpad_edge_scroll_no_2fg) struct libinput *li = dev->libinput; litest_drain_events(li); - enable_edge_scroll(dev); + litest_enable_edge_scroll(dev); litest_touch_down(dev, 0, 49, 50); litest_touch_down(dev, 1, 51, 50); @@ -656,8 +587,8 @@ START_TEST(touchpad_edge_scroll_into_buttonareas) struct litest_device *dev = litest_current_device(); struct libinput *li = dev->libinput; - enable_buttonareas(dev); - enable_edge_scroll(dev); + litest_enable_buttonareas(dev); + litest_enable_edge_scroll(dev); litest_drain_events(li); litest_touch_down(dev, 0, 99, 40); @@ -682,8 +613,8 @@ START_TEST(touchpad_edge_scroll_within_buttonareas) struct litest_device *dev = litest_current_device(); struct libinput *li = dev->libinput; - enable_buttonareas(dev); - enable_edge_scroll(dev); + litest_enable_buttonareas(dev); + litest_enable_edge_scroll(dev); litest_drain_events(li); litest_touch_down(dev, 0, 20, 99); @@ -710,8 +641,8 @@ START_TEST(touchpad_edge_scroll_buttonareas_click_stops_scroll) struct libinput_event_pointer *ptrev; double val; - enable_buttonareas(dev); - enable_edge_scroll(dev); + litest_enable_buttonareas(dev); + litest_enable_edge_scroll(dev); litest_drain_events(li); litest_touch_down(dev, 0, 20, 95); @@ -757,8 +688,8 @@ START_TEST(touchpad_edge_scroll_clickfinger_click_stops_scroll) struct libinput_event_pointer *ptrev; double val; - enable_clickfinger(dev); - enable_edge_scroll(dev); + litest_enable_clickfinger(dev); + litest_enable_edge_scroll(dev); litest_drain_events(li); litest_touch_down(dev, 0, 20, 95); @@ -802,7 +733,7 @@ START_TEST(touchpad_edge_scroll_into_area) struct litest_device *dev = litest_current_device(); struct libinput *li = dev->libinput; - enable_edge_scroll(dev); + litest_enable_edge_scroll(dev); litest_drain_events(li); /* move into area, move vertically, move back to edge */ @@ -846,10 +777,10 @@ START_TEST(touchpad_palm_detect_at_edge) struct libinput *li = dev->libinput; if (!touchpad_has_palm_detect_size(dev) || - !has_2fg_scroll(dev)) + !litest_has_2fg_scroll(dev)) return; - enable_2fg_scroll(dev); + litest_enable_2fg_scroll(dev); litest_disable_tap(dev->libinput_device); @@ -875,7 +806,7 @@ START_TEST(touchpad_no_palm_detect_at_edge_for_edge_scrolling) if (!touchpad_has_palm_detect_size(dev)) return; - enable_edge_scroll(dev); + litest_enable_edge_scroll(dev); litest_drain_events(li); @@ -893,10 +824,10 @@ START_TEST(touchpad_palm_detect_at_bottom_corners) struct libinput *li = dev->libinput; if (!touchpad_has_palm_detect_size(dev) || - !has_2fg_scroll(dev)) + !litest_has_2fg_scroll(dev)) return; - enable_2fg_scroll(dev); + litest_enable_2fg_scroll(dev); litest_disable_tap(dev->libinput_device); @@ -922,10 +853,10 @@ START_TEST(touchpad_palm_detect_at_top_corners) struct libinput *li = dev->libinput; if (!touchpad_has_palm_detect_size(dev) || - !has_2fg_scroll(dev)) + !litest_has_2fg_scroll(dev)) return; - enable_2fg_scroll(dev); + litest_enable_2fg_scroll(dev); litest_disable_tap(dev->libinput_device); @@ -951,10 +882,10 @@ START_TEST(touchpad_palm_detect_palm_stays_palm) struct libinput *li = dev->libinput; if (!touchpad_has_palm_detect_size(dev) || - !has_2fg_scroll(dev)) + !litest_has_2fg_scroll(dev)) return; - enable_2fg_scroll(dev); + litest_enable_2fg_scroll(dev); litest_disable_tap(dev->libinput_device); @@ -973,10 +904,10 @@ START_TEST(touchpad_palm_detect_palm_becomes_pointer) struct libinput *li = dev->libinput; if (!touchpad_has_palm_detect_size(dev) || - !has_2fg_scroll(dev)) + !litest_has_2fg_scroll(dev)) return; - enable_2fg_scroll(dev); + litest_enable_2fg_scroll(dev); litest_disable_tap(dev->libinput_device); @@ -2571,7 +2502,7 @@ START_TEST(touchpad_dwt_edge_scroll) if (!has_disable_while_typing(touchpad)) return; - enable_edge_scroll(touchpad); + litest_enable_edge_scroll(touchpad); keyboard = litest_add_device(li, LITEST_KEYBOARD); litest_drain_events(li); @@ -2618,7 +2549,7 @@ START_TEST(touchpad_dwt_edge_scroll_interrupt) if (!has_disable_while_typing(touchpad)) return; - enable_edge_scroll(touchpad); + litest_enable_edge_scroll(touchpad); keyboard = litest_add_device(li, LITEST_KEYBOARD); litest_drain_events(li); @@ -2977,7 +2908,7 @@ START_TEST(touchpad_thumb_update_no_motion) }; litest_disable_tap(dev->libinput_device); - enable_clickfinger(dev); + litest_enable_clickfinger(dev); if (!has_thumb_detect(dev)) return; @@ -3003,7 +2934,7 @@ START_TEST(touchpad_thumb_moving) }; litest_disable_tap(dev->libinput_device); - enable_clickfinger(dev); + litest_enable_clickfinger(dev); if (!has_thumb_detect(dev)) return; @@ -3127,7 +3058,7 @@ START_TEST(touchpad_thumb_edgescroll) if (!has_thumb_detect(dev)) return; - enable_edge_scroll(dev); + litest_enable_edge_scroll(dev); litest_disable_tap(dev->libinput_device); litest_drain_events(li); @@ -3159,7 +3090,7 @@ START_TEST(touchpad_thumb_tap_begin) return; litest_enable_tap(dev->libinput_device); - enable_clickfinger(dev); + litest_enable_clickfinger(dev); litest_drain_events(li); /* touch down is a thumb */ @@ -3192,7 +3123,7 @@ START_TEST(touchpad_thumb_tap_touch) return; litest_enable_tap(dev->libinput_device); - enable_clickfinger(dev); + litest_enable_clickfinger(dev); litest_drain_events(li); /* event after touch down is thumb */ @@ -3225,7 +3156,7 @@ START_TEST(touchpad_thumb_tap_hold) return; litest_enable_tap(dev->libinput_device); - enable_clickfinger(dev); + litest_enable_clickfinger(dev); litest_drain_events(li); /* event in state HOLD is thumb */ @@ -3259,7 +3190,7 @@ START_TEST(touchpad_thumb_tap_hold_2ndfg) return; litest_enable_tap(dev->libinput_device); - enable_clickfinger(dev); + litest_enable_clickfinger(dev); litest_drain_events(li); /* event in state HOLD is thumb */ @@ -3368,7 +3299,7 @@ START_TEST(touchpad_tool_tripletap_touch_count) * https://bugs.freedesktop.org/show_bug.cgi?id=91352 */ litest_drain_events(li); - enable_clickfinger(dev); + litest_enable_clickfinger(dev); /* touch 1 down */ litest_event(dev, EV_ABS, ABS_MT_SLOT, 0); From 7b6bd641c7dcd03ff13ced94827b971bf2df9290 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Thu, 30 Jul 2015 10:43:30 +1000 Subject: [PATCH 2/6] touchpad: move CAP_GESTURE assignment to the touchpad code That's where we set the pointer cap too. No functional changes. Signed-off-by: Peter Hutterer Reviewed-by: Hans de Goede --- src/evdev-mt-touchpad.c | 1 + src/evdev.c | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c index ee1612e4..e110b9ae 100644 --- a/src/evdev-mt-touchpad.c +++ b/src/evdev-mt-touchpad.c @@ -1918,6 +1918,7 @@ tp_init(struct tp_dispatch *tp, return -1; device->seat_caps |= EVDEV_DEVICE_POINTER; + device->seat_caps |= EVDEV_DEVICE_GESTURE; return 0; } diff --git a/src/evdev.c b/src/evdev.c index ee904d31..aba124be 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -1950,7 +1950,6 @@ evdev_configure_device(struct evdev_device *device) if (udev_tags & EVDEV_UDEV_TAG_TOUCHPAD) { device->dispatch = evdev_mt_touchpad_create(device); - device->seat_caps |= EVDEV_DEVICE_GESTURE; log_info(libinput, "input device '%s', %s is a touchpad\n", device->devname, devnode); From 6295118c8e1bd65e2ba562547cbdd2a080fb8e3f Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Thu, 30 Jul 2015 10:48:39 +1000 Subject: [PATCH 3/6] touchpad: make gestures optional Not all multi-finger touchpads are able to reliably produce gestures, so make it optional. This patch just adds a boolean (currently always true) that gets set on touchpad init time, i.e. it is not run-time configurable. Three and four-finger gestures are filtered out in gesture_notify(), if the cap isn't set the event is discarded. For two-finger gestures we prevent a transition to PINCH, so we don't inadvertently detect a pinch gesture and then not send events. This way, a 2fg gesture is always scroll. Signed-off-by: Peter Hutterer Reviewed-by: Hans de Goede --- src/evdev-mt-touchpad-gestures.c | 5 ++++- src/evdev-mt-touchpad.c | 3 ++- src/evdev-mt-touchpad.h | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/evdev-mt-touchpad-gestures.c b/src/evdev-mt-touchpad-gestures.c index 3b1839e4..da03c262 100644 --- a/src/evdev-mt-touchpad-gestures.c +++ b/src/evdev-mt-touchpad-gestures.c @@ -295,7 +295,7 @@ tp_gesture_twofinger_handle_state_unknown(struct tp_dispatch *tp, uint64_t time) ((dir2 & 0x80) && (dir1 & 0x01))) { tp_gesture_set_scroll_buildup(tp); return GESTURE_2FG_STATE_SCROLL; - } else { + } else if (tp->gesture.enabled) { tp_gesture_get_pinch_info(tp, &tp->gesture.initial_distance, &tp->gesture.angle, @@ -303,6 +303,8 @@ tp_gesture_twofinger_handle_state_unknown(struct tp_dispatch *tp, uint64_t time) tp->gesture.prev_scale = 1.0; return GESTURE_2FG_STATE_PINCH; } + + return GESTURE_2FG_STATE_UNKNOWN; } static enum tp_gesture_2fg_state @@ -563,6 +565,7 @@ tp_gesture_handle_state(struct tp_dispatch *tp, uint64_t time) int tp_init_gesture(struct tp_dispatch *tp) { + tp->gesture.enabled = true; tp->gesture.twofinger_state = GESTURE_2FG_STATE_NONE; libinput_timer_init(&tp->gesture.finger_count_switch_timer, diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c index e110b9ae..af1cd47a 100644 --- a/src/evdev-mt-touchpad.c +++ b/src/evdev-mt-touchpad.c @@ -1918,7 +1918,8 @@ tp_init(struct tp_dispatch *tp, return -1; device->seat_caps |= EVDEV_DEVICE_POINTER; - device->seat_caps |= EVDEV_DEVICE_GESTURE; + if (tp->gesture.enabled) + device->seat_caps |= EVDEV_DEVICE_GESTURE; return 0; } diff --git a/src/evdev-mt-touchpad.h b/src/evdev-mt-touchpad.h index a7961e75..3bd84258 100644 --- a/src/evdev-mt-touchpad.h +++ b/src/evdev-mt-touchpad.h @@ -246,6 +246,7 @@ struct tp_dispatch { } accel; struct { + bool enabled; bool started; unsigned int finger_count; unsigned int finger_count_pending; From 96d0e06f13099f7107c3177e1e6ba8f702e86b83 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Thu, 30 Jul 2015 11:07:58 +1000 Subject: [PATCH 4/6] touchpad: disable gestures on Synaptics semi-mt touchpads Follow-up to eb146677e, if we disable 2fg scrolling on those touchpads we should also disable gestures. The data doesn't magically become more useful. Signed-off-by: Peter Hutterer Reviewed-by: Hans de Goede --- src/evdev-mt-touchpad-gestures.c | 6 +++++- test/gestures.c | 8 ++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/evdev-mt-touchpad-gestures.c b/src/evdev-mt-touchpad-gestures.c index da03c262..14821362 100644 --- a/src/evdev-mt-touchpad-gestures.c +++ b/src/evdev-mt-touchpad-gestures.c @@ -565,7 +565,11 @@ tp_gesture_handle_state(struct tp_dispatch *tp, uint64_t time) int tp_init_gesture(struct tp_dispatch *tp) { - tp->gesture.enabled = true; + if (tp->device->model_flags & EVDEV_MODEL_JUMPING_SEMI_MT) + tp->gesture.enabled = false; + else + tp->gesture.enabled = true; + tp->gesture.twofinger_state = GESTURE_2FG_STATE_NONE; libinput_timer_init(&tp->gesture.finger_count_switch_timer, diff --git a/test/gestures.c b/test/gestures.c index 3b7ba7bf..9e447248 100644 --- a/test/gestures.c +++ b/test/gestures.c @@ -34,8 +34,12 @@ START_TEST(gestures_cap) struct litest_device *dev = litest_current_device(); struct libinput_device *device = dev->libinput_device; - ck_assert(libinput_device_has_capability(device, - LIBINPUT_DEVICE_CAP_GESTURE)); + if (litest_is_synaptics_semi_mt(dev)) + ck_assert(!libinput_device_has_capability(device, + LIBINPUT_DEVICE_CAP_GESTURE)); + else + ck_assert(libinput_device_has_capability(device, + LIBINPUT_DEVICE_CAP_GESTURE)); } END_TEST From 6933062dab0fa65d131e44bab2f7ace3563d9731 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Thu, 30 Jul 2015 11:46:13 +1000 Subject: [PATCH 5/6] touchpad: elantech touchpads can use a 2mm gesture motion threshold Unlike ALPS and Synaptics semi-mt touchpads, the Elantech touchpads appear to be precise enough to allow a smaller motion threshold before we decide on the type of gesture (pinch vs scroll). https://bugs.freedesktop.org/show_bug.cgi?id=91475 Signed-off-by: Peter Hutterer Reviewed-by: Hans de Goede --- src/evdev-mt-touchpad-gestures.c | 4 +++- src/evdev.c | 1 + src/evdev.h | 1 + udev/90-libinput-model-quirks.hwdb | 1 + 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/evdev-mt-touchpad-gestures.c b/src/evdev-mt-touchpad-gestures.c index 14821362..60174168 100644 --- a/src/evdev-mt-touchpad-gestures.c +++ b/src/evdev-mt-touchpad-gestures.c @@ -189,8 +189,10 @@ tp_gesture_get_direction(struct tp_dispatch *tp, struct tp_touch *touch) /* * 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) + 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(2); diff --git a/src/evdev.c b/src/evdev.c index aba124be..17c26043 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -1543,6 +1543,7 @@ evdev_read_model_flags(struct evdev_device *device) { "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 }, + { "LIBINPUT_MODEL_ELANTECH_TOUCHPAD", EVDEV_MODEL_ELANTECH_TOUCHPAD }, { NULL, EVDEV_MODEL_DEFAULT }, }; const struct model_map *m = model_map; diff --git a/src/evdev.h b/src/evdev.h index c7017ba5..be5df0d0 100644 --- a/src/evdev.h +++ b/src/evdev.h @@ -106,6 +106,7 @@ enum evdev_device_model { EVDEV_MODEL_ALPS_TOUCHPAD = (1 << 8), EVDEV_MODEL_SYNAPTICS_SERIAL_TOUCHPAD = (1 << 9), EVDEV_MODEL_JUMPING_SEMI_MT = (1 << 10), + EVDEV_MODEL_ELANTECH_TOUCHPAD = (1 << 11), }; struct mt_slot { diff --git a/udev/90-libinput-model-quirks.hwdb b/udev/90-libinput-model-quirks.hwdb index a34b8f17..cf4fbfaa 100644 --- a/udev/90-libinput-model-quirks.hwdb +++ b/udev/90-libinput-model-quirks.hwdb @@ -39,6 +39,7 @@ libinput:touchpad:input:b0005v05ACp* ########################################## libinput:name:*ETPS/2 Elantech Touchpad*:dmi:* LIBINPUT_ATTR_RESOLUTION_HINT=31x31 + LIBINPUT_MODEL_ELANTECH_TOUCHPAD=1 ########################################## # Google From 7013a20f8b6a441a5f80b84aa261c32dd8011f95 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Thu, 30 Jul 2015 11:54:38 +1000 Subject: [PATCH 6/6] 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 Reviewed-by: Hans de Goede --- src/evdev-mt-touchpad.c | 21 ++++++++++++++++----- test/touchpad-tap.c | 3 +++ test/touchpad.c | 9 +++------ 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c index af1cd47a..64ec4466 100644 --- a/src/evdev-mt-touchpad.c +++ b/src/evdev-mt-touchpad.c @@ -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; diff --git a/test/touchpad-tap.c b/test/touchpad-tap.c index 00afcdbe..62c7a5c3 100644 --- a/test/touchpad-tap.c +++ b/test/touchpad-tap.c @@ -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); diff --git a/test/touchpad.c b/test/touchpad.c index a6989e79..77c1d2d1 100644 --- a/test/touchpad.c +++ b/test/touchpad.c @@ -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);