mirror of
https://gitlab.freedesktop.org/libinput/libinput.git
synced 2026-05-09 09:28:03 +02:00
touchpad: hook up drag lock configuration
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
parent
75581d5829
commit
875e1d1b10
4 changed files with 506 additions and 347 deletions
File diff suppressed because it is too large
Load diff
|
Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 120 KiB |
|
|
@ -389,8 +389,16 @@ tp_tap_dragging_handle_event(struct tp_dispatch *tp,
|
||||||
tp->tap.state = TAP_STATE_DRAGGING_2;
|
tp->tap.state = TAP_STATE_DRAGGING_2;
|
||||||
break;
|
break;
|
||||||
case TAP_EVENT_RELEASE:
|
case TAP_EVENT_RELEASE:
|
||||||
tp->tap.state = TAP_STATE_DRAGGING_WAIT;
|
if (tp->tap.drag_lock_enabled) {
|
||||||
tp_tap_set_drag_timer(tp, time);
|
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;
|
break;
|
||||||
case TAP_EVENT_MOTION:
|
case TAP_EVENT_MOTION:
|
||||||
case TAP_EVENT_TIMEOUT:
|
case TAP_EVENT_TIMEOUT:
|
||||||
|
|
@ -849,11 +857,28 @@ static enum libinput_config_status
|
||||||
tp_tap_config_set_draglock_enabled(struct libinput_device *device,
|
tp_tap_config_set_draglock_enabled(struct libinput_device *device,
|
||||||
enum libinput_config_drag_lock_state enabled)
|
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
|
static enum libinput_config_drag_lock_state
|
||||||
tp_tap_config_get_draglock_enabled(struct libinput_device *device)
|
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;
|
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
|
static enum libinput_config_drag_lock_state
|
||||||
tp_tap_config_get_default_draglock_enabled(struct libinput_device *device)
|
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
|
int
|
||||||
|
|
@ -878,6 +905,7 @@ tp_init_tap(struct tp_dispatch *tp)
|
||||||
|
|
||||||
tp->tap.state = TAP_STATE_IDLE;
|
tp->tap.state = TAP_STATE_IDLE;
|
||||||
tp->tap.enabled = tp_tap_default(tp->device);
|
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,
|
libinput_timer_init(&tp->tap.timer,
|
||||||
tp_libinput_context(tp),
|
tp_libinput_context(tp),
|
||||||
|
|
|
||||||
|
|
@ -269,6 +269,8 @@ struct tp_dispatch {
|
||||||
enum tp_tap_state state;
|
enum tp_tap_state state;
|
||||||
uint32_t buttons_pressed;
|
uint32_t buttons_pressed;
|
||||||
uint64_t multitap_last_time;
|
uint64_t multitap_last_time;
|
||||||
|
|
||||||
|
bool drag_lock_enabled;
|
||||||
} tap;
|
} tap;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,30 @@
|
||||||
#include "libinput-util.h"
|
#include "libinput-util.h"
|
||||||
#include "litest.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)
|
START_TEST(touchpad_1fg_tap)
|
||||||
{
|
{
|
||||||
struct litest_device *dev = litest_current_device();
|
struct litest_device *dev = litest_current_device();
|
||||||
|
|
@ -443,6 +467,7 @@ START_TEST(touchpad_1fg_multitap_n_drag_tap)
|
||||||
ntaps;
|
ntaps;
|
||||||
|
|
||||||
litest_enable_tap(dev->libinput_device);
|
litest_enable_tap(dev->libinput_device);
|
||||||
|
enable_drag_lock(dev->libinput_device);
|
||||||
|
|
||||||
litest_drain_events(li);
|
litest_drain_events(li);
|
||||||
|
|
||||||
|
|
@ -515,6 +540,7 @@ START_TEST(touchpad_1fg_multitap_n_drag_tap_click)
|
||||||
ntaps;
|
ntaps;
|
||||||
|
|
||||||
litest_enable_tap(dev->libinput_device);
|
litest_enable_tap(dev->libinput_device);
|
||||||
|
enable_drag_lock(dev->libinput_device);
|
||||||
|
|
||||||
litest_drain_events(li);
|
litest_drain_events(li);
|
||||||
|
|
||||||
|
|
@ -593,6 +619,7 @@ START_TEST(touchpad_1fg_tap_n_drag)
|
||||||
struct libinput *li = dev->libinput;
|
struct libinput *li = dev->libinput;
|
||||||
|
|
||||||
litest_enable_tap(dev->libinput_device);
|
litest_enable_tap(dev->libinput_device);
|
||||||
|
enable_drag_lock(dev->libinput_device);
|
||||||
|
|
||||||
litest_drain_events(li);
|
litest_drain_events(li);
|
||||||
|
|
||||||
|
|
@ -633,6 +660,7 @@ START_TEST(touchpad_1fg_tap_n_drag_tap)
|
||||||
struct libinput *li = dev->libinput;
|
struct libinput *li = dev->libinput;
|
||||||
|
|
||||||
litest_enable_tap(dev->libinput_device);
|
litest_enable_tap(dev->libinput_device);
|
||||||
|
enable_drag_lock(dev->libinput_device);
|
||||||
|
|
||||||
litest_drain_events(li);
|
litest_drain_events(li);
|
||||||
|
|
||||||
|
|
@ -674,6 +702,7 @@ START_TEST(touchpad_1fg_tap_n_drag_tap_click)
|
||||||
struct libinput *li = dev->libinput;
|
struct libinput *li = dev->libinput;
|
||||||
|
|
||||||
litest_enable_tap(dev->libinput_device);
|
litest_enable_tap(dev->libinput_device);
|
||||||
|
enable_drag_lock(dev->libinput_device);
|
||||||
|
|
||||||
litest_drain_events(li);
|
litest_drain_events(li);
|
||||||
|
|
||||||
|
|
@ -718,6 +747,7 @@ START_TEST(touchpad_1fg_tap_n_drag_timeout)
|
||||||
struct libinput *li = dev->libinput;
|
struct libinput *li = dev->libinput;
|
||||||
|
|
||||||
litest_enable_tap(dev->libinput_device);
|
litest_enable_tap(dev->libinput_device);
|
||||||
|
enable_drag_lock(dev->libinput_device);
|
||||||
|
|
||||||
litest_drain_events(li);
|
litest_drain_events(li);
|
||||||
|
|
||||||
|
|
@ -747,6 +777,7 @@ START_TEST(touchpad_2fg_tap_n_drag)
|
||||||
struct libinput *li = dev->libinput;
|
struct libinput *li = dev->libinput;
|
||||||
|
|
||||||
litest_enable_tap(dev->libinput_device);
|
litest_enable_tap(dev->libinput_device);
|
||||||
|
disable_drag_lock(dev->libinput_device);
|
||||||
|
|
||||||
litest_drain_events(li);
|
litest_drain_events(li);
|
||||||
|
|
||||||
|
|
@ -765,7 +796,6 @@ START_TEST(touchpad_2fg_tap_n_drag)
|
||||||
litest_touch_up(dev, 0);
|
litest_touch_up(dev, 0);
|
||||||
litest_touch_up(dev, 1);
|
litest_touch_up(dev, 1);
|
||||||
|
|
||||||
/* This will wait for the DRAGGING_WAIT timeout */
|
|
||||||
litest_assert_button_event(li, BTN_LEFT,
|
litest_assert_button_event(li, BTN_LEFT,
|
||||||
LIBINPUT_BUTTON_STATE_RELEASED);
|
LIBINPUT_BUTTON_STATE_RELEASED);
|
||||||
|
|
||||||
|
|
@ -1625,6 +1655,60 @@ START_TEST(touchpad_tap_invalid)
|
||||||
}
|
}
|
||||||
END_TEST
|
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
|
void
|
||||||
litest_setup_tests(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_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", 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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue