From 875e1d1b100ae92b7d074b63caae876a82b7c4db Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Mon, 22 Jun 2015 11:06:25 +1000 Subject: [PATCH] touchpad: hook up drag lock configuration Signed-off-by: Peter Hutterer Reviewed-by: Hans de Goede --- doc/touchpad-tap-state-machine.svg | 726 +++++++++++++++-------------- src/evdev-mt-touchpad-tap.c | 36 +- src/evdev-mt-touchpad.h | 2 + test/touchpad-tap.c | 89 +++- 4 files changed, 506 insertions(+), 347 deletions(-) diff --git a/doc/touchpad-tap-state-machine.svg b/doc/touchpad-tap-state-machine.svg index 39b0b86b..89c34fa0 100644 --- a/doc/touchpad-tap-state-machine.svg +++ b/doc/touchpad-tap-state-machine.svg @@ -1,16 +1,14 @@ - - - - - - - - + + + + + + @@ -28,15 +26,15 @@ finger down - - + + finger up - - + + @@ -49,8 +47,8 @@ timeout - - + + @@ -58,8 +56,8 @@ threshold - - + + @@ -67,8 +65,8 @@ finger down - - + + @@ -81,8 +79,8 @@ finger up - - + + @@ -102,10 +100,10 @@ timeout - - - - + + + + @@ -120,10 +118,10 @@ release - - - - + + + + @@ -134,8 +132,8 @@ timeout - - + + @@ -143,8 +141,8 @@ finger down - - + + @@ -157,19 +155,19 @@ finger up - + - + btn1 - + release - - + + - - + + @@ -182,15 +180,15 @@ finger down - - + + TOUCH_3 - - + + @@ -214,8 +212,8 @@ threshold - - + + @@ -226,8 +224,8 @@ timeout - - + + @@ -235,8 +233,8 @@ finger up - - + + @@ -249,24 +247,24 @@ finger down - - - - + + + + DRAGGING_OR_DOUBLETAP - - + + timeout - - + + @@ -274,8 +272,8 @@ finger up - - + + @@ -297,8 +295,8 @@ release - - + + @@ -306,8 +304,8 @@ finger down - - + + @@ -315,10 +313,10 @@ threshold - - - - + + + + @@ -331,10 +329,10 @@ finger up - - - - + + + + @@ -342,12 +340,12 @@ finger down - - - - - - + + + + + + @@ -360,8 +358,8 @@ finger up - - + + @@ -369,11 +367,11 @@ finger up - - - + + + - + @@ -382,19 +380,19 @@ finger down - - - - - - + + + + + + TOUCH_3_HOLD - - + + @@ -407,12 +405,12 @@ DEAD - - - - - - + + + + + + @@ -430,13 +428,13 @@ any finger up - - - - + + + + - - + + yes @@ -444,14 +442,14 @@ any finger up - - - - - - - - + + + + + + + + @@ -464,12 +462,12 @@ count == 0 - - - - - - + + + + + + @@ -482,10 +480,10 @@ DRAGGING_2 - - - - + + + + @@ -493,12 +491,12 @@ finger up - - - - - - + + + + + + @@ -506,12 +504,12 @@ finger down - - - - - - + + + + + + @@ -519,8 +517,8 @@ finger down - - + + @@ -528,8 +526,8 @@ release - - + + @@ -539,18 +537,18 @@ press - - - - - - - - - + + + + + + + + + - - + + @@ -560,8 +558,8 @@ press - - + + @@ -569,41 +567,41 @@ release - - - - - - - - - - - + + + + + + + + + + + - + DRAGGING_WAIT - + - + timeout - - - - - - - + + + + + + + - + first - + finger down - - + + @@ -614,31 +612,31 @@ TOUCH_IDLE - - - - - - - - + + + + + + + + TOUCH_DEAD - - - - - - - - + + + + + + + + - + yes @@ -647,56 +645,56 @@ TOUCH_DEAD - - - - - - + + + + + + TOUCH_IDLE - - + + TOUCH_TOUCH - - - - + + + + TOUCH_IDLE - - + + TOUCH_IDLE - - + + TOUCH_IDLE - - + + TOUCH_TOUCH - - + + @@ -704,19 +702,19 @@ TOUCH_IDLE - - + + TOUCH_DEAD - - - - - - + + + + + + @@ -724,13 +722,13 @@ TOUCH_IDLE - - - - + + + + - - + + no @@ -738,8 +736,8 @@ TOUCH_TOUCH - - + + @@ -750,24 +748,24 @@ TOUCH_TOUCH - - + + TOUCH_DEAD - - - - + + + + TOUCH_IDLE - - + + @@ -778,43 +776,43 @@ TOUCH_TOUCH - - + + TOUCH_IDLE - - + + TOUCH_IDLE - - + + TOUCH_TOUCH - - + + TOUCH_IDLE - - + + TOUCH_TOUCH - - + + @@ -822,8 +820,8 @@ TOUCH_IDLE - - + + @@ -846,22 +844,22 @@ TOUCH_DEAD - - + + TOUCH_DEAD - - + + TOUCH_DEAD - - + + @@ -876,11 +874,11 @@ TOUCH_TOUCH - - + + - - + + no @@ -888,8 +886,8 @@ TOUCH_DEAD - - + + @@ -912,30 +910,30 @@ MULTITAP - - - - + + + + timeout - - - - + + + + IDLE - - - - - - + + + + + + @@ -948,10 +946,10 @@ press - - - - + + + + @@ -959,8 +957,8 @@ finger up - - + + @@ -968,8 +966,8 @@ release - - + + @@ -989,12 +987,12 @@ threshold - - - - - - + + + + + + @@ -1009,12 +1007,12 @@ press - - - - - - + + + + + + @@ -1029,12 +1027,12 @@ press - - - - - - + + + + + + @@ -1049,28 +1047,28 @@ press - - - - - - - - + + + + + + + + TOUCH_TOUCH - - + + TOUCH_IDLE - - + + @@ -1080,12 +1078,12 @@ press - - - - - - + + + + + + @@ -1098,17 +1096,17 @@ finger up - - + + timeout - - - - + + + + @@ -1116,26 +1114,70 @@ threshold - - - - - - - - - - + + + + + + + + + + TOUCH_IDLE - - - - - - + + + + + + + + + + +
+
+ drag lock
+ enabled?
+
+
+
+ + [Not supported by viewer] +
+
+ + + + + +
+
+ no
+
+
+ + [Not supported by viewer] +
+
+ + + + + +
+
+ yes
+
+
+
+ + [Not supported by viewer] +
+
diff --git a/src/evdev-mt-touchpad-tap.c b/src/evdev-mt-touchpad-tap.c index 5d986ca8..40d431aa 100644 --- a/src/evdev-mt-touchpad-tap.c +++ b/src/evdev-mt-touchpad-tap.c @@ -389,8 +389,16 @@ tp_tap_dragging_handle_event(struct tp_dispatch *tp, tp->tap.state = TAP_STATE_DRAGGING_2; break; case TAP_EVENT_RELEASE: - tp->tap.state = TAP_STATE_DRAGGING_WAIT; - tp_tap_set_drag_timer(tp, time); + if (tp->tap.drag_lock_enabled) { + tp->tap.state = TAP_STATE_DRAGGING_WAIT; + tp_tap_set_drag_timer(tp, time); + } else { + tp_tap_notify(tp, + time, + 1, + LIBINPUT_BUTTON_STATE_RELEASED); + tp->tap.state = TAP_STATE_IDLE; + } break; case TAP_EVENT_MOTION: case TAP_EVENT_TIMEOUT: @@ -849,11 +857,28 @@ static enum libinput_config_status tp_tap_config_set_draglock_enabled(struct libinput_device *device, enum libinput_config_drag_lock_state enabled) { - return LIBINPUT_CONFIG_STATUS_UNSUPPORTED; + struct evdev_dispatch *dispatch = ((struct evdev_device *) device)->dispatch; + struct tp_dispatch *tp = NULL; + + tp = container_of(dispatch, tp, base); + tp->tap.drag_lock_enabled = enabled; + + return LIBINPUT_CONFIG_STATUS_SUCCESS; } static enum libinput_config_drag_lock_state tp_tap_config_get_draglock_enabled(struct libinput_device *device) +{ + struct evdev_device *evdev = (struct evdev_device *)device; + struct tp_dispatch *tp = NULL; + + tp = container_of(evdev->dispatch, tp, base); + + return tp->tap.drag_lock_enabled; +} + +static inline enum libinput_config_drag_lock_state +tp_drag_lock_default(struct evdev_device *device) { return LIBINPUT_CONFIG_DRAG_LOCK_ENABLED; } @@ -861,7 +886,9 @@ tp_tap_config_get_draglock_enabled(struct libinput_device *device) static enum libinput_config_drag_lock_state tp_tap_config_get_default_draglock_enabled(struct libinput_device *device) { - return LIBINPUT_CONFIG_DRAG_LOCK_ENABLED; + struct evdev_device *evdev = (struct evdev_device *)device; + + return tp_drag_lock_default(evdev); } int @@ -878,6 +905,7 @@ tp_init_tap(struct tp_dispatch *tp) tp->tap.state = TAP_STATE_IDLE; tp->tap.enabled = tp_tap_default(tp->device); + tp->tap.drag_lock_enabled = tp_drag_lock_default(tp->device); libinput_timer_init(&tp->tap.timer, tp_libinput_context(tp), diff --git a/src/evdev-mt-touchpad.h b/src/evdev-mt-touchpad.h index 9357969c..36260c68 100644 --- a/src/evdev-mt-touchpad.h +++ b/src/evdev-mt-touchpad.h @@ -269,6 +269,8 @@ struct tp_dispatch { enum tp_tap_state state; uint32_t buttons_pressed; uint64_t multitap_last_time; + + bool drag_lock_enabled; } tap; struct { diff --git a/test/touchpad-tap.c b/test/touchpad-tap.c index 423f89bb..9bc02a0d 100644 --- a/test/touchpad-tap.c +++ b/test/touchpad-tap.c @@ -32,6 +32,30 @@ #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(); @@ -443,6 +467,7 @@ START_TEST(touchpad_1fg_multitap_n_drag_tap) ntaps; litest_enable_tap(dev->libinput_device); + enable_drag_lock(dev->libinput_device); litest_drain_events(li); @@ -515,6 +540,7 @@ START_TEST(touchpad_1fg_multitap_n_drag_tap_click) ntaps; litest_enable_tap(dev->libinput_device); + enable_drag_lock(dev->libinput_device); litest_drain_events(li); @@ -593,6 +619,7 @@ START_TEST(touchpad_1fg_tap_n_drag) struct libinput *li = dev->libinput; litest_enable_tap(dev->libinput_device); + enable_drag_lock(dev->libinput_device); litest_drain_events(li); @@ -633,6 +660,7 @@ START_TEST(touchpad_1fg_tap_n_drag_tap) struct libinput *li = dev->libinput; litest_enable_tap(dev->libinput_device); + enable_drag_lock(dev->libinput_device); litest_drain_events(li); @@ -674,6 +702,7 @@ START_TEST(touchpad_1fg_tap_n_drag_tap_click) struct libinput *li = dev->libinput; litest_enable_tap(dev->libinput_device); + enable_drag_lock(dev->libinput_device); litest_drain_events(li); @@ -718,6 +747,7 @@ START_TEST(touchpad_1fg_tap_n_drag_timeout) struct libinput *li = dev->libinput; litest_enable_tap(dev->libinput_device); + enable_drag_lock(dev->libinput_device); litest_drain_events(li); @@ -747,6 +777,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_drain_events(li); @@ -765,7 +796,6 @@ START_TEST(touchpad_2fg_tap_n_drag) litest_touch_up(dev, 0); litest_touch_up(dev, 1); - /* This will wait for the DRAGGING_WAIT timeout */ litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED); @@ -1625,6 +1655,60 @@ START_TEST(touchpad_tap_invalid) } END_TEST +START_TEST(touchpad_drag_lock_default_enabled) +{ + struct litest_device *dev = litest_current_device(); + struct libinput_device *device = dev->libinput_device; + enum libinput_config_status status; + + ck_assert_int_eq(libinput_device_config_tap_get_drag_lock_enabled(device), + LIBINPUT_CONFIG_DRAG_LOCK_ENABLED); + ck_assert_int_eq(libinput_device_config_tap_get_default_drag_lock_enabled(device), + LIBINPUT_CONFIG_DRAG_LOCK_ENABLED); + + status = libinput_device_config_tap_set_drag_lock_enabled(device, + LIBINPUT_CONFIG_DRAG_LOCK_ENABLED); + ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS); + + status = libinput_device_config_tap_set_drag_lock_enabled(device, + LIBINPUT_CONFIG_DRAG_LOCK_DISABLED); + ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS); + + status = libinput_device_config_tap_set_drag_lock_enabled(device, + LIBINPUT_CONFIG_DRAG_LOCK_ENABLED); + ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS); + + status = libinput_device_config_tap_set_drag_lock_enabled(device, + 3); + ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_INVALID); +} +END_TEST + +START_TEST(touchpad_drag_lock_default_disabled) +{ + struct litest_device *dev = litest_current_device(); + struct libinput_device *device = dev->libinput_device; + enum libinput_config_status status; + + ck_assert_int_eq(libinput_device_config_tap_get_drag_lock_enabled(device), + LIBINPUT_CONFIG_DRAG_LOCK_DISABLED); + ck_assert_int_eq(libinput_device_config_tap_get_default_drag_lock_enabled(device), + LIBINPUT_CONFIG_DRAG_LOCK_DISABLED); + + status = libinput_device_config_tap_set_drag_lock_enabled(device, + LIBINPUT_CONFIG_DRAG_LOCK_ENABLED); + ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_UNSUPPORTED); + + status = libinput_device_config_tap_set_drag_lock_enabled(device, + LIBINPUT_CONFIG_DRAG_LOCK_DISABLED); + ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS); + + status = libinput_device_config_tap_set_drag_lock_enabled(device, + 3); + ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_INVALID); +} +END_TEST + void litest_setup_tests(void) { @@ -1680,4 +1764,7 @@ litest_setup_tests(void) litest_add("touchpad:tap", clickpad_1fg_tap_click, LITEST_CLICKPAD, LITEST_ANY); litest_add("touchpad:tap", clickpad_2fg_tap_click, LITEST_CLICKPAD, LITEST_SINGLE_TOUCH|LITEST_APPLE_CLICKPAD); + litest_add("touchpad:tap", touchpad_drag_lock_default_enabled, LITEST_TOUCHPAD, LITEST_ANY); + litest_add("touchpad:tap", touchpad_drag_lock_default_disabled, LITEST_ANY, LITEST_TOUCHPAD); + }