1a46c0ec8Sopenharmony_ci/*
2a46c0ec8Sopenharmony_ci * Copyright © 2014 Red Hat, Inc.
3a46c0ec8Sopenharmony_ci *
4a46c0ec8Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a
5a46c0ec8Sopenharmony_ci * copy of this software and associated documentation files (the "Software"),
6a46c0ec8Sopenharmony_ci * to deal in the Software without restriction, including without limitation
7a46c0ec8Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8a46c0ec8Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the
9a46c0ec8Sopenharmony_ci * Software is furnished to do so, subject to the following conditions:
10a46c0ec8Sopenharmony_ci *
11a46c0ec8Sopenharmony_ci * The above copyright notice and this permission notice (including the next
12a46c0ec8Sopenharmony_ci * paragraph) shall be included in all copies or substantial portions of the
13a46c0ec8Sopenharmony_ci * Software.
14a46c0ec8Sopenharmony_ci *
15a46c0ec8Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16a46c0ec8Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17a46c0ec8Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18a46c0ec8Sopenharmony_ci * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19a46c0ec8Sopenharmony_ci * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20a46c0ec8Sopenharmony_ci * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21a46c0ec8Sopenharmony_ci * DEALINGS IN THE SOFTWARE.
22a46c0ec8Sopenharmony_ci */
23a46c0ec8Sopenharmony_ci
24a46c0ec8Sopenharmony_ci#include <config.h>
25a46c0ec8Sopenharmony_ci
26a46c0ec8Sopenharmony_ci#include <check.h>
27a46c0ec8Sopenharmony_ci#include <errno.h>
28a46c0ec8Sopenharmony_ci#include <fcntl.h>
29a46c0ec8Sopenharmony_ci#include <libinput.h>
30a46c0ec8Sopenharmony_ci#include <unistd.h>
31a46c0ec8Sopenharmony_ci
32a46c0ec8Sopenharmony_ci#include "libinput-util.h"
33a46c0ec8Sopenharmony_ci#include "litest.h"
34a46c0ec8Sopenharmony_ci
35a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_button)
36a46c0ec8Sopenharmony_ci{
37a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
38a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
39a46c0ec8Sopenharmony_ci
40a46c0ec8Sopenharmony_ci	if (!libevdev_has_event_code(dev->evdev, EV_KEY, BTN_LEFT))
41a46c0ec8Sopenharmony_ci		return;
42a46c0ec8Sopenharmony_ci
43a46c0ec8Sopenharmony_ci	litest_drain_events(li);
44a46c0ec8Sopenharmony_ci
45a46c0ec8Sopenharmony_ci	litest_button_click(dev, BTN_LEFT, true);
46a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
47a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
48a46c0ec8Sopenharmony_ci				   BTN_LEFT,
49a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
50a46c0ec8Sopenharmony_ci	litest_button_click(dev, BTN_LEFT, false);
51a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
52a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
53a46c0ec8Sopenharmony_ci				   BTN_LEFT,
54a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
55a46c0ec8Sopenharmony_ci}
56a46c0ec8Sopenharmony_ciEND_TEST
57a46c0ec8Sopenharmony_ci
58a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_click_defaults_clickfinger)
59a46c0ec8Sopenharmony_ci{
60a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
61a46c0ec8Sopenharmony_ci	struct libinput_device *device = dev->libinput_device;
62a46c0ec8Sopenharmony_ci	uint32_t methods, method;
63a46c0ec8Sopenharmony_ci	enum libinput_config_status status;
64a46c0ec8Sopenharmony_ci
65a46c0ec8Sopenharmony_ci	/* call this test for apple touchpads */
66a46c0ec8Sopenharmony_ci
67a46c0ec8Sopenharmony_ci	methods = libinput_device_config_click_get_methods(device);
68a46c0ec8Sopenharmony_ci	ck_assert(methods & LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS);
69a46c0ec8Sopenharmony_ci	ck_assert(methods & LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER);
70a46c0ec8Sopenharmony_ci
71a46c0ec8Sopenharmony_ci	method = libinput_device_config_click_get_method(device);
72a46c0ec8Sopenharmony_ci	ck_assert_int_eq(method, LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER);
73a46c0ec8Sopenharmony_ci	method = libinput_device_config_click_get_default_method(device);
74a46c0ec8Sopenharmony_ci	ck_assert_int_eq(method, LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER);
75a46c0ec8Sopenharmony_ci
76a46c0ec8Sopenharmony_ci	status = libinput_device_config_click_set_method(device,
77a46c0ec8Sopenharmony_ci							 LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS);
78a46c0ec8Sopenharmony_ci	ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
79a46c0ec8Sopenharmony_ci	status = libinput_device_config_click_set_method(device,
80a46c0ec8Sopenharmony_ci							 LIBINPUT_CONFIG_CLICK_METHOD_NONE);
81a46c0ec8Sopenharmony_ci	ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
82a46c0ec8Sopenharmony_ci}
83a46c0ec8Sopenharmony_ciEND_TEST
84a46c0ec8Sopenharmony_ci
85a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_click_defaults_btnarea)
86a46c0ec8Sopenharmony_ci{
87a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
88a46c0ec8Sopenharmony_ci	struct libinput_device *device = dev->libinput_device;
89a46c0ec8Sopenharmony_ci	uint32_t methods, method;
90a46c0ec8Sopenharmony_ci	enum libinput_config_status status;
91a46c0ec8Sopenharmony_ci
92a46c0ec8Sopenharmony_ci	/* call this test for non-apple clickpads */
93a46c0ec8Sopenharmony_ci
94a46c0ec8Sopenharmony_ci	methods = libinput_device_config_click_get_methods(device);
95a46c0ec8Sopenharmony_ci	ck_assert(methods & LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER);
96a46c0ec8Sopenharmony_ci	ck_assert(methods & LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS);
97a46c0ec8Sopenharmony_ci
98a46c0ec8Sopenharmony_ci	method = libinput_device_config_click_get_method(device);
99a46c0ec8Sopenharmony_ci	ck_assert_int_eq(method,  LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS);
100a46c0ec8Sopenharmony_ci	method = libinput_device_config_click_get_default_method(device);
101a46c0ec8Sopenharmony_ci	ck_assert_int_eq(method,  LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS);
102a46c0ec8Sopenharmony_ci
103a46c0ec8Sopenharmony_ci	status = libinput_device_config_click_set_method(device,
104a46c0ec8Sopenharmony_ci							 LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER);
105a46c0ec8Sopenharmony_ci	ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
106a46c0ec8Sopenharmony_ci	status = libinput_device_config_click_set_method(device,
107a46c0ec8Sopenharmony_ci							 LIBINPUT_CONFIG_CLICK_METHOD_NONE);
108a46c0ec8Sopenharmony_ci	ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
109a46c0ec8Sopenharmony_ci}
110a46c0ec8Sopenharmony_ciEND_TEST
111a46c0ec8Sopenharmony_ci
112a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_click_defaults_none)
113a46c0ec8Sopenharmony_ci{
114a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
115a46c0ec8Sopenharmony_ci	struct libinput_device *device = dev->libinput_device;
116a46c0ec8Sopenharmony_ci	uint32_t methods, method;
117a46c0ec8Sopenharmony_ci	enum libinput_config_status status;
118a46c0ec8Sopenharmony_ci
119a46c0ec8Sopenharmony_ci	if (libevdev_get_id_vendor(dev->evdev) == VENDOR_ID_APPLE &&
120a46c0ec8Sopenharmony_ci	    libevdev_get_id_product(dev->evdev) == PRODUCT_ID_APPLE_APPLETOUCH)
121a46c0ec8Sopenharmony_ci		return;
122a46c0ec8Sopenharmony_ci
123a46c0ec8Sopenharmony_ci	/* call this test for non-clickpads and non-touchpads */
124a46c0ec8Sopenharmony_ci
125a46c0ec8Sopenharmony_ci	methods = libinput_device_config_click_get_methods(device);
126a46c0ec8Sopenharmony_ci	ck_assert_int_eq(methods, 0);
127a46c0ec8Sopenharmony_ci
128a46c0ec8Sopenharmony_ci	method = libinput_device_config_click_get_method(device);
129a46c0ec8Sopenharmony_ci	ck_assert_int_eq(method, LIBINPUT_CONFIG_CLICK_METHOD_NONE);
130a46c0ec8Sopenharmony_ci	method = libinput_device_config_click_get_default_method(device);
131a46c0ec8Sopenharmony_ci	ck_assert_int_eq(method, LIBINPUT_CONFIG_CLICK_METHOD_NONE);
132a46c0ec8Sopenharmony_ci
133a46c0ec8Sopenharmony_ci	status = libinput_device_config_click_set_method(device,
134a46c0ec8Sopenharmony_ci							 LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER);
135a46c0ec8Sopenharmony_ci	ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_UNSUPPORTED);
136a46c0ec8Sopenharmony_ci	status = libinput_device_config_click_set_method(device,
137a46c0ec8Sopenharmony_ci							 LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS);
138a46c0ec8Sopenharmony_ci	ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_UNSUPPORTED);
139a46c0ec8Sopenharmony_ci}
140a46c0ec8Sopenharmony_ciEND_TEST
141a46c0ec8Sopenharmony_ci
142a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_1fg_clickfinger)
143a46c0ec8Sopenharmony_ci{
144a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
145a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
146a46c0ec8Sopenharmony_ci
147a46c0ec8Sopenharmony_ci	litest_enable_clickfinger(dev);
148a46c0ec8Sopenharmony_ci
149a46c0ec8Sopenharmony_ci	litest_drain_events(li);
150a46c0ec8Sopenharmony_ci
151a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 50, 50);
152a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
153a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
154a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
155a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
156a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
157a46c0ec8Sopenharmony_ci
158a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
159a46c0ec8Sopenharmony_ci
160a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_LEFT,
161a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
162a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_LEFT,
163a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
164a46c0ec8Sopenharmony_ci}
165a46c0ec8Sopenharmony_ciEND_TEST
166a46c0ec8Sopenharmony_ci
167a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_1fg_clickfinger_no_touch)
168a46c0ec8Sopenharmony_ci{
169a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
170a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
171a46c0ec8Sopenharmony_ci
172a46c0ec8Sopenharmony_ci	if (dev->which == LITEST_SYNAPTICS_PHANTOMCLICKS) {
173a46c0ec8Sopenharmony_ci		/* The XPS 15 9500 touchpad has the ModelTouchpadPhantomClicks
174a46c0ec8Sopenharmony_ci		 * quirk enabled and doesn't generate events without touches. */
175a46c0ec8Sopenharmony_ci		return;
176a46c0ec8Sopenharmony_ci	}
177a46c0ec8Sopenharmony_ci
178a46c0ec8Sopenharmony_ci	litest_enable_clickfinger(dev);
179a46c0ec8Sopenharmony_ci
180a46c0ec8Sopenharmony_ci	litest_drain_events(li);
181a46c0ec8Sopenharmony_ci
182a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
183a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
184a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
185a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
186a46c0ec8Sopenharmony_ci
187a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
188a46c0ec8Sopenharmony_ci
189a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_LEFT,
190a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
191a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_LEFT,
192a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
193a46c0ec8Sopenharmony_ci}
194a46c0ec8Sopenharmony_ciEND_TEST
195a46c0ec8Sopenharmony_ci
196a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_1fg_clickfinger_no_touch_phantomclicks)
197a46c0ec8Sopenharmony_ci{
198a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
199a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
200a46c0ec8Sopenharmony_ci
201a46c0ec8Sopenharmony_ci	litest_enable_clickfinger(dev);
202a46c0ec8Sopenharmony_ci
203a46c0ec8Sopenharmony_ci	litest_drain_events(li);
204a46c0ec8Sopenharmony_ci
205a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
206a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
207a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
208a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
209a46c0ec8Sopenharmony_ci
210a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
211a46c0ec8Sopenharmony_ci
212a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
213a46c0ec8Sopenharmony_ci}
214a46c0ec8Sopenharmony_ciEND_TEST
215a46c0ec8Sopenharmony_ci
216a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_2fg_clickfinger)
217a46c0ec8Sopenharmony_ci{
218a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
219a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
220a46c0ec8Sopenharmony_ci
221a46c0ec8Sopenharmony_ci	litest_enable_clickfinger(dev);
222a46c0ec8Sopenharmony_ci
223a46c0ec8Sopenharmony_ci	litest_drain_events(li);
224a46c0ec8Sopenharmony_ci
225a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 50, 50);
226a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 1, 70, 70);
227a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
228a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
229a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
230a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
231a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
232a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 1);
233a46c0ec8Sopenharmony_ci
234a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
235a46c0ec8Sopenharmony_ci
236a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_RIGHT,
237a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
238a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_RIGHT,
239a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
240a46c0ec8Sopenharmony_ci}
241a46c0ec8Sopenharmony_ciEND_TEST
242a46c0ec8Sopenharmony_ci
243a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_3fg_clickfinger)
244a46c0ec8Sopenharmony_ci{
245a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
246a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
247a46c0ec8Sopenharmony_ci
248a46c0ec8Sopenharmony_ci	if (litest_slot_count(dev) < 3)
249a46c0ec8Sopenharmony_ci		return;
250a46c0ec8Sopenharmony_ci
251a46c0ec8Sopenharmony_ci	litest_enable_clickfinger(dev);
252a46c0ec8Sopenharmony_ci
253a46c0ec8Sopenharmony_ci	litest_drain_events(li);
254a46c0ec8Sopenharmony_ci
255a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 50, 50);
256a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 1, 60, 70);
257a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 2, 70, 70);
258a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
259a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
260a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
261a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
262a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
263a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 1);
264a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 2);
265a46c0ec8Sopenharmony_ci
266a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
267a46c0ec8Sopenharmony_ci
268a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
269a46c0ec8Sopenharmony_ci				   BTN_MIDDLE,
270a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
271a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
272a46c0ec8Sopenharmony_ci				   BTN_MIDDLE,
273a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
274a46c0ec8Sopenharmony_ci}
275a46c0ec8Sopenharmony_ciEND_TEST
276a46c0ec8Sopenharmony_ci
277a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_3fg_clickfinger_btntool)
278a46c0ec8Sopenharmony_ci{
279a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
280a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
281a46c0ec8Sopenharmony_ci
282a46c0ec8Sopenharmony_ci	if (litest_slot_count(dev) >= 3 ||
283a46c0ec8Sopenharmony_ci	    !libevdev_has_event_code(dev->evdev, EV_KEY, BTN_TOOL_TRIPLETAP))
284a46c0ec8Sopenharmony_ci		return;
285a46c0ec8Sopenharmony_ci
286a46c0ec8Sopenharmony_ci	litest_enable_clickfinger(dev);
287a46c0ec8Sopenharmony_ci
288a46c0ec8Sopenharmony_ci	litest_drain_events(li);
289a46c0ec8Sopenharmony_ci
290a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 50, 50);
291a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 1, 60, 70);
292a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 0);
293a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 1);
294a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
295a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
296a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
297a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
298a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
299a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 1);
300a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 0);
301a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
302a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
303a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 1);
304a46c0ec8Sopenharmony_ci
305a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
306a46c0ec8Sopenharmony_ci
307a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
308a46c0ec8Sopenharmony_ci				   BTN_MIDDLE,
309a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
310a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
311a46c0ec8Sopenharmony_ci				   BTN_MIDDLE,
312a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
313a46c0ec8Sopenharmony_ci}
314a46c0ec8Sopenharmony_ciEND_TEST
315a46c0ec8Sopenharmony_ci
316a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_4fg_clickfinger)
317a46c0ec8Sopenharmony_ci{
318a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
319a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
320a46c0ec8Sopenharmony_ci
321a46c0ec8Sopenharmony_ci	if (litest_slot_count(dev) < 4)
322a46c0ec8Sopenharmony_ci		return;
323a46c0ec8Sopenharmony_ci
324a46c0ec8Sopenharmony_ci	litest_enable_clickfinger(dev);
325a46c0ec8Sopenharmony_ci
326a46c0ec8Sopenharmony_ci	litest_drain_events(li);
327a46c0ec8Sopenharmony_ci
328a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 50, 50);
329a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 1, 60, 70);
330a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 2, 70, 70);
331a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 3, 80, 70);
332a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
333a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
334a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
335a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
336a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
337a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 1);
338a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 2);
339a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 3);
340a46c0ec8Sopenharmony_ci
341a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
342a46c0ec8Sopenharmony_ci
343a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
344a46c0ec8Sopenharmony_ci}
345a46c0ec8Sopenharmony_ciEND_TEST
346a46c0ec8Sopenharmony_ci
347a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_4fg_clickfinger_btntool_2slots)
348a46c0ec8Sopenharmony_ci{
349a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
350a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
351a46c0ec8Sopenharmony_ci
352a46c0ec8Sopenharmony_ci	if (litest_slot_count(dev) >= 3 ||
353a46c0ec8Sopenharmony_ci	    !libevdev_has_event_code(dev->evdev, EV_KEY, BTN_TOOL_QUADTAP))
354a46c0ec8Sopenharmony_ci		return;
355a46c0ec8Sopenharmony_ci
356a46c0ec8Sopenharmony_ci	litest_enable_clickfinger(dev);
357a46c0ec8Sopenharmony_ci
358a46c0ec8Sopenharmony_ci	litest_drain_events(li);
359a46c0ec8Sopenharmony_ci
360a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 50, 50);
361a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 1, 60, 70);
362a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 0);
363a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_TOOL_QUADTAP, 1);
364a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
365a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
366a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
367a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
368a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
369a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 1);
370a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_TOOL_QUADTAP, 0);
371a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
372a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
373a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 1);
374a46c0ec8Sopenharmony_ci
375a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
376a46c0ec8Sopenharmony_ci}
377a46c0ec8Sopenharmony_ciEND_TEST
378a46c0ec8Sopenharmony_ci
379a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_4fg_clickfinger_btntool_3slots)
380a46c0ec8Sopenharmony_ci{
381a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
382a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
383a46c0ec8Sopenharmony_ci
384a46c0ec8Sopenharmony_ci	if (litest_slot_count(dev) != 3 ||
385a46c0ec8Sopenharmony_ci	    !libevdev_has_event_code(dev->evdev, EV_KEY, BTN_TOOL_TRIPLETAP))
386a46c0ec8Sopenharmony_ci		return;
387a46c0ec8Sopenharmony_ci
388a46c0ec8Sopenharmony_ci	litest_enable_clickfinger(dev);
389a46c0ec8Sopenharmony_ci
390a46c0ec8Sopenharmony_ci	litest_drain_events(li);
391a46c0ec8Sopenharmony_ci
392a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 50, 50);
393a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 1, 60, 70);
394a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 2, 70, 70);
395a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 0);
396a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_TOOL_QUADTAP, 1);
397a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
398a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
399a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
400a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
401a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
402a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 1);
403a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_TOOL_QUADTAP, 0);
404a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
405a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
406a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 1);
407a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 2);
408a46c0ec8Sopenharmony_ci
409a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
410a46c0ec8Sopenharmony_ci
411a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
412a46c0ec8Sopenharmony_ci}
413a46c0ec8Sopenharmony_ciEND_TEST
414a46c0ec8Sopenharmony_ci
415a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_2fg_clickfinger_distance)
416a46c0ec8Sopenharmony_ci{
417a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
418a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
419a46c0ec8Sopenharmony_ci	double w, h;
420a46c0ec8Sopenharmony_ci	bool small_touchpad = false;
421a46c0ec8Sopenharmony_ci	unsigned int expected_button;
422a46c0ec8Sopenharmony_ci
423a46c0ec8Sopenharmony_ci	if (libinput_device_get_size(dev->libinput_device, &w, &h) == 0 &&
424a46c0ec8Sopenharmony_ci	    h < 50.0)
425a46c0ec8Sopenharmony_ci		small_touchpad = true;
426a46c0ec8Sopenharmony_ci
427a46c0ec8Sopenharmony_ci	litest_enable_clickfinger(dev);
428a46c0ec8Sopenharmony_ci
429a46c0ec8Sopenharmony_ci	litest_drain_events(li);
430a46c0ec8Sopenharmony_ci
431a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 90, 50);
432a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 1, 10, 50);
433a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
434a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
435a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
436a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
437a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
438a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 1);
439a46c0ec8Sopenharmony_ci
440a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
441a46c0ec8Sopenharmony_ci				   BTN_LEFT,
442a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
443a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
444a46c0ec8Sopenharmony_ci				   BTN_LEFT,
445a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
446a46c0ec8Sopenharmony_ci
447a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
448a46c0ec8Sopenharmony_ci
449a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 50, 5);
450a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 1, 50, 95);
451a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
452a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
453a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
454a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
455a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
456a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 1);
457a46c0ec8Sopenharmony_ci
458a46c0ec8Sopenharmony_ci	/* if the touchpad is small enough, we expect all fingers to count
459a46c0ec8Sopenharmony_ci	 * for clickfinger */
460a46c0ec8Sopenharmony_ci	if (small_touchpad)
461a46c0ec8Sopenharmony_ci		expected_button = BTN_RIGHT;
462a46c0ec8Sopenharmony_ci	else
463a46c0ec8Sopenharmony_ci		expected_button = BTN_LEFT;
464a46c0ec8Sopenharmony_ci
465a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
466a46c0ec8Sopenharmony_ci				   expected_button,
467a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
468a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
469a46c0ec8Sopenharmony_ci				   expected_button,
470a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
471a46c0ec8Sopenharmony_ci}
472a46c0ec8Sopenharmony_ciEND_TEST
473a46c0ec8Sopenharmony_ci
474a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_3fg_clickfinger_distance)
475a46c0ec8Sopenharmony_ci{
476a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
477a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
478a46c0ec8Sopenharmony_ci
479a46c0ec8Sopenharmony_ci	if (litest_slot_count(dev) < 3)
480a46c0ec8Sopenharmony_ci		return;
481a46c0ec8Sopenharmony_ci
482a46c0ec8Sopenharmony_ci	litest_enable_clickfinger(dev);
483a46c0ec8Sopenharmony_ci
484a46c0ec8Sopenharmony_ci	litest_drain_events(li);
485a46c0ec8Sopenharmony_ci
486a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 90, 20);
487a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 1, 10, 15);
488a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 2, 10, 15);
489a46c0ec8Sopenharmony_ci
490a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
491a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
492a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
493a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
494a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
495a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 1);
496a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 2);
497a46c0ec8Sopenharmony_ci
498a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
499a46c0ec8Sopenharmony_ci				   BTN_MIDDLE,
500a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
501a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
502a46c0ec8Sopenharmony_ci				   BTN_MIDDLE,
503a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
504a46c0ec8Sopenharmony_ci}
505a46c0ec8Sopenharmony_ciEND_TEST
506a46c0ec8Sopenharmony_ci
507a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_3fg_clickfinger_distance_btntool)
508a46c0ec8Sopenharmony_ci{
509a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
510a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
511a46c0ec8Sopenharmony_ci
512a46c0ec8Sopenharmony_ci	if (litest_slot_count(dev) > 2)
513a46c0ec8Sopenharmony_ci		return;
514a46c0ec8Sopenharmony_ci
515a46c0ec8Sopenharmony_ci	litest_enable_clickfinger(dev);
516a46c0ec8Sopenharmony_ci
517a46c0ec8Sopenharmony_ci	litest_drain_events(li);
518a46c0ec8Sopenharmony_ci
519a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 90, 15);
520a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 1, 10, 15);
521a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
522a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 0);
523a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 1);
524a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
525a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
526a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
527a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
528a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
529a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
530a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 1);
531a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 0);
532a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
533a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
534a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 1);
535a46c0ec8Sopenharmony_ci
536a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
537a46c0ec8Sopenharmony_ci				   BTN_MIDDLE,
538a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
539a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
540a46c0ec8Sopenharmony_ci				   BTN_MIDDLE,
541a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
542a46c0ec8Sopenharmony_ci}
543a46c0ec8Sopenharmony_ciEND_TEST
544a46c0ec8Sopenharmony_ci
545a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_2fg_clickfinger_bottom)
546a46c0ec8Sopenharmony_ci{
547a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
548a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
549a46c0ec8Sopenharmony_ci
550a46c0ec8Sopenharmony_ci	/* this test is run for the T440s touchpad only, makes getting the
551a46c0ec8Sopenharmony_ci	 * mm correct easier */
552a46c0ec8Sopenharmony_ci
553a46c0ec8Sopenharmony_ci	libinput_device_config_click_set_method(dev->libinput_device,
554a46c0ec8Sopenharmony_ci						LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER);
555a46c0ec8Sopenharmony_ci	litest_drain_events(li);
556a46c0ec8Sopenharmony_ci
557a46c0ec8Sopenharmony_ci	/* one above, one below the magic line, vert spread ca 27mm */
558a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 40, 60);
559a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 1, 60, 100);
560a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
561a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
562a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
563a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
564a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
565a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 1);
566a46c0ec8Sopenharmony_ci
567a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
568a46c0ec8Sopenharmony_ci				   BTN_LEFT,
569a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
570a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
571a46c0ec8Sopenharmony_ci				   BTN_LEFT,
572a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
573a46c0ec8Sopenharmony_ci
574a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
575a46c0ec8Sopenharmony_ci
576a46c0ec8Sopenharmony_ci	/* both below the magic line */
577a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 40, 100);
578a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 1, 60, 95);
579a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
580a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
581a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
582a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
583a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
584a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 1);
585a46c0ec8Sopenharmony_ci
586a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
587a46c0ec8Sopenharmony_ci				   BTN_RIGHT,
588a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
589a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
590a46c0ec8Sopenharmony_ci				   BTN_RIGHT,
591a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
592a46c0ec8Sopenharmony_ci
593a46c0ec8Sopenharmony_ci	/* one above, one below the magic line, vert spread 17mm */
594a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 50, 75);
595a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 1, 55, 100);
596a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
597a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
598a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
599a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
600a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
601a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 1);
602a46c0ec8Sopenharmony_ci
603a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
604a46c0ec8Sopenharmony_ci				   BTN_RIGHT,
605a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
606a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
607a46c0ec8Sopenharmony_ci				   BTN_RIGHT,
608a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
609a46c0ec8Sopenharmony_ci}
610a46c0ec8Sopenharmony_ciEND_TEST
611a46c0ec8Sopenharmony_ci
612a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_clickfinger_to_area_method)
613a46c0ec8Sopenharmony_ci{
614a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
615a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
616a46c0ec8Sopenharmony_ci
617a46c0ec8Sopenharmony_ci	litest_drain_events(li);
618a46c0ec8Sopenharmony_ci
619a46c0ec8Sopenharmony_ci	litest_enable_buttonareas(dev);
620a46c0ec8Sopenharmony_ci
621a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 95, 95);
622a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
623a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
624a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
625a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
626a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
627a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
628a46c0ec8Sopenharmony_ci
629a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_RIGHT,
630a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
631a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_RIGHT,
632a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
633a46c0ec8Sopenharmony_ci
634a46c0ec8Sopenharmony_ci	litest_enable_clickfinger(dev);
635a46c0ec8Sopenharmony_ci
636a46c0ec8Sopenharmony_ci	litest_drain_events(li);
637a46c0ec8Sopenharmony_ci
638a46c0ec8Sopenharmony_ci	/* use bottom right corner to catch accidental softbutton right */
639a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 95, 95);
640a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
641a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
642a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
643a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
644a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
645a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
646a46c0ec8Sopenharmony_ci
647a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_LEFT,
648a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
649a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_LEFT,
650a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
651a46c0ec8Sopenharmony_ci
652a46c0ec8Sopenharmony_ci}
653a46c0ec8Sopenharmony_ciEND_TEST
654a46c0ec8Sopenharmony_ci
655a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_clickfinger_to_area_method_while_down)
656a46c0ec8Sopenharmony_ci{
657a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
658a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
659a46c0ec8Sopenharmony_ci
660a46c0ec8Sopenharmony_ci	litest_drain_events(li);
661a46c0ec8Sopenharmony_ci
662a46c0ec8Sopenharmony_ci	litest_enable_buttonareas(dev);
663a46c0ec8Sopenharmony_ci
664a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 95, 95);
665a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
666a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
667a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
668a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_RIGHT,
669a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
670a46c0ec8Sopenharmony_ci
671a46c0ec8Sopenharmony_ci	litest_enable_clickfinger(dev);
672a46c0ec8Sopenharmony_ci
673a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
674a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
675a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
676a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
677a46c0ec8Sopenharmony_ci
678a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_RIGHT,
679a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
680a46c0ec8Sopenharmony_ci
681a46c0ec8Sopenharmony_ci	litest_drain_events(li);
682a46c0ec8Sopenharmony_ci
683a46c0ec8Sopenharmony_ci	/* use bottom right corner to catch accidental softbutton right */
684a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 95, 95);
685a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
686a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
687a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
688a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
689a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
690a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
691a46c0ec8Sopenharmony_ci
692a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_LEFT,
693a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
694a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_LEFT,
695a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
696a46c0ec8Sopenharmony_ci
697a46c0ec8Sopenharmony_ci}
698a46c0ec8Sopenharmony_ciEND_TEST
699a46c0ec8Sopenharmony_ci
700a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_area_to_clickfinger_method)
701a46c0ec8Sopenharmony_ci{
702a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
703a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
704a46c0ec8Sopenharmony_ci
705a46c0ec8Sopenharmony_ci	litest_enable_clickfinger(dev);
706a46c0ec8Sopenharmony_ci
707a46c0ec8Sopenharmony_ci	litest_drain_events(li);
708a46c0ec8Sopenharmony_ci
709a46c0ec8Sopenharmony_ci	/* use bottom right corner to catch accidental softbutton right */
710a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 95, 95);
711a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
712a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
713a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
714a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
715a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
716a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
717a46c0ec8Sopenharmony_ci
718a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_LEFT,
719a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
720a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_LEFT,
721a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
722a46c0ec8Sopenharmony_ci
723a46c0ec8Sopenharmony_ci	litest_enable_buttonareas(dev);
724a46c0ec8Sopenharmony_ci
725a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 95, 95);
726a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
727a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
728a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
729a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
730a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
731a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
732a46c0ec8Sopenharmony_ci
733a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_RIGHT,
734a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
735a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_RIGHT,
736a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
737a46c0ec8Sopenharmony_ci
738a46c0ec8Sopenharmony_ci}
739a46c0ec8Sopenharmony_ciEND_TEST
740a46c0ec8Sopenharmony_ci
741a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_area_to_clickfinger_method_while_down)
742a46c0ec8Sopenharmony_ci{
743a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
744a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
745a46c0ec8Sopenharmony_ci
746a46c0ec8Sopenharmony_ci	litest_enable_clickfinger(dev);
747a46c0ec8Sopenharmony_ci
748a46c0ec8Sopenharmony_ci	litest_drain_events(li);
749a46c0ec8Sopenharmony_ci
750a46c0ec8Sopenharmony_ci	/* use bottom right corner to catch accidental softbutton right */
751a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 95, 95);
752a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
753a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
754a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_LEFT,
755a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
756a46c0ec8Sopenharmony_ci
757a46c0ec8Sopenharmony_ci	litest_enable_buttonareas(dev);
758a46c0ec8Sopenharmony_ci
759a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
760a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
761a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
762a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
763a46c0ec8Sopenharmony_ci
764a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_LEFT,
765a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
766a46c0ec8Sopenharmony_ci
767a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 95, 95);
768a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
769a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
770a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
771a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
772a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
773a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
774a46c0ec8Sopenharmony_ci
775a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_RIGHT,
776a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
777a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_RIGHT,
778a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
779a46c0ec8Sopenharmony_ci
780a46c0ec8Sopenharmony_ci}
781a46c0ec8Sopenharmony_ciEND_TEST
782a46c0ec8Sopenharmony_ci
783a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_clickfinger_3fg_tool_position)
784a46c0ec8Sopenharmony_ci{
785a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
786a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
787a46c0ec8Sopenharmony_ci
788a46c0ec8Sopenharmony_ci	litest_enable_clickfinger(dev);
789a46c0ec8Sopenharmony_ci	litest_drain_events(li);
790a46c0ec8Sopenharmony_ci
791a46c0ec8Sopenharmony_ci	/* one in thumb area, one in normal area + TRIPLETAP. spread is wide
792a46c0ec8Sopenharmony_ci	 * but any non-palm 3fg touch+click counts as middle */
793a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 20, 99);
794a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 1, 90, 15);
795a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 0);
796a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 1);
797a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
798a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
799a46c0ec8Sopenharmony_ci
800a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
801a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
802a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
803a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
804a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
805a46c0ec8Sopenharmony_ci
806a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_RIGHT,
807a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
808a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_RIGHT,
809a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
810a46c0ec8Sopenharmony_ci}
811a46c0ec8Sopenharmony_ciEND_TEST
812a46c0ec8Sopenharmony_ci
813a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_clickfinger_4fg_tool_position)
814a46c0ec8Sopenharmony_ci{
815a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
816a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
817a46c0ec8Sopenharmony_ci
818a46c0ec8Sopenharmony_ci	litest_enable_clickfinger(dev);
819a46c0ec8Sopenharmony_ci	litest_drain_events(li);
820a46c0ec8Sopenharmony_ci
821a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 5, 99);
822a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 1, 90, 15);
823a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 0);
824a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_TOOL_QUADTAP, 1);
825a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
826a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
827a46c0ec8Sopenharmony_ci
828a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
829a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
830a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
831a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
832a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
833a46c0ec8Sopenharmony_ci
834a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
835a46c0ec8Sopenharmony_ci				   BTN_MIDDLE,
836a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
837a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
838a46c0ec8Sopenharmony_ci				   BTN_MIDDLE,
839a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
840a46c0ec8Sopenharmony_ci}
841a46c0ec8Sopenharmony_ciEND_TEST
842a46c0ec8Sopenharmony_ci
843a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_clickfinger_appletouch_config)
844a46c0ec8Sopenharmony_ci{
845a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
846a46c0ec8Sopenharmony_ci	struct libinput_device *device = dev->libinput_device;
847a46c0ec8Sopenharmony_ci	uint32_t methods, method;
848a46c0ec8Sopenharmony_ci	enum libinput_config_status status;
849a46c0ec8Sopenharmony_ci
850a46c0ec8Sopenharmony_ci	methods = libinput_device_config_click_get_methods(device);
851a46c0ec8Sopenharmony_ci	ck_assert(!(methods & LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS));
852a46c0ec8Sopenharmony_ci	ck_assert(methods & LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER);
853a46c0ec8Sopenharmony_ci
854a46c0ec8Sopenharmony_ci	method = libinput_device_config_click_get_method(device);
855a46c0ec8Sopenharmony_ci	ck_assert_int_eq(method, LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER);
856a46c0ec8Sopenharmony_ci
857a46c0ec8Sopenharmony_ci	status = libinput_device_config_click_set_method(device,
858a46c0ec8Sopenharmony_ci							 LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS);
859a46c0ec8Sopenharmony_ci	ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_UNSUPPORTED);
860a46c0ec8Sopenharmony_ci	status = libinput_device_config_click_set_method(device,
861a46c0ec8Sopenharmony_ci							 LIBINPUT_CONFIG_CLICK_METHOD_NONE);
862a46c0ec8Sopenharmony_ci	ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
863a46c0ec8Sopenharmony_ci}
864a46c0ec8Sopenharmony_ciEND_TEST
865a46c0ec8Sopenharmony_ci
866a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_clickfinger_appletouch_1fg)
867a46c0ec8Sopenharmony_ci{
868a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
869a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
870a46c0ec8Sopenharmony_ci
871a46c0ec8Sopenharmony_ci	litest_enable_clickfinger(dev);
872a46c0ec8Sopenharmony_ci
873a46c0ec8Sopenharmony_ci	litest_drain_events(li);
874a46c0ec8Sopenharmony_ci
875a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 50, 50);
876a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
877a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
878a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
879a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
880a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
881a46c0ec8Sopenharmony_ci
882a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
883a46c0ec8Sopenharmony_ci
884a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_LEFT,
885a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
886a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_LEFT,
887a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
888a46c0ec8Sopenharmony_ci}
889a46c0ec8Sopenharmony_ciEND_TEST
890a46c0ec8Sopenharmony_ci
891a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_clickfinger_appletouch_2fg)
892a46c0ec8Sopenharmony_ci{
893a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
894a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
895a46c0ec8Sopenharmony_ci
896a46c0ec8Sopenharmony_ci	litest_enable_clickfinger(dev);
897a46c0ec8Sopenharmony_ci
898a46c0ec8Sopenharmony_ci	litest_drain_events(li);
899a46c0ec8Sopenharmony_ci
900a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 50, 50);
901a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 1, 50, 50);
902a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
903a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
904a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
905a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
906a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
907a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 1);
908a46c0ec8Sopenharmony_ci
909a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
910a46c0ec8Sopenharmony_ci
911a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_RIGHT,
912a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
913a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_RIGHT,
914a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
915a46c0ec8Sopenharmony_ci}
916a46c0ec8Sopenharmony_ciEND_TEST
917a46c0ec8Sopenharmony_ci
918a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_clickfinger_appletouch_3fg)
919a46c0ec8Sopenharmony_ci{
920a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
921a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
922a46c0ec8Sopenharmony_ci
923a46c0ec8Sopenharmony_ci	litest_enable_clickfinger(dev);
924a46c0ec8Sopenharmony_ci
925a46c0ec8Sopenharmony_ci	litest_drain_events(li);
926a46c0ec8Sopenharmony_ci
927a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 50, 50);
928a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 1, 50, 50);
929a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 2, 50, 50);
930a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
931a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
932a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
933a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
934a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
935a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 1);
936a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 2);
937a46c0ec8Sopenharmony_ci
938a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
939a46c0ec8Sopenharmony_ci
940a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_MIDDLE,
941a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
942a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_MIDDLE,
943a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
944a46c0ec8Sopenharmony_ci}
945a46c0ec8Sopenharmony_ciEND_TEST
946a46c0ec8Sopenharmony_ci
947a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_clickfinger_click_drag)
948a46c0ec8Sopenharmony_ci{
949a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
950a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
951a46c0ec8Sopenharmony_ci	int nfingers = _i; /* ranged test */
952a46c0ec8Sopenharmony_ci	unsigned int button;
953a46c0ec8Sopenharmony_ci	int nslots = litest_slot_count(dev);
954a46c0ec8Sopenharmony_ci
955a46c0ec8Sopenharmony_ci	litest_enable_clickfinger(dev);
956a46c0ec8Sopenharmony_ci	litest_drain_events(li);
957a46c0ec8Sopenharmony_ci
958a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 40, 50);
959a46c0ec8Sopenharmony_ci	button = BTN_LEFT;
960a46c0ec8Sopenharmony_ci
961a46c0ec8Sopenharmony_ci	if (nfingers > 1) {
962a46c0ec8Sopenharmony_ci		if (nslots > 1) {
963a46c0ec8Sopenharmony_ci			litest_touch_down(dev, 1, 50, 50);
964a46c0ec8Sopenharmony_ci		} else {
965a46c0ec8Sopenharmony_ci			litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 1);
966a46c0ec8Sopenharmony_ci		}
967a46c0ec8Sopenharmony_ci		button = BTN_RIGHT;
968a46c0ec8Sopenharmony_ci	}
969a46c0ec8Sopenharmony_ci
970a46c0ec8Sopenharmony_ci	if (nfingers > 2) {
971a46c0ec8Sopenharmony_ci		if (nslots > 2) {
972a46c0ec8Sopenharmony_ci			litest_touch_down(dev, 2, 60, 50);
973a46c0ec8Sopenharmony_ci		} else {
974a46c0ec8Sopenharmony_ci			litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 0);
975a46c0ec8Sopenharmony_ci			litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 1);
976a46c0ec8Sopenharmony_ci		}
977a46c0ec8Sopenharmony_ci		button = BTN_MIDDLE;
978a46c0ec8Sopenharmony_ci	}
979a46c0ec8Sopenharmony_ci
980a46c0ec8Sopenharmony_ci	litest_button_click(dev, BTN_LEFT, true);
981a46c0ec8Sopenharmony_ci
982a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
983a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, button,
984a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
985a46c0ec8Sopenharmony_ci
986a46c0ec8Sopenharmony_ci	for (int i = 0; i < 20; i++) {
987a46c0ec8Sopenharmony_ci		litest_push_event_frame(dev);
988a46c0ec8Sopenharmony_ci		switch (nfingers) {
989a46c0ec8Sopenharmony_ci		case 3:
990a46c0ec8Sopenharmony_ci			if (nslots >= nfingers)
991a46c0ec8Sopenharmony_ci				litest_touch_move(dev, 2, 60, 50 + i);
992a46c0ec8Sopenharmony_ci			_fallthrough_;
993a46c0ec8Sopenharmony_ci		case 2:
994a46c0ec8Sopenharmony_ci			if (nslots >= nfingers)
995a46c0ec8Sopenharmony_ci				litest_touch_move(dev, 1, 50, 50 + i);
996a46c0ec8Sopenharmony_ci			_fallthrough_;
997a46c0ec8Sopenharmony_ci		case 1:
998a46c0ec8Sopenharmony_ci			litest_touch_move(dev, 0, 40, 50 + i);
999a46c0ec8Sopenharmony_ci			break;
1000a46c0ec8Sopenharmony_ci		}
1001a46c0ec8Sopenharmony_ci		litest_pop_event_frame(dev);
1002a46c0ec8Sopenharmony_ci		libinput_dispatch(li);
1003a46c0ec8Sopenharmony_ci	}
1004a46c0ec8Sopenharmony_ci
1005a46c0ec8Sopenharmony_ci	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
1006a46c0ec8Sopenharmony_ci
1007a46c0ec8Sopenharmony_ci	litest_button_click(dev, BTN_LEFT, false);
1008a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, button,
1009a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
1010a46c0ec8Sopenharmony_ci
1011a46c0ec8Sopenharmony_ci	if (nfingers > 3) {
1012a46c0ec8Sopenharmony_ci		if (nslots > 3) {
1013a46c0ec8Sopenharmony_ci			litest_touch_up(dev, 2);
1014a46c0ec8Sopenharmony_ci		} else {
1015a46c0ec8Sopenharmony_ci			litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 1);
1016a46c0ec8Sopenharmony_ci			litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 0);
1017a46c0ec8Sopenharmony_ci		}
1018a46c0ec8Sopenharmony_ci	}
1019a46c0ec8Sopenharmony_ci
1020a46c0ec8Sopenharmony_ci	if (nfingers > 2) {
1021a46c0ec8Sopenharmony_ci		if (nslots > 2) {
1022a46c0ec8Sopenharmony_ci			litest_touch_up(dev, 1);
1023a46c0ec8Sopenharmony_ci		} else {
1024a46c0ec8Sopenharmony_ci			litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 0);
1025a46c0ec8Sopenharmony_ci		}
1026a46c0ec8Sopenharmony_ci	}
1027a46c0ec8Sopenharmony_ci
1028a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
1029a46c0ec8Sopenharmony_ci
1030a46c0ec8Sopenharmony_ci
1031a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
1032a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1033a46c0ec8Sopenharmony_ci}
1034a46c0ec8Sopenharmony_ciEND_TEST
1035a46c0ec8Sopenharmony_ci
1036a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_btn_left)
1037a46c0ec8Sopenharmony_ci{
1038a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
1039a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
1040a46c0ec8Sopenharmony_ci
1041a46c0ec8Sopenharmony_ci	litest_drain_events(li);
1042a46c0ec8Sopenharmony_ci
1043a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
1044a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1045a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
1046a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1047a46c0ec8Sopenharmony_ci
1048a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
1049a46c0ec8Sopenharmony_ci
1050a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_LEFT,
1051a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
1052a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_LEFT,
1053a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
1054a46c0ec8Sopenharmony_ci}
1055a46c0ec8Sopenharmony_ciEND_TEST
1056a46c0ec8Sopenharmony_ci
1057a46c0ec8Sopenharmony_ciSTART_TEST(clickpad_btn_left)
1058a46c0ec8Sopenharmony_ci{
1059a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
1060a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
1061a46c0ec8Sopenharmony_ci
1062a46c0ec8Sopenharmony_ci	litest_enable_buttonareas(dev);
1063a46c0ec8Sopenharmony_ci
1064a46c0ec8Sopenharmony_ci	litest_drain_events(li);
1065a46c0ec8Sopenharmony_ci
1066a46c0ec8Sopenharmony_ci	/* A clickpad always needs a finger down to tell where the
1067a46c0ec8Sopenharmony_ci	   click happens */
1068a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
1069a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1070a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
1071a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1072a46c0ec8Sopenharmony_ci
1073a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
1074a46c0ec8Sopenharmony_ci	ck_assert_int_eq(libinput_next_event_type(li), LIBINPUT_EVENT_NONE);
1075a46c0ec8Sopenharmony_ci}
1076a46c0ec8Sopenharmony_ciEND_TEST
1077a46c0ec8Sopenharmony_ci
1078a46c0ec8Sopenharmony_ciSTART_TEST(clickpad_click_n_drag)
1079a46c0ec8Sopenharmony_ci{
1080a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
1081a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
1082a46c0ec8Sopenharmony_ci
1083a46c0ec8Sopenharmony_ci	litest_drain_events(li);
1084a46c0ec8Sopenharmony_ci
1085a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 50, 50);
1086a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
1087a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1088a46c0ec8Sopenharmony_ci
1089a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
1090a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_LEFT,
1091a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
1092a46c0ec8Sopenharmony_ci
1093a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
1094a46c0ec8Sopenharmony_ci	ck_assert_int_eq(libinput_next_event_type(li), LIBINPUT_EVENT_NONE);
1095a46c0ec8Sopenharmony_ci
1096a46c0ec8Sopenharmony_ci	/* now put a second finger down */
1097a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 1, 70, 70);
1098a46c0ec8Sopenharmony_ci	litest_touch_move_to(dev, 1, 70, 70, 80, 50, 5);
1099a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 1);
1100a46c0ec8Sopenharmony_ci
1101a46c0ec8Sopenharmony_ci	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
1102a46c0ec8Sopenharmony_ci
1103a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
1104a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1105a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
1106a46c0ec8Sopenharmony_ci
1107a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_LEFT,
1108a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
1109a46c0ec8Sopenharmony_ci}
1110a46c0ec8Sopenharmony_ciEND_TEST
1111a46c0ec8Sopenharmony_ci
1112a46c0ec8Sopenharmony_ciSTART_TEST(clickpad_finger_pin)
1113a46c0ec8Sopenharmony_ci{
1114a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
1115a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
1116a46c0ec8Sopenharmony_ci	struct libevdev *evdev = dev->evdev;
1117a46c0ec8Sopenharmony_ci	const struct input_absinfo *abs;
1118a46c0ec8Sopenharmony_ci	double w, h;
1119a46c0ec8Sopenharmony_ci	double dist;
1120a46c0ec8Sopenharmony_ci
1121a46c0ec8Sopenharmony_ci	abs = libevdev_get_abs_info(evdev, ABS_MT_POSITION_X);
1122a46c0ec8Sopenharmony_ci	ck_assert_notnull(abs);
1123a46c0ec8Sopenharmony_ci	if (abs->resolution == 0)
1124a46c0ec8Sopenharmony_ci		return;
1125a46c0ec8Sopenharmony_ci
1126a46c0ec8Sopenharmony_ci	if (libinput_device_get_size(dev->libinput_device, &w, &h) != 0)
1127a46c0ec8Sopenharmony_ci		return;
1128a46c0ec8Sopenharmony_ci
1129a46c0ec8Sopenharmony_ci	dist = 100.0/max(w, h);
1130a46c0ec8Sopenharmony_ci
1131a46c0ec8Sopenharmony_ci	litest_drain_events(li);
1132a46c0ec8Sopenharmony_ci
1133a46c0ec8Sopenharmony_ci	/* make sure the movement generates pointer events when
1134a46c0ec8Sopenharmony_ci	   not pinned */
1135a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 50, 50);
1136a46c0ec8Sopenharmony_ci	litest_touch_move_to(dev, 0, 50, 50, 54, 54, 10);
1137a46c0ec8Sopenharmony_ci	litest_touch_move_to(dev, 0, 54, 54, 46, 46, 10);
1138a46c0ec8Sopenharmony_ci	litest_touch_move_to(dev, 0, 46, 46, 50, 50, 10);
1139a46c0ec8Sopenharmony_ci	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
1140a46c0ec8Sopenharmony_ci
1141a46c0ec8Sopenharmony_ci	litest_button_click(dev, BTN_LEFT, true);
1142a46c0ec8Sopenharmony_ci	litest_drain_events(li);
1143a46c0ec8Sopenharmony_ci
1144a46c0ec8Sopenharmony_ci	litest_touch_move_to(dev, 0, 50, 50, 50 + dist, 50 + dist, 10);
1145a46c0ec8Sopenharmony_ci	litest_touch_move_to(dev, 0, 50 + dist, 50 + dist, 50, 50, 10);
1146a46c0ec8Sopenharmony_ci	litest_touch_move_to(dev, 0, 50, 50, 50 - dist, 50 - dist, 10);
1147a46c0ec8Sopenharmony_ci
1148a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1149a46c0ec8Sopenharmony_ci
1150a46c0ec8Sopenharmony_ci	litest_button_click(dev, BTN_LEFT, false);
1151a46c0ec8Sopenharmony_ci	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_BUTTON);
1152a46c0ec8Sopenharmony_ci
1153a46c0ec8Sopenharmony_ci	/* still pinned after release */
1154a46c0ec8Sopenharmony_ci	litest_touch_move_to(dev, 0, 50, 50, 50 + dist, 50 + dist, 10);
1155a46c0ec8Sopenharmony_ci	litest_touch_move_to(dev, 0, 50 + dist, 50 + dist, 50, 50, 10);
1156a46c0ec8Sopenharmony_ci	litest_touch_move_to(dev, 0, 50, 50, 50 - dist, 50 - dist, 10);
1157a46c0ec8Sopenharmony_ci
1158a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1159a46c0ec8Sopenharmony_ci
1160a46c0ec8Sopenharmony_ci	/* move to unpin */
1161a46c0ec8Sopenharmony_ci	litest_touch_move_to(dev, 0, 50, 50, 70, 70, 10);
1162a46c0ec8Sopenharmony_ci	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
1163a46c0ec8Sopenharmony_ci}
1164a46c0ec8Sopenharmony_ciEND_TEST
1165a46c0ec8Sopenharmony_ci
1166a46c0ec8Sopenharmony_ciSTART_TEST(clickpad_softbutton_left)
1167a46c0ec8Sopenharmony_ci{
1168a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
1169a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
1170a46c0ec8Sopenharmony_ci
1171a46c0ec8Sopenharmony_ci	litest_drain_events(li);
1172a46c0ec8Sopenharmony_ci
1173a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 10, 90);
1174a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
1175a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1176a46c0ec8Sopenharmony_ci
1177a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1178a46c0ec8Sopenharmony_ci				   BTN_LEFT,
1179a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
1180a46c0ec8Sopenharmony_ci
1181a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
1182a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1183a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
1184a46c0ec8Sopenharmony_ci
1185a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1186a46c0ec8Sopenharmony_ci				   BTN_LEFT,
1187a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
1188a46c0ec8Sopenharmony_ci
1189a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
1190a46c0ec8Sopenharmony_ci
1191a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1192a46c0ec8Sopenharmony_ci}
1193a46c0ec8Sopenharmony_ciEND_TEST
1194a46c0ec8Sopenharmony_ci
1195a46c0ec8Sopenharmony_ciSTART_TEST(clickpad_softbutton_middle)
1196a46c0ec8Sopenharmony_ci{
1197a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
1198a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
1199a46c0ec8Sopenharmony_ci
1200a46c0ec8Sopenharmony_ci	litest_drain_events(li);
1201a46c0ec8Sopenharmony_ci
1202a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 50, 90);
1203a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
1204a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1205a46c0ec8Sopenharmony_ci
1206a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1207a46c0ec8Sopenharmony_ci				   BTN_MIDDLE,
1208a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
1209a46c0ec8Sopenharmony_ci
1210a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
1211a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1212a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
1213a46c0ec8Sopenharmony_ci
1214a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1215a46c0ec8Sopenharmony_ci				   BTN_MIDDLE,
1216a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
1217a46c0ec8Sopenharmony_ci
1218a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
1219a46c0ec8Sopenharmony_ci
1220a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1221a46c0ec8Sopenharmony_ci}
1222a46c0ec8Sopenharmony_ciEND_TEST
1223a46c0ec8Sopenharmony_ci
1224a46c0ec8Sopenharmony_ciSTART_TEST(clickpad_softbutton_right)
1225a46c0ec8Sopenharmony_ci{
1226a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
1227a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
1228a46c0ec8Sopenharmony_ci
1229a46c0ec8Sopenharmony_ci	litest_drain_events(li);
1230a46c0ec8Sopenharmony_ci
1231a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 90, 90);
1232a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
1233a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1234a46c0ec8Sopenharmony_ci
1235a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1236a46c0ec8Sopenharmony_ci				   BTN_RIGHT,
1237a46c0ec8Sopenharmony_ci			    LIBINPUT_BUTTON_STATE_PRESSED);
1238a46c0ec8Sopenharmony_ci
1239a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
1240a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1241a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
1242a46c0ec8Sopenharmony_ci
1243a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1244a46c0ec8Sopenharmony_ci				   BTN_RIGHT,
1245a46c0ec8Sopenharmony_ci			    LIBINPUT_BUTTON_STATE_RELEASED);
1246a46c0ec8Sopenharmony_ci
1247a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
1248a46c0ec8Sopenharmony_ci
1249a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1250a46c0ec8Sopenharmony_ci}
1251a46c0ec8Sopenharmony_ciEND_TEST
1252a46c0ec8Sopenharmony_ci
1253a46c0ec8Sopenharmony_ciSTART_TEST(clickpad_softbutton_left_tap_n_drag)
1254a46c0ec8Sopenharmony_ci{
1255a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
1256a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
1257a46c0ec8Sopenharmony_ci
1258a46c0ec8Sopenharmony_ci	litest_enable_tap(dev->libinput_device);
1259a46c0ec8Sopenharmony_ci
1260a46c0ec8Sopenharmony_ci	litest_drain_events(li);
1261a46c0ec8Sopenharmony_ci
1262a46c0ec8Sopenharmony_ci	/* Tap in left button area, then finger down, button click
1263a46c0ec8Sopenharmony_ci		-> expect left button press/release and left button press
1264a46c0ec8Sopenharmony_ci	   Release button, finger up
1265a46c0ec8Sopenharmony_ci		-> expect right button release
1266a46c0ec8Sopenharmony_ci	 */
1267a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 20, 90);
1268a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
1269a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 20, 90);
1270a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
1271a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1272a46c0ec8Sopenharmony_ci
1273a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1274a46c0ec8Sopenharmony_ci				   BTN_LEFT,
1275a46c0ec8Sopenharmony_ci			    LIBINPUT_BUTTON_STATE_PRESSED);
1276a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1277a46c0ec8Sopenharmony_ci				   BTN_LEFT,
1278a46c0ec8Sopenharmony_ci			    LIBINPUT_BUTTON_STATE_RELEASED);
1279a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1280a46c0ec8Sopenharmony_ci				   BTN_LEFT,
1281a46c0ec8Sopenharmony_ci			    LIBINPUT_BUTTON_STATE_PRESSED);
1282a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1283a46c0ec8Sopenharmony_ci
1284a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
1285a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1286a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
1287a46c0ec8Sopenharmony_ci
1288a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1289a46c0ec8Sopenharmony_ci				   BTN_LEFT,
1290a46c0ec8Sopenharmony_ci			    LIBINPUT_BUTTON_STATE_RELEASED);
1291a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1292a46c0ec8Sopenharmony_ci}
1293a46c0ec8Sopenharmony_ciEND_TEST
1294a46c0ec8Sopenharmony_ci
1295a46c0ec8Sopenharmony_ciSTART_TEST(clickpad_softbutton_right_tap_n_drag)
1296a46c0ec8Sopenharmony_ci{
1297a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
1298a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
1299a46c0ec8Sopenharmony_ci
1300a46c0ec8Sopenharmony_ci	litest_enable_tap(dev->libinput_device);
1301a46c0ec8Sopenharmony_ci
1302a46c0ec8Sopenharmony_ci	litest_drain_events(li);
1303a46c0ec8Sopenharmony_ci
1304a46c0ec8Sopenharmony_ci	/* Tap in right button area, then finger down, button click
1305a46c0ec8Sopenharmony_ci		-> expect left button press/release and right button press
1306a46c0ec8Sopenharmony_ci	   Release button, finger up
1307a46c0ec8Sopenharmony_ci		-> expect right button release
1308a46c0ec8Sopenharmony_ci	 */
1309a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 90, 90);
1310a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
1311a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 90, 90);
1312a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
1313a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1314a46c0ec8Sopenharmony_ci
1315a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1316a46c0ec8Sopenharmony_ci				   BTN_LEFT,
1317a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
1318a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1319a46c0ec8Sopenharmony_ci				   BTN_LEFT,
1320a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
1321a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1322a46c0ec8Sopenharmony_ci				   BTN_RIGHT,
1323a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
1324a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1325a46c0ec8Sopenharmony_ci
1326a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
1327a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1328a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
1329a46c0ec8Sopenharmony_ci
1330a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1331a46c0ec8Sopenharmony_ci				   BTN_RIGHT,
1332a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
1333a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1334a46c0ec8Sopenharmony_ci}
1335a46c0ec8Sopenharmony_ciEND_TEST
1336a46c0ec8Sopenharmony_ci
1337a46c0ec8Sopenharmony_ciSTART_TEST(clickpad_softbutton_left_1st_fg_move)
1338a46c0ec8Sopenharmony_ci{
1339a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
1340a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
1341a46c0ec8Sopenharmony_ci	struct libinput_event *event;
1342a46c0ec8Sopenharmony_ci	double x = 0, y = 0;
1343a46c0ec8Sopenharmony_ci	int nevents = 0;
1344a46c0ec8Sopenharmony_ci
1345a46c0ec8Sopenharmony_ci	litest_drain_events(li);
1346a46c0ec8Sopenharmony_ci
1347a46c0ec8Sopenharmony_ci	/* One finger down in the left button area, button press
1348a46c0ec8Sopenharmony_ci		-> expect a button event
1349a46c0ec8Sopenharmony_ci	   Move finger up out of the area, wait for timeout
1350a46c0ec8Sopenharmony_ci	   Move finger around diagonally down left
1351a46c0ec8Sopenharmony_ci		-> expect motion events down left
1352a46c0ec8Sopenharmony_ci	   Release finger
1353a46c0ec8Sopenharmony_ci		-> expect a button event */
1354a46c0ec8Sopenharmony_ci
1355a46c0ec8Sopenharmony_ci	/* finger down, press in left button */
1356a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 20, 90);
1357a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
1358a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1359a46c0ec8Sopenharmony_ci
1360a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1361a46c0ec8Sopenharmony_ci				   BTN_LEFT,
1362a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
1363a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1364a46c0ec8Sopenharmony_ci
1365a46c0ec8Sopenharmony_ci	/* move out of the area, then wait for softbutton timer */
1366a46c0ec8Sopenharmony_ci	litest_touch_move_to(dev, 0, 20, 90, 50, 50, 20);
1367a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
1368a46c0ec8Sopenharmony_ci	litest_timeout_softbuttons();
1369a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
1370a46c0ec8Sopenharmony_ci	litest_drain_events(li);
1371a46c0ec8Sopenharmony_ci
1372a46c0ec8Sopenharmony_ci	/* move down left, expect motion */
1373a46c0ec8Sopenharmony_ci	litest_touch_move_to(dev, 0, 50, 50, 20, 90, 20);
1374a46c0ec8Sopenharmony_ci
1375a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
1376a46c0ec8Sopenharmony_ci	event = libinput_get_event(li);
1377a46c0ec8Sopenharmony_ci	ck_assert_notnull(event);
1378a46c0ec8Sopenharmony_ci	while (event) {
1379a46c0ec8Sopenharmony_ci		struct libinput_event_pointer *p;
1380a46c0ec8Sopenharmony_ci
1381a46c0ec8Sopenharmony_ci		ck_assert_int_eq(libinput_event_get_type(event),
1382a46c0ec8Sopenharmony_ci				 LIBINPUT_EVENT_POINTER_MOTION);
1383a46c0ec8Sopenharmony_ci		p = libinput_event_get_pointer_event(event);
1384a46c0ec8Sopenharmony_ci
1385a46c0ec8Sopenharmony_ci		/* we moved up/right, now down/left so the pointer accel
1386a46c0ec8Sopenharmony_ci		   code may lag behind with the dx/dy vectors. Hence, add up
1387a46c0ec8Sopenharmony_ci		   the x/y movements and expect that on average we moved
1388a46c0ec8Sopenharmony_ci		   left and down */
1389a46c0ec8Sopenharmony_ci		x += libinput_event_pointer_get_dx(p);
1390a46c0ec8Sopenharmony_ci		y += libinput_event_pointer_get_dy(p);
1391a46c0ec8Sopenharmony_ci		nevents++;
1392a46c0ec8Sopenharmony_ci
1393a46c0ec8Sopenharmony_ci		libinput_event_destroy(event);
1394a46c0ec8Sopenharmony_ci		libinput_dispatch(li);
1395a46c0ec8Sopenharmony_ci		event = libinput_get_event(li);
1396a46c0ec8Sopenharmony_ci	}
1397a46c0ec8Sopenharmony_ci
1398a46c0ec8Sopenharmony_ci	ck_assert(x/nevents < 0);
1399a46c0ec8Sopenharmony_ci	ck_assert(y/nevents > 0);
1400a46c0ec8Sopenharmony_ci
1401a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
1402a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1403a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
1404a46c0ec8Sopenharmony_ci
1405a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1406a46c0ec8Sopenharmony_ci				   BTN_LEFT,
1407a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
1408a46c0ec8Sopenharmony_ci
1409a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1410a46c0ec8Sopenharmony_ci}
1411a46c0ec8Sopenharmony_ciEND_TEST
1412a46c0ec8Sopenharmony_ci
1413a46c0ec8Sopenharmony_ciSTART_TEST(clickpad_softbutton_left_2nd_fg_move)
1414a46c0ec8Sopenharmony_ci{
1415a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
1416a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
1417a46c0ec8Sopenharmony_ci	struct libinput_event *event;
1418a46c0ec8Sopenharmony_ci
1419a46c0ec8Sopenharmony_ci	litest_drain_events(li);
1420a46c0ec8Sopenharmony_ci
1421a46c0ec8Sopenharmony_ci	/* One finger down in the left button area, button press
1422a46c0ec8Sopenharmony_ci		-> expect a button event
1423a46c0ec8Sopenharmony_ci	   Put a second finger down in the area, move it right, release
1424a46c0ec8Sopenharmony_ci		-> expect motion events right
1425a46c0ec8Sopenharmony_ci	   Put a second finger down in the area, move it down, release
1426a46c0ec8Sopenharmony_ci		-> expect motion events down
1427a46c0ec8Sopenharmony_ci	   Release second finger, release first finger
1428a46c0ec8Sopenharmony_ci		-> expect a button event */
1429a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 20, 90);
1430a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
1431a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1432a46c0ec8Sopenharmony_ci
1433a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1434a46c0ec8Sopenharmony_ci				   BTN_LEFT,
1435a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
1436a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1437a46c0ec8Sopenharmony_ci
1438a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 1, 20, 20);
1439a46c0ec8Sopenharmony_ci	litest_touch_move_to(dev, 1, 20, 20, 80, 20, 15);
1440a46c0ec8Sopenharmony_ci
1441a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
1442a46c0ec8Sopenharmony_ci	event = libinput_get_event(li);
1443a46c0ec8Sopenharmony_ci	ck_assert_notnull(event);
1444a46c0ec8Sopenharmony_ci	while (event) {
1445a46c0ec8Sopenharmony_ci		struct libinput_event_pointer *p;
1446a46c0ec8Sopenharmony_ci		double x, y;
1447a46c0ec8Sopenharmony_ci
1448a46c0ec8Sopenharmony_ci		ck_assert_int_eq(libinput_event_get_type(event),
1449a46c0ec8Sopenharmony_ci				 LIBINPUT_EVENT_POINTER_MOTION);
1450a46c0ec8Sopenharmony_ci		p = libinput_event_get_pointer_event(event);
1451a46c0ec8Sopenharmony_ci
1452a46c0ec8Sopenharmony_ci		x = libinput_event_pointer_get_dx(p);
1453a46c0ec8Sopenharmony_ci		y = libinput_event_pointer_get_dy(p);
1454a46c0ec8Sopenharmony_ci
1455a46c0ec8Sopenharmony_ci		/* Ignore events only containing an unaccelerated motion
1456a46c0ec8Sopenharmony_ci		 * vector. */
1457a46c0ec8Sopenharmony_ci		if (x != 0 || y != 0) {
1458a46c0ec8Sopenharmony_ci			ck_assert(x > 0);
1459a46c0ec8Sopenharmony_ci			ck_assert(y == 0);
1460a46c0ec8Sopenharmony_ci		}
1461a46c0ec8Sopenharmony_ci
1462a46c0ec8Sopenharmony_ci		libinput_event_destroy(event);
1463a46c0ec8Sopenharmony_ci		libinput_dispatch(li);
1464a46c0ec8Sopenharmony_ci		event = libinput_get_event(li);
1465a46c0ec8Sopenharmony_ci	}
1466a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 1);
1467a46c0ec8Sopenharmony_ci
1468a46c0ec8Sopenharmony_ci	/* second finger down */
1469a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 1, 20, 20);
1470a46c0ec8Sopenharmony_ci	litest_touch_move_to(dev, 1, 20, 20, 20, 80, 15);
1471a46c0ec8Sopenharmony_ci
1472a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
1473a46c0ec8Sopenharmony_ci	event = libinput_get_event(li);
1474a46c0ec8Sopenharmony_ci	ck_assert_notnull(event);
1475a46c0ec8Sopenharmony_ci	while (event) {
1476a46c0ec8Sopenharmony_ci		struct libinput_event_pointer *p;
1477a46c0ec8Sopenharmony_ci		double x, y;
1478a46c0ec8Sopenharmony_ci
1479a46c0ec8Sopenharmony_ci		ck_assert_int_eq(libinput_event_get_type(event),
1480a46c0ec8Sopenharmony_ci				 LIBINPUT_EVENT_POINTER_MOTION);
1481a46c0ec8Sopenharmony_ci		p = libinput_event_get_pointer_event(event);
1482a46c0ec8Sopenharmony_ci
1483a46c0ec8Sopenharmony_ci		x = libinput_event_pointer_get_dx(p);
1484a46c0ec8Sopenharmony_ci		y = libinput_event_pointer_get_dy(p);
1485a46c0ec8Sopenharmony_ci
1486a46c0ec8Sopenharmony_ci		ck_assert(x == 0);
1487a46c0ec8Sopenharmony_ci		ck_assert(y > 0);
1488a46c0ec8Sopenharmony_ci
1489a46c0ec8Sopenharmony_ci		libinput_event_destroy(event);
1490a46c0ec8Sopenharmony_ci		libinput_dispatch(li);
1491a46c0ec8Sopenharmony_ci		event = libinput_get_event(li);
1492a46c0ec8Sopenharmony_ci	}
1493a46c0ec8Sopenharmony_ci
1494a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 1);
1495a46c0ec8Sopenharmony_ci
1496a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
1497a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1498a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
1499a46c0ec8Sopenharmony_ci
1500a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1501a46c0ec8Sopenharmony_ci				   BTN_LEFT,
1502a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
1503a46c0ec8Sopenharmony_ci
1504a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1505a46c0ec8Sopenharmony_ci}
1506a46c0ec8Sopenharmony_ciEND_TEST
1507a46c0ec8Sopenharmony_ci
1508a46c0ec8Sopenharmony_ciSTART_TEST(clickpad_softbutton_left_to_right)
1509a46c0ec8Sopenharmony_ci{
1510a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
1511a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
1512a46c0ec8Sopenharmony_ci
1513a46c0ec8Sopenharmony_ci	litest_drain_events(li);
1514a46c0ec8Sopenharmony_ci
1515a46c0ec8Sopenharmony_ci	/* One finger down in left software button area,
1516a46c0ec8Sopenharmony_ci	   move to right button area immediately, click
1517a46c0ec8Sopenharmony_ci		-> expect right button event
1518a46c0ec8Sopenharmony_ci	*/
1519a46c0ec8Sopenharmony_ci
1520a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 30, 90);
1521a46c0ec8Sopenharmony_ci	litest_touch_move_to(dev, 0, 30, 90, 90, 90, 15);
1522a46c0ec8Sopenharmony_ci	litest_drain_events(li);
1523a46c0ec8Sopenharmony_ci
1524a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
1525a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1526a46c0ec8Sopenharmony_ci
1527a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1528a46c0ec8Sopenharmony_ci				   BTN_RIGHT,
1529a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
1530a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1531a46c0ec8Sopenharmony_ci
1532a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
1533a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1534a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
1535a46c0ec8Sopenharmony_ci
1536a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1537a46c0ec8Sopenharmony_ci				   BTN_RIGHT,
1538a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
1539a46c0ec8Sopenharmony_ci
1540a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1541a46c0ec8Sopenharmony_ci}
1542a46c0ec8Sopenharmony_ciEND_TEST
1543a46c0ec8Sopenharmony_ci
1544a46c0ec8Sopenharmony_ciSTART_TEST(clickpad_softbutton_right_to_left)
1545a46c0ec8Sopenharmony_ci{
1546a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
1547a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
1548a46c0ec8Sopenharmony_ci
1549a46c0ec8Sopenharmony_ci	litest_drain_events(li);
1550a46c0ec8Sopenharmony_ci
1551a46c0ec8Sopenharmony_ci	/* One finger down in right software button area,
1552a46c0ec8Sopenharmony_ci	   move to left button area immediately, click
1553a46c0ec8Sopenharmony_ci		-> expect left button event
1554a46c0ec8Sopenharmony_ci	*/
1555a46c0ec8Sopenharmony_ci
1556a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 80, 90);
1557a46c0ec8Sopenharmony_ci	litest_touch_move_to(dev, 0, 80, 90, 30, 90, 15);
1558a46c0ec8Sopenharmony_ci	litest_drain_events(li);
1559a46c0ec8Sopenharmony_ci
1560a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
1561a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1562a46c0ec8Sopenharmony_ci
1563a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1564a46c0ec8Sopenharmony_ci				   BTN_LEFT,
1565a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
1566a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1567a46c0ec8Sopenharmony_ci
1568a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
1569a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1570a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
1571a46c0ec8Sopenharmony_ci
1572a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1573a46c0ec8Sopenharmony_ci				   BTN_LEFT,
1574a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
1575a46c0ec8Sopenharmony_ci
1576a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1577a46c0ec8Sopenharmony_ci}
1578a46c0ec8Sopenharmony_ciEND_TEST
1579a46c0ec8Sopenharmony_ci
1580a46c0ec8Sopenharmony_ciSTART_TEST(clickpad_softbutton_hover_into_buttons)
1581a46c0ec8Sopenharmony_ci{
1582a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
1583a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
1584a46c0ec8Sopenharmony_ci
1585a46c0ec8Sopenharmony_ci	litest_drain_events(li);
1586a46c0ec8Sopenharmony_ci
1587a46c0ec8Sopenharmony_ci	litest_hover_start(dev, 0, 50, 50);
1588a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
1589a46c0ec8Sopenharmony_ci	litest_hover_move_to(dev, 0, 50, 50, 90, 90, 10);
1590a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
1591a46c0ec8Sopenharmony_ci
1592a46c0ec8Sopenharmony_ci	litest_touch_move_to(dev, 0, 90, 90, 91, 91, 1);
1593a46c0ec8Sopenharmony_ci
1594a46c0ec8Sopenharmony_ci	litest_button_click(dev, BTN_LEFT, true);
1595a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
1596a46c0ec8Sopenharmony_ci
1597a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1598a46c0ec8Sopenharmony_ci				   BTN_RIGHT,
1599a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
1600a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1601a46c0ec8Sopenharmony_ci
1602a46c0ec8Sopenharmony_ci	litest_button_click(dev, BTN_LEFT, false);
1603a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
1604a46c0ec8Sopenharmony_ci
1605a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1606a46c0ec8Sopenharmony_ci				   BTN_RIGHT,
1607a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
1608a46c0ec8Sopenharmony_ci}
1609a46c0ec8Sopenharmony_ciEND_TEST
1610a46c0ec8Sopenharmony_ci
1611a46c0ec8Sopenharmony_ciSTART_TEST(clickpad_topsoftbuttons_left)
1612a46c0ec8Sopenharmony_ci{
1613a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
1614a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
1615a46c0ec8Sopenharmony_ci
1616a46c0ec8Sopenharmony_ci	litest_drain_events(li);
1617a46c0ec8Sopenharmony_ci
1618a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 10, 5);
1619a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
1620a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1621a46c0ec8Sopenharmony_ci
1622a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1623a46c0ec8Sopenharmony_ci				   BTN_LEFT,
1624a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
1625a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1626a46c0ec8Sopenharmony_ci
1627a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
1628a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1629a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
1630a46c0ec8Sopenharmony_ci
1631a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1632a46c0ec8Sopenharmony_ci				   BTN_LEFT,
1633a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
1634a46c0ec8Sopenharmony_ci
1635a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1636a46c0ec8Sopenharmony_ci}
1637a46c0ec8Sopenharmony_ciEND_TEST
1638a46c0ec8Sopenharmony_ci
1639a46c0ec8Sopenharmony_ciSTART_TEST(clickpad_topsoftbuttons_right)
1640a46c0ec8Sopenharmony_ci{
1641a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
1642a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
1643a46c0ec8Sopenharmony_ci
1644a46c0ec8Sopenharmony_ci	litest_drain_events(li);
1645a46c0ec8Sopenharmony_ci
1646a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 90, 5);
1647a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
1648a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1649a46c0ec8Sopenharmony_ci
1650a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1651a46c0ec8Sopenharmony_ci				   BTN_RIGHT,
1652a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
1653a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1654a46c0ec8Sopenharmony_ci
1655a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
1656a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1657a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
1658a46c0ec8Sopenharmony_ci
1659a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1660a46c0ec8Sopenharmony_ci				   BTN_RIGHT,
1661a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
1662a46c0ec8Sopenharmony_ci
1663a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1664a46c0ec8Sopenharmony_ci}
1665a46c0ec8Sopenharmony_ciEND_TEST
1666a46c0ec8Sopenharmony_ci
1667a46c0ec8Sopenharmony_ciSTART_TEST(clickpad_topsoftbuttons_middle)
1668a46c0ec8Sopenharmony_ci{
1669a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
1670a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
1671a46c0ec8Sopenharmony_ci
1672a46c0ec8Sopenharmony_ci	litest_drain_events(li);
1673a46c0ec8Sopenharmony_ci
1674a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 50, 5);
1675a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
1676a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1677a46c0ec8Sopenharmony_ci
1678a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1679a46c0ec8Sopenharmony_ci				   BTN_MIDDLE,
1680a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
1681a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1682a46c0ec8Sopenharmony_ci
1683a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
1684a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1685a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
1686a46c0ec8Sopenharmony_ci
1687a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1688a46c0ec8Sopenharmony_ci				   BTN_MIDDLE,
1689a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
1690a46c0ec8Sopenharmony_ci
1691a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1692a46c0ec8Sopenharmony_ci}
1693a46c0ec8Sopenharmony_ciEND_TEST
1694a46c0ec8Sopenharmony_ci
1695a46c0ec8Sopenharmony_ciSTART_TEST(clickpad_topsoftbuttons_move_out_leftclick_before_timeout)
1696a46c0ec8Sopenharmony_ci{
1697a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
1698a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
1699a46c0ec8Sopenharmony_ci
1700a46c0ec8Sopenharmony_ci	/* Finger down in top right button area, wait past enter timeout
1701a46c0ec8Sopenharmony_ci	   Move into main area, wait past leave timeout
1702a46c0ec8Sopenharmony_ci	   Click
1703a46c0ec8Sopenharmony_ci	     -> expect left click
1704a46c0ec8Sopenharmony_ci	 */
1705a46c0ec8Sopenharmony_ci
1706a46c0ec8Sopenharmony_ci	litest_drain_events(li);
1707a46c0ec8Sopenharmony_ci
1708a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 80, 5);
1709a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
1710a46c0ec8Sopenharmony_ci	litest_timeout_softbuttons();
1711a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
1712a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1713a46c0ec8Sopenharmony_ci
1714a46c0ec8Sopenharmony_ci	litest_touch_move_to(dev, 0, 80, 5, 80, 90, 20);
1715a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
1716a46c0ec8Sopenharmony_ci
1717a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
1718a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1719a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
1720a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1721a46c0ec8Sopenharmony_ci
1722a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
1723a46c0ec8Sopenharmony_ci
1724a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED);
1725a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_RELEASED);
1726a46c0ec8Sopenharmony_ci}
1727a46c0ec8Sopenharmony_ciEND_TEST
1728a46c0ec8Sopenharmony_ci
1729a46c0ec8Sopenharmony_ciSTART_TEST(clickpad_topsoftbuttons_move_out_leftclick)
1730a46c0ec8Sopenharmony_ci{
1731a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
1732a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
1733a46c0ec8Sopenharmony_ci
1734a46c0ec8Sopenharmony_ci	/* Finger down in top right button area, wait past enter timeout
1735a46c0ec8Sopenharmony_ci	   Move into main area, wait past leave timeout
1736a46c0ec8Sopenharmony_ci	   Click
1737a46c0ec8Sopenharmony_ci	     -> expect left click
1738a46c0ec8Sopenharmony_ci	 */
1739a46c0ec8Sopenharmony_ci
1740a46c0ec8Sopenharmony_ci	litest_drain_events(li);
1741a46c0ec8Sopenharmony_ci
1742a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 80, 5);
1743a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
1744a46c0ec8Sopenharmony_ci	litest_timeout_softbuttons();
1745a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
1746a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1747a46c0ec8Sopenharmony_ci
1748a46c0ec8Sopenharmony_ci	litest_touch_move_to(dev, 0, 80, 5, 80, 90, 20);
1749a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
1750a46c0ec8Sopenharmony_ci	litest_timeout_softbuttons();
1751a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
1752a46c0ec8Sopenharmony_ci
1753a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
1754a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1755a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
1756a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1757a46c0ec8Sopenharmony_ci
1758a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
1759a46c0ec8Sopenharmony_ci
1760a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
1761a46c0ec8Sopenharmony_ci	litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
1762a46c0ec8Sopenharmony_ci}
1763a46c0ec8Sopenharmony_ciEND_TEST
1764a46c0ec8Sopenharmony_ci
1765a46c0ec8Sopenharmony_ciSTART_TEST(clickpad_topsoftbuttons_clickfinger)
1766a46c0ec8Sopenharmony_ci{
1767a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
1768a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
1769a46c0ec8Sopenharmony_ci
1770a46c0ec8Sopenharmony_ci	litest_enable_clickfinger(dev);
1771a46c0ec8Sopenharmony_ci
1772a46c0ec8Sopenharmony_ci	litest_drain_events(li);
1773a46c0ec8Sopenharmony_ci
1774a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 90, 5);
1775a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
1776a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1777a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
1778a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1779a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
1780a46c0ec8Sopenharmony_ci
1781a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1782a46c0ec8Sopenharmony_ci				   BTN_LEFT,
1783a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
1784a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1785a46c0ec8Sopenharmony_ci				   BTN_LEFT,
1786a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
1787a46c0ec8Sopenharmony_ci
1788a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1789a46c0ec8Sopenharmony_ci
1790a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 90, 5);
1791a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 1, 80, 5);
1792a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
1793a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1794a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
1795a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1796a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
1797a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 1);
1798a46c0ec8Sopenharmony_ci
1799a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1800a46c0ec8Sopenharmony_ci				   BTN_RIGHT,
1801a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
1802a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1803a46c0ec8Sopenharmony_ci				   BTN_RIGHT,
1804a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
1805a46c0ec8Sopenharmony_ci}
1806a46c0ec8Sopenharmony_ciEND_TEST
1807a46c0ec8Sopenharmony_ci
1808a46c0ec8Sopenharmony_ciSTART_TEST(clickpad_topsoftbuttons_clickfinger_dev_disabled)
1809a46c0ec8Sopenharmony_ci{
1810a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
1811a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
1812a46c0ec8Sopenharmony_ci	struct litest_device *trackpoint = litest_add_device(li,
1813a46c0ec8Sopenharmony_ci							     LITEST_TRACKPOINT);
1814a46c0ec8Sopenharmony_ci
1815a46c0ec8Sopenharmony_ci	libinput_device_config_send_events_set_mode(dev->libinput_device,
1816a46c0ec8Sopenharmony_ci						    LIBINPUT_CONFIG_SEND_EVENTS_DISABLED);
1817a46c0ec8Sopenharmony_ci	litest_enable_clickfinger(dev);
1818a46c0ec8Sopenharmony_ci	litest_drain_events(li);
1819a46c0ec8Sopenharmony_ci
1820a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 90, 5);
1821a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
1822a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1823a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
1824a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1825a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
1826a46c0ec8Sopenharmony_ci
1827a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1828a46c0ec8Sopenharmony_ci				   BTN_RIGHT,
1829a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
1830a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1831a46c0ec8Sopenharmony_ci				   BTN_RIGHT,
1832a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
1833a46c0ec8Sopenharmony_ci
1834a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1835a46c0ec8Sopenharmony_ci
1836a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 90, 5);
1837a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 1, 10, 5);
1838a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
1839a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1840a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
1841a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1842a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
1843a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 1);
1844a46c0ec8Sopenharmony_ci
1845a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1846a46c0ec8Sopenharmony_ci				   BTN_MIDDLE,
1847a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
1848a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1849a46c0ec8Sopenharmony_ci				   BTN_MIDDLE,
1850a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
1851a46c0ec8Sopenharmony_ci
1852a46c0ec8Sopenharmony_ci	litest_delete_device(trackpoint);
1853a46c0ec8Sopenharmony_ci}
1854a46c0ec8Sopenharmony_ciEND_TEST
1855a46c0ec8Sopenharmony_ci
1856a46c0ec8Sopenharmony_ciSTART_TEST(clickpad_middleemulation_config_delayed)
1857a46c0ec8Sopenharmony_ci{
1858a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
1859a46c0ec8Sopenharmony_ci	struct libinput_device *device = dev->libinput_device;
1860a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
1861a46c0ec8Sopenharmony_ci	enum libinput_config_status status;
1862a46c0ec8Sopenharmony_ci	int enabled;
1863a46c0ec8Sopenharmony_ci
1864a46c0ec8Sopenharmony_ci	enabled = libinput_device_config_middle_emulation_get_enabled(device);
1865a46c0ec8Sopenharmony_ci	ck_assert(!enabled);
1866a46c0ec8Sopenharmony_ci
1867a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 30, 95);
1868a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
1869a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1870a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
1871a46c0ec8Sopenharmony_ci
1872a46c0ec8Sopenharmony_ci	/* actual config is delayed, but status is immediate */
1873a46c0ec8Sopenharmony_ci	status = libinput_device_config_middle_emulation_set_enabled(device,
1874a46c0ec8Sopenharmony_ci				LIBINPUT_CONFIG_MIDDLE_EMULATION_ENABLED);
1875a46c0ec8Sopenharmony_ci	ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
1876a46c0ec8Sopenharmony_ci
1877a46c0ec8Sopenharmony_ci	enabled = libinput_device_config_middle_emulation_get_enabled(device);
1878a46c0ec8Sopenharmony_ci	ck_assert(enabled);
1879a46c0ec8Sopenharmony_ci
1880a46c0ec8Sopenharmony_ci	status = libinput_device_config_middle_emulation_set_enabled(device,
1881a46c0ec8Sopenharmony_ci				LIBINPUT_CONFIG_MIDDLE_EMULATION_DISABLED);
1882a46c0ec8Sopenharmony_ci	ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
1883a46c0ec8Sopenharmony_ci	enabled = libinput_device_config_middle_emulation_get_enabled(device);
1884a46c0ec8Sopenharmony_ci	ck_assert(!enabled);
1885a46c0ec8Sopenharmony_ci}
1886a46c0ec8Sopenharmony_ciEND_TEST
1887a46c0ec8Sopenharmony_ci
1888a46c0ec8Sopenharmony_ciSTART_TEST(clickpad_middleemulation_click)
1889a46c0ec8Sopenharmony_ci{
1890a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
1891a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
1892a46c0ec8Sopenharmony_ci
1893a46c0ec8Sopenharmony_ci	litest_enable_buttonareas(dev);
1894a46c0ec8Sopenharmony_ci	litest_enable_middleemu(dev);
1895a46c0ec8Sopenharmony_ci	litest_drain_events(li);
1896a46c0ec8Sopenharmony_ci
1897a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 30, 95);
1898a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 1, 80, 95);
1899a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
1900a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1901a46c0ec8Sopenharmony_ci
1902a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1903a46c0ec8Sopenharmony_ci				   BTN_MIDDLE,
1904a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
1905a46c0ec8Sopenharmony_ci
1906a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
1907a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1908a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
1909a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 1);
1910a46c0ec8Sopenharmony_ci
1911a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1912a46c0ec8Sopenharmony_ci				   BTN_MIDDLE,
1913a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
1914a46c0ec8Sopenharmony_ci
1915a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
1916a46c0ec8Sopenharmony_ci
1917a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1918a46c0ec8Sopenharmony_ci}
1919a46c0ec8Sopenharmony_ciEND_TEST
1920a46c0ec8Sopenharmony_ci
1921a46c0ec8Sopenharmony_ciSTART_TEST(clickpad_middleemulation_click_middle_left)
1922a46c0ec8Sopenharmony_ci{
1923a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
1924a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
1925a46c0ec8Sopenharmony_ci
1926a46c0ec8Sopenharmony_ci	litest_enable_buttonareas(dev);
1927a46c0ec8Sopenharmony_ci	litest_enable_middleemu(dev);
1928a46c0ec8Sopenharmony_ci	litest_drain_events(li);
1929a46c0ec8Sopenharmony_ci
1930a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 49, 95);
1931a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
1932a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1933a46c0ec8Sopenharmony_ci
1934a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1935a46c0ec8Sopenharmony_ci				   BTN_LEFT,
1936a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
1937a46c0ec8Sopenharmony_ci
1938a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
1939a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1940a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
1941a46c0ec8Sopenharmony_ci
1942a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1943a46c0ec8Sopenharmony_ci				   BTN_LEFT,
1944a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
1945a46c0ec8Sopenharmony_ci
1946a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
1947a46c0ec8Sopenharmony_ci
1948a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1949a46c0ec8Sopenharmony_ci}
1950a46c0ec8Sopenharmony_ciEND_TEST
1951a46c0ec8Sopenharmony_ci
1952a46c0ec8Sopenharmony_ciSTART_TEST(clickpad_middleemulation_click_middle_right)
1953a46c0ec8Sopenharmony_ci{
1954a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
1955a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
1956a46c0ec8Sopenharmony_ci
1957a46c0ec8Sopenharmony_ci	litest_enable_buttonareas(dev);
1958a46c0ec8Sopenharmony_ci	litest_enable_middleemu(dev);
1959a46c0ec8Sopenharmony_ci	litest_drain_events(li);
1960a46c0ec8Sopenharmony_ci
1961a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 51, 95);
1962a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
1963a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1964a46c0ec8Sopenharmony_ci
1965a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1966a46c0ec8Sopenharmony_ci				   BTN_RIGHT,
1967a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
1968a46c0ec8Sopenharmony_ci
1969a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
1970a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1971a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
1972a46c0ec8Sopenharmony_ci
1973a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1974a46c0ec8Sopenharmony_ci				   BTN_RIGHT,
1975a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
1976a46c0ec8Sopenharmony_ci
1977a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
1978a46c0ec8Sopenharmony_ci
1979a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
1980a46c0ec8Sopenharmony_ci}
1981a46c0ec8Sopenharmony_ciEND_TEST
1982a46c0ec8Sopenharmony_ci
1983a46c0ec8Sopenharmony_ciSTART_TEST(clickpad_middleemulation_click_enable_while_down)
1984a46c0ec8Sopenharmony_ci{
1985a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
1986a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
1987a46c0ec8Sopenharmony_ci
1988a46c0ec8Sopenharmony_ci	litest_enable_buttonareas(dev);
1989a46c0ec8Sopenharmony_ci	litest_drain_events(li);
1990a46c0ec8Sopenharmony_ci
1991a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 49, 95);
1992a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
1993a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
1994a46c0ec8Sopenharmony_ci
1995a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
1996a46c0ec8Sopenharmony_ci				   BTN_MIDDLE,
1997a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
1998a46c0ec8Sopenharmony_ci
1999a46c0ec8Sopenharmony_ci	litest_enable_middleemu(dev);
2000a46c0ec8Sopenharmony_ci
2001a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
2002a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
2003a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
2004a46c0ec8Sopenharmony_ci
2005a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
2006a46c0ec8Sopenharmony_ci				   BTN_MIDDLE,
2007a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
2008a46c0ec8Sopenharmony_ci
2009a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
2010a46c0ec8Sopenharmony_ci
2011a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
2012a46c0ec8Sopenharmony_ci
2013a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 49, 95);
2014a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
2015a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
2016a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
2017a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
2018a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
2019a46c0ec8Sopenharmony_ci
2020a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
2021a46c0ec8Sopenharmony_ci				   BTN_LEFT,
2022a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
2023a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
2024a46c0ec8Sopenharmony_ci				   BTN_LEFT,
2025a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
2026a46c0ec8Sopenharmony_ci
2027a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
2028a46c0ec8Sopenharmony_ci}
2029a46c0ec8Sopenharmony_ciEND_TEST
2030a46c0ec8Sopenharmony_ci
2031a46c0ec8Sopenharmony_ciSTART_TEST(clickpad_middleemulation_click_disable_while_down)
2032a46c0ec8Sopenharmony_ci{
2033a46c0ec8Sopenharmony_ci	struct litest_device *dev = litest_current_device();
2034a46c0ec8Sopenharmony_ci	struct libinput *li = dev->libinput;
2035a46c0ec8Sopenharmony_ci
2036a46c0ec8Sopenharmony_ci	litest_enable_buttonareas(dev);
2037a46c0ec8Sopenharmony_ci	litest_enable_middleemu(dev);
2038a46c0ec8Sopenharmony_ci
2039a46c0ec8Sopenharmony_ci	litest_drain_events(li);
2040a46c0ec8Sopenharmony_ci
2041a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 30, 95);
2042a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 1, 70, 95);
2043a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
2044a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
2045a46c0ec8Sopenharmony_ci
2046a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
2047a46c0ec8Sopenharmony_ci				   BTN_MIDDLE,
2048a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
2049a46c0ec8Sopenharmony_ci
2050a46c0ec8Sopenharmony_ci	litest_disable_middleemu(dev);
2051a46c0ec8Sopenharmony_ci
2052a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
2053a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
2054a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
2055a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 1);
2056a46c0ec8Sopenharmony_ci
2057a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
2058a46c0ec8Sopenharmony_ci				   BTN_MIDDLE,
2059a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
2060a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
2061a46c0ec8Sopenharmony_ci
2062a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
2063a46c0ec8Sopenharmony_ci
2064a46c0ec8Sopenharmony_ci	litest_touch_down(dev, 0, 49, 95);
2065a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 1);
2066a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
2067a46c0ec8Sopenharmony_ci	litest_event(dev, EV_KEY, BTN_LEFT, 0);
2068a46c0ec8Sopenharmony_ci	litest_event(dev, EV_SYN, SYN_REPORT, 0);
2069a46c0ec8Sopenharmony_ci	litest_touch_up(dev, 0);
2070a46c0ec8Sopenharmony_ci
2071a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
2072a46c0ec8Sopenharmony_ci				   BTN_MIDDLE,
2073a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_PRESSED);
2074a46c0ec8Sopenharmony_ci	litest_assert_button_event(li,
2075a46c0ec8Sopenharmony_ci				   BTN_MIDDLE,
2076a46c0ec8Sopenharmony_ci				   LIBINPUT_BUTTON_STATE_RELEASED);
2077a46c0ec8Sopenharmony_ci
2078a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
2079a46c0ec8Sopenharmony_ci}
2080a46c0ec8Sopenharmony_ciEND_TEST
2081a46c0ec8Sopenharmony_ci
2082a46c0ec8Sopenharmony_ciSTART_TEST(touchpad_non_clickpad_detection)
2083a46c0ec8Sopenharmony_ci{
2084a46c0ec8Sopenharmony_ci	struct libinput *li;
2085a46c0ec8Sopenharmony_ci	struct libinput_device *device;
2086a46c0ec8Sopenharmony_ci	struct libevdev_uinput *uinput;
2087a46c0ec8Sopenharmony_ci	static struct input_absinfo absinfo[] = {
2088a46c0ec8Sopenharmony_ci		{ ABS_X, 1472, 5472, 0, 0, 75 },
2089a46c0ec8Sopenharmony_ci		{ ABS_Y, 1408, 4448, 0, 0, 129 },
2090a46c0ec8Sopenharmony_ci		{ ABS_PRESSURE, 0, 255, 0, 0, 0 },
2091a46c0ec8Sopenharmony_ci		{ ABS_TOOL_WIDTH, 0, 15, 0, 0, 0 },
2092a46c0ec8Sopenharmony_ci		{ ABS_MT_SLOT, 0, 1, 0, 0, 0 },
2093a46c0ec8Sopenharmony_ci		{ ABS_MT_POSITION_X, 1472, 5472, 0, 0, 75 },
2094a46c0ec8Sopenharmony_ci		{ ABS_MT_POSITION_Y, 1408, 4448, 0, 0, 129 },
2095a46c0ec8Sopenharmony_ci		{ ABS_MT_TRACKING_ID, 0, 65535, 0, 0, 0 },
2096a46c0ec8Sopenharmony_ci		{ ABS_MT_PRESSURE, 0, 255, 0, 0, 0 },
2097a46c0ec8Sopenharmony_ci		{ .value = -1 }
2098a46c0ec8Sopenharmony_ci	};
2099a46c0ec8Sopenharmony_ci	uint32_t methods;
2100a46c0ec8Sopenharmony_ci
2101a46c0ec8Sopenharmony_ci	/* Create a touchpad with only a left button but missing
2102a46c0ec8Sopenharmony_ci	 * INPUT_PROP_BUTTONPAD. We should treat this as clickpad.
2103a46c0ec8Sopenharmony_ci	 */
2104a46c0ec8Sopenharmony_ci	uinput = litest_create_uinput_abs_device("litest NonClickpad",
2105a46c0ec8Sopenharmony_ci						 NULL,
2106a46c0ec8Sopenharmony_ci						 absinfo,
2107a46c0ec8Sopenharmony_ci						 EV_KEY, BTN_LEFT,
2108a46c0ec8Sopenharmony_ci						 EV_KEY, BTN_TOOL_FINGER,
2109a46c0ec8Sopenharmony_ci						 EV_KEY, BTN_TOUCH,
2110a46c0ec8Sopenharmony_ci						 -1);
2111a46c0ec8Sopenharmony_ci
2112a46c0ec8Sopenharmony_ci	li = litest_create_context();
2113a46c0ec8Sopenharmony_ci	device = libinput_path_add_device(li,
2114a46c0ec8Sopenharmony_ci					  libevdev_uinput_get_devnode(uinput));
2115a46c0ec8Sopenharmony_ci
2116a46c0ec8Sopenharmony_ci	methods = libinput_device_config_click_get_methods(device);
2117a46c0ec8Sopenharmony_ci	ck_assert(methods & LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS);
2118a46c0ec8Sopenharmony_ci	ck_assert(methods & LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER);
2119a46c0ec8Sopenharmony_ci
2120a46c0ec8Sopenharmony_ci
2121a46c0ec8Sopenharmony_ci	libinput_path_remove_device(device);
2122a46c0ec8Sopenharmony_ci	libevdev_uinput_destroy(uinput);
2123a46c0ec8Sopenharmony_ci	litest_destroy_context(li);
2124a46c0ec8Sopenharmony_ci}
2125a46c0ec8Sopenharmony_ciEND_TEST
2126a46c0ec8Sopenharmony_ci
2127a46c0ec8Sopenharmony_ciTEST_COLLECTION(touchpad_buttons)
2128a46c0ec8Sopenharmony_ci{
2129a46c0ec8Sopenharmony_ci	struct range finger_count = {1, 4};
2130a46c0ec8Sopenharmony_ci
2131a46c0ec8Sopenharmony_ci	litest_add(touchpad_button, LITEST_TOUCHPAD, LITEST_CLICKPAD);
2132a46c0ec8Sopenharmony_ci
2133a46c0ec8Sopenharmony_ci	litest_add(touchpad_1fg_clickfinger, LITEST_CLICKPAD, LITEST_ANY);
2134a46c0ec8Sopenharmony_ci	litest_add(touchpad_1fg_clickfinger_no_touch, LITEST_CLICKPAD, LITEST_ANY);
2135a46c0ec8Sopenharmony_ci	litest_add(touchpad_2fg_clickfinger, LITEST_CLICKPAD, LITEST_ANY);
2136a46c0ec8Sopenharmony_ci	litest_add(touchpad_3fg_clickfinger, LITEST_CLICKPAD, LITEST_ANY);
2137a46c0ec8Sopenharmony_ci	litest_add(touchpad_3fg_clickfinger_btntool, LITEST_CLICKPAD, LITEST_ANY);
2138a46c0ec8Sopenharmony_ci	litest_add(touchpad_4fg_clickfinger, LITEST_CLICKPAD, LITEST_ANY);
2139a46c0ec8Sopenharmony_ci	litest_add(touchpad_4fg_clickfinger_btntool_2slots, LITEST_CLICKPAD, LITEST_ANY);
2140a46c0ec8Sopenharmony_ci	litest_add(touchpad_4fg_clickfinger_btntool_3slots, LITEST_CLICKPAD, LITEST_ANY);
2141a46c0ec8Sopenharmony_ci	litest_add(touchpad_2fg_clickfinger_distance, LITEST_CLICKPAD, LITEST_ANY);
2142a46c0ec8Sopenharmony_ci	litest_add(touchpad_3fg_clickfinger_distance, LITEST_CLICKPAD, LITEST_ANY);
2143a46c0ec8Sopenharmony_ci	litest_add(touchpad_3fg_clickfinger_distance_btntool, LITEST_CLICKPAD, LITEST_ANY);
2144a46c0ec8Sopenharmony_ci	litest_add_for_device(touchpad_2fg_clickfinger_bottom, LITEST_SYNAPTICS_TOPBUTTONPAD);
2145a46c0ec8Sopenharmony_ci	litest_add(touchpad_clickfinger_to_area_method, LITEST_CLICKPAD, LITEST_ANY);
2146a46c0ec8Sopenharmony_ci	litest_add(touchpad_clickfinger_to_area_method_while_down, LITEST_CLICKPAD, LITEST_ANY);
2147a46c0ec8Sopenharmony_ci	litest_add(touchpad_area_to_clickfinger_method, LITEST_CLICKPAD, LITEST_ANY);
2148a46c0ec8Sopenharmony_ci	litest_add(touchpad_area_to_clickfinger_method_while_down, LITEST_CLICKPAD, LITEST_ANY);
2149a46c0ec8Sopenharmony_ci	/* run those two for the T440 one only so we don't have to worry
2150a46c0ec8Sopenharmony_ci	 * about small touchpads messing with thumb detection expectations */
2151a46c0ec8Sopenharmony_ci	litest_add_for_device(touchpad_clickfinger_3fg_tool_position, LITEST_SYNAPTICS_TOPBUTTONPAD);
2152a46c0ec8Sopenharmony_ci	litest_add_for_device(touchpad_clickfinger_4fg_tool_position, LITEST_SYNAPTICS_TOPBUTTONPAD);
2153a46c0ec8Sopenharmony_ci
2154a46c0ec8Sopenharmony_ci	litest_add_for_device(touchpad_clickfinger_appletouch_config, LITEST_APPLETOUCH);
2155a46c0ec8Sopenharmony_ci	litest_add_for_device(touchpad_clickfinger_appletouch_1fg, LITEST_APPLETOUCH);
2156a46c0ec8Sopenharmony_ci	litest_add_for_device(touchpad_clickfinger_appletouch_2fg, LITEST_APPLETOUCH);
2157a46c0ec8Sopenharmony_ci	litest_add_for_device(touchpad_clickfinger_appletouch_3fg, LITEST_APPLETOUCH);
2158a46c0ec8Sopenharmony_ci
2159a46c0ec8Sopenharmony_ci	litest_add_for_device(touchpad_1fg_clickfinger_no_touch_phantomclicks, LITEST_SYNAPTICS_PHANTOMCLICKS);
2160a46c0ec8Sopenharmony_ci
2161a46c0ec8Sopenharmony_ci	litest_add_ranged(touchpad_clickfinger_click_drag, LITEST_CLICKPAD, LITEST_ANY, &finger_count);
2162a46c0ec8Sopenharmony_ci
2163a46c0ec8Sopenharmony_ci	litest_add(touchpad_click_defaults_clickfinger, LITEST_APPLE_CLICKPAD, LITEST_ANY);
2164a46c0ec8Sopenharmony_ci	litest_add(touchpad_click_defaults_btnarea, LITEST_CLICKPAD, LITEST_APPLE_CLICKPAD);
2165a46c0ec8Sopenharmony_ci	litest_add(touchpad_click_defaults_none, LITEST_TOUCHPAD, LITEST_CLICKPAD);
2166a46c0ec8Sopenharmony_ci	litest_add(touchpad_click_defaults_none, LITEST_ANY, LITEST_TOUCHPAD);
2167a46c0ec8Sopenharmony_ci
2168a46c0ec8Sopenharmony_ci	litest_add(touchpad_btn_left, LITEST_TOUCHPAD|LITEST_BUTTON, LITEST_CLICKPAD);
2169a46c0ec8Sopenharmony_ci	litest_add(clickpad_btn_left, LITEST_CLICKPAD, LITEST_ANY);
2170a46c0ec8Sopenharmony_ci	litest_add(clickpad_click_n_drag, LITEST_CLICKPAD, LITEST_SINGLE_TOUCH);
2171a46c0ec8Sopenharmony_ci	litest_add(clickpad_finger_pin, LITEST_CLICKPAD, LITEST_ANY);
2172a46c0ec8Sopenharmony_ci
2173a46c0ec8Sopenharmony_ci	litest_add(clickpad_softbutton_left, LITEST_CLICKPAD, LITEST_APPLE_CLICKPAD);
2174a46c0ec8Sopenharmony_ci	litest_add(clickpad_softbutton_middle, LITEST_CLICKPAD, LITEST_APPLE_CLICKPAD);
2175a46c0ec8Sopenharmony_ci	litest_add(clickpad_softbutton_right, LITEST_CLICKPAD, LITEST_APPLE_CLICKPAD);
2176a46c0ec8Sopenharmony_ci	litest_add(clickpad_softbutton_left_tap_n_drag, LITEST_CLICKPAD, LITEST_APPLE_CLICKPAD);
2177a46c0ec8Sopenharmony_ci	litest_add(clickpad_softbutton_right_tap_n_drag, LITEST_CLICKPAD, LITEST_APPLE_CLICKPAD);
2178a46c0ec8Sopenharmony_ci	litest_add(clickpad_softbutton_left_1st_fg_move, LITEST_CLICKPAD, LITEST_APPLE_CLICKPAD);
2179a46c0ec8Sopenharmony_ci	litest_add(clickpad_softbutton_left_2nd_fg_move, LITEST_CLICKPAD, LITEST_APPLE_CLICKPAD);
2180a46c0ec8Sopenharmony_ci	litest_add(clickpad_softbutton_left_to_right, LITEST_CLICKPAD, LITEST_APPLE_CLICKPAD);
2181a46c0ec8Sopenharmony_ci	litest_add(clickpad_softbutton_right_to_left, LITEST_CLICKPAD, LITEST_APPLE_CLICKPAD);
2182a46c0ec8Sopenharmony_ci	litest_add(clickpad_softbutton_hover_into_buttons, LITEST_CLICKPAD|LITEST_HOVER, LITEST_APPLE_CLICKPAD);
2183a46c0ec8Sopenharmony_ci
2184a46c0ec8Sopenharmony_ci	litest_add(clickpad_topsoftbuttons_left, LITEST_TOPBUTTONPAD, LITEST_ANY);
2185a46c0ec8Sopenharmony_ci	litest_add(clickpad_topsoftbuttons_right, LITEST_TOPBUTTONPAD, LITEST_ANY);
2186a46c0ec8Sopenharmony_ci	litest_add(clickpad_topsoftbuttons_middle, LITEST_TOPBUTTONPAD, LITEST_ANY);
2187a46c0ec8Sopenharmony_ci	litest_add(clickpad_topsoftbuttons_move_out_leftclick, LITEST_TOPBUTTONPAD, LITEST_ANY);
2188a46c0ec8Sopenharmony_ci	litest_add(clickpad_topsoftbuttons_move_out_leftclick_before_timeout, LITEST_TOPBUTTONPAD, LITEST_ANY);
2189a46c0ec8Sopenharmony_ci	litest_add(clickpad_topsoftbuttons_clickfinger, LITEST_TOPBUTTONPAD, LITEST_ANY);
2190a46c0ec8Sopenharmony_ci	litest_add(clickpad_topsoftbuttons_clickfinger_dev_disabled, LITEST_TOPBUTTONPAD, LITEST_ANY);
2191a46c0ec8Sopenharmony_ci
2192a46c0ec8Sopenharmony_ci	litest_add(clickpad_middleemulation_config_delayed, LITEST_CLICKPAD, LITEST_ANY);
2193a46c0ec8Sopenharmony_ci	litest_add(clickpad_middleemulation_click, LITEST_CLICKPAD, LITEST_ANY);
2194a46c0ec8Sopenharmony_ci	litest_add(clickpad_middleemulation_click_middle_left, LITEST_CLICKPAD, LITEST_ANY);
2195a46c0ec8Sopenharmony_ci	litest_add(clickpad_middleemulation_click_middle_right, LITEST_CLICKPAD, LITEST_ANY);
2196a46c0ec8Sopenharmony_ci	litest_add(clickpad_middleemulation_click_enable_while_down, LITEST_CLICKPAD, LITEST_ANY);
2197a46c0ec8Sopenharmony_ci	litest_add(clickpad_middleemulation_click_disable_while_down, LITEST_CLICKPAD, LITEST_ANY);
2198a46c0ec8Sopenharmony_ci
2199a46c0ec8Sopenharmony_ci	litest_add_no_device(touchpad_non_clickpad_detection);
2200a46c0ec8Sopenharmony_ci}
2201