2 * Copyright © 2013 Red Hat, Inc.
4 * Permission to use, copy, modify, distribute, and sell this software and
5 * its documentation for any purpose is hereby granted without fee, provided
6 * that the above copyright notice appear in all copies and that both that
7 * copyright notice and this permission notice appear in supporting
8 * documentation, and that the name of the copyright holders not be used in
9 * advertising or publicity pertaining to distribution of the software
10 * without specific, written prior permission. The copyright holders make
11 * no representations about the suitability of this software for any
12 * purpose. It is provided "as is" without express or implied warranty.
14 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
15 * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
16 * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
17 * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
18 * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
19 * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
20 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
34 #include "libinput-util.h"
37 static struct libinput_event_pointer *
38 get_accelerated_motion_event(struct libinput *li)
40 struct libinput_event *event;
41 struct libinput_event_pointer *ptrev;
44 event = libinput_get_event(li);
45 ck_assert_notnull(event);
46 ck_assert_int_eq(libinput_event_get_type(event),
47 LIBINPUT_EVENT_POINTER_MOTION);
49 ptrev = libinput_event_get_pointer_event(event);
50 ck_assert_notnull(ptrev);
52 if (fabs(libinput_event_pointer_get_dx(ptrev)) < DBL_MIN &&
53 fabs(libinput_event_pointer_get_dy(ptrev)) < DBL_MIN) {
54 libinput_event_destroy(event);
61 ck_abort_msg("No accelerated pointer motion event found");
66 test_relative_event(struct litest_device *dev, int dx, int dy)
68 struct libinput *li = dev->libinput;
69 struct libinput_event_pointer *ptrev;
72 double expected_length;
76 /* Send two deltas, as the first one may be eaten up by an
77 * acceleration filter. */
78 litest_event(dev, EV_REL, REL_X, dx);
79 litest_event(dev, EV_REL, REL_Y, dy);
80 litest_event(dev, EV_SYN, SYN_REPORT, 0);
81 litest_event(dev, EV_REL, REL_X, dx);
82 litest_event(dev, EV_REL, REL_Y, dy);
83 litest_event(dev, EV_SYN, SYN_REPORT, 0);
85 libinput_dispatch(li);
87 ptrev = get_accelerated_motion_event(li);
89 expected_length = sqrt(4 * dx*dx + 4 * dy*dy);
90 expected_dir = atan2(dx, dy);
92 ev_dx = libinput_event_pointer_get_dx(ptrev);
93 ev_dy = libinput_event_pointer_get_dy(ptrev);
94 actual_length = sqrt(ev_dx*ev_dx + ev_dy*ev_dy);
95 actual_dir = atan2(ev_dx, ev_dy);
97 /* Check the length of the motion vector (tolerate 1.0 indifference). */
98 ck_assert(fabs(expected_length) >= actual_length);
100 /* Check the direction of the motion vector (tolerate 2π/4 radians
102 ck_assert(fabs(expected_dir - actual_dir) < M_PI_2);
104 libinput_event_destroy(libinput_event_pointer_get_base_event(ptrev));
106 litest_drain_events(dev->libinput);
109 START_TEST(pointer_motion_relative)
111 struct litest_device *dev = litest_current_device();
113 litest_drain_events(dev->libinput);
115 test_relative_event(dev, 1, 0);
116 test_relative_event(dev, 1, 1);
117 test_relative_event(dev, 1, -1);
118 test_relative_event(dev, 0, 1);
120 test_relative_event(dev, -1, 0);
121 test_relative_event(dev, -1, 1);
122 test_relative_event(dev, -1, -1);
123 test_relative_event(dev, 0, -1);
128 test_absolute_event(struct litest_device *dev, double x, double y)
130 struct libinput *li = dev->libinput;
131 struct libinput_event *event;
132 struct libinput_event_pointer *ptrev;
135 litest_touch_down(dev, 0, x, y);
136 libinput_dispatch(li);
138 event = libinput_get_event(li);
139 ck_assert_int_eq(libinput_event_get_type(event),
140 LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE);
142 ptrev = libinput_event_get_pointer_event(event);
143 ck_assert(ptrev != NULL);
145 ex = libinput_event_pointer_get_absolute_x_transformed(ptrev, 100);
146 ey = libinput_event_pointer_get_absolute_y_transformed(ptrev, 100);
147 ck_assert_int_eq(ex + 0.5, x);
148 ck_assert_int_eq(ey + 0.5, y);
150 libinput_event_destroy(event);
153 START_TEST(pointer_motion_absolute)
155 struct litest_device *dev = litest_current_device();
157 litest_drain_events(dev->libinput);
159 test_absolute_event(dev, 0, 100);
160 test_absolute_event(dev, 100, 0);
161 test_absolute_event(dev, 50, 50);
166 test_unaccel_event(struct litest_device *dev, int dx, int dy)
168 struct libinput *li = dev->libinput;
169 struct libinput_event *event;
170 struct libinput_event_pointer *ptrev;
173 litest_event(dev, EV_REL, REL_X, dx);
174 litest_event(dev, EV_REL, REL_Y, dy);
175 litest_event(dev, EV_SYN, SYN_REPORT, 0);
177 libinput_dispatch(li);
179 event = libinput_get_event(li);
180 ck_assert_notnull(event);
181 ck_assert_int_eq(libinput_event_get_type(event),
182 LIBINPUT_EVENT_POINTER_MOTION);
184 ptrev = libinput_event_get_pointer_event(event);
185 ck_assert(ptrev != NULL);
187 ev_dx = libinput_event_pointer_get_dx_unaccelerated(ptrev);
188 ev_dy = libinput_event_pointer_get_dy_unaccelerated(ptrev);
190 ck_assert_int_eq(dx, ev_dx);
191 ck_assert_int_eq(dy, ev_dy);
193 libinput_event_destroy(event);
195 litest_drain_events(dev->libinput);
198 START_TEST(pointer_motion_unaccel)
200 struct litest_device *dev = litest_current_device();
202 litest_drain_events(dev->libinput);
204 test_unaccel_event(dev, 10, 0);
205 test_unaccel_event(dev, 10, 10);
206 test_unaccel_event(dev, 10, -10);
207 test_unaccel_event(dev, 0, 10);
209 test_unaccel_event(dev, -10, 0);
210 test_unaccel_event(dev, -10, 10);
211 test_unaccel_event(dev, -10, -10);
212 test_unaccel_event(dev, 0, -10);
217 test_button_event(struct litest_device *dev, unsigned int button, int state)
219 struct libinput *li = dev->libinput;
221 litest_event(dev, EV_KEY, button, state);
222 litest_event(dev, EV_SYN, SYN_REPORT, 0);
224 litest_assert_button_event(li, button,
225 state ? LIBINPUT_BUTTON_STATE_PRESSED :
226 LIBINPUT_BUTTON_STATE_RELEASED);
229 START_TEST(pointer_button)
231 struct litest_device *dev = litest_current_device();
233 litest_drain_events(dev->libinput);
235 test_button_event(dev, BTN_LEFT, 1);
236 test_button_event(dev, BTN_LEFT, 0);
238 /* press it twice for good measure */
239 test_button_event(dev, BTN_LEFT, 1);
240 test_button_event(dev, BTN_LEFT, 0);
242 if (libevdev_has_event_code(dev->evdev, EV_KEY, BTN_RIGHT)) {
243 test_button_event(dev, BTN_RIGHT, 1);
244 test_button_event(dev, BTN_RIGHT, 0);
247 /* Skip middle button test on trackpoints (used for scrolling) */
248 if (!libevdev_has_property(dev->evdev, INPUT_PROP_POINTING_STICK) &&
249 libevdev_has_event_code(dev->evdev, EV_KEY, BTN_MIDDLE)) {
250 test_button_event(dev, BTN_MIDDLE, 1);
251 test_button_event(dev, BTN_MIDDLE, 0);
256 START_TEST(pointer_button_auto_release)
258 struct libinput *libinput;
259 struct litest_device *dev;
260 struct libinput_event *event;
261 enum libinput_event_type type;
262 struct libinput_event_pointer *pevent;
267 { .code = BTN_LEFT, },
268 { .code = BTN_MIDDLE, },
269 { .code = BTN_EXTRA, },
270 { .code = BTN_SIDE, },
271 { .code = BTN_BACK, },
272 { .code = BTN_FORWARD, },
275 int events[2 * (ARRAY_LENGTH(buttons) + 1)];
280 /* Enable all tested buttons on the device */
281 for (i = 0; i < 2 * ARRAY_LENGTH(buttons);) {
282 button = buttons[i / 2].code;
283 events[i++] = EV_KEY;
284 events[i++] = button;
289 libinput = litest_create_context();
290 dev = litest_add_device_with_overrides(libinput,
295 litest_drain_events(libinput);
297 /* Send pressed events, without releasing */
298 for (i = 0; i < ARRAY_LENGTH(buttons); ++i) {
299 test_button_event(dev, buttons[i].code, 1);
302 litest_drain_events(libinput);
304 /* "Disconnect" device */
305 litest_delete_device(dev);
307 /* Mark all released buttons until device is removed */
309 event = libinput_get_event(libinput);
310 ck_assert_notnull(event);
311 type = libinput_event_get_type(event);
313 if (type == LIBINPUT_EVENT_DEVICE_REMOVED) {
314 libinput_event_destroy(event);
318 ck_assert_int_eq(type, LIBINPUT_EVENT_POINTER_BUTTON);
319 pevent = libinput_event_get_pointer_event(event);
320 ck_assert_int_eq(libinput_event_pointer_get_button_state(pevent),
321 LIBINPUT_BUTTON_STATE_RELEASED);
322 button = libinput_event_pointer_get_button(pevent);
325 for (i = 0; i < ARRAY_LENGTH(buttons); ++i) {
326 if (buttons[i].code == button) {
327 ck_assert_int_eq(buttons[i].released, 0);
328 buttons[i].released = 1;
332 ck_assert_int_eq(valid_code, 1);
333 libinput_event_destroy(event);
336 /* Check that all pressed buttons has been released. */
337 for (i = 0; i < ARRAY_LENGTH(buttons); ++i) {
338 ck_assert_int_eq(buttons[i].released, 1);
341 libinput_unref(libinput);
346 test_wheel_event(struct litest_device *dev, int which, int amount)
348 struct libinput *li = dev->libinput;
349 struct libinput_event *event;
350 struct libinput_event_pointer *ptrev;
351 enum libinput_pointer_axis axis;
353 /* the current evdev implementation scales the scroll wheel events
355 const int scroll_step = 15;
356 int expected = amount * scroll_step;
358 if (libinput_device_config_scroll_get_natural_scroll_enabled(dev->libinput_device))
361 /* mouse scroll wheels are 'upside down' */
362 if (which == REL_WHEEL)
364 litest_event(dev, EV_REL, which, amount);
365 litest_event(dev, EV_SYN, SYN_REPORT, 0);
367 libinput_dispatch(li);
369 event = libinput_get_event(li);
370 ck_assert(event != NULL);
371 ck_assert_int_eq(libinput_event_get_type(event),
372 LIBINPUT_EVENT_POINTER_AXIS);
374 ptrev = libinput_event_get_pointer_event(event);
375 ck_assert(ptrev != NULL);
377 axis = (which == REL_WHEEL) ?
378 LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL :
379 LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL;
381 ck_assert_int_eq(libinput_event_pointer_get_axis_value(ptrev, axis),
383 ck_assert_int_eq(libinput_event_pointer_get_axis_source(ptrev),
384 LIBINPUT_POINTER_AXIS_SOURCE_WHEEL);
385 libinput_event_destroy(event);
388 START_TEST(pointer_scroll_wheel)
390 struct litest_device *dev = litest_current_device();
392 litest_drain_events(dev->libinput);
394 test_wheel_event(dev, REL_WHEEL, -1);
395 test_wheel_event(dev, REL_WHEEL, 1);
397 test_wheel_event(dev, REL_WHEEL, -5);
398 test_wheel_event(dev, REL_WHEEL, 6);
400 if (libevdev_has_event_code(dev->evdev, EV_REL, REL_HWHEEL)) {
401 test_wheel_event(dev, REL_HWHEEL, -1);
402 test_wheel_event(dev, REL_HWHEEL, 1);
404 test_wheel_event(dev, REL_HWHEEL, -5);
405 test_wheel_event(dev, REL_HWHEEL, 6);
410 START_TEST(pointer_scroll_natural_defaults)
412 struct litest_device *dev = litest_current_device();
414 ck_assert_int_ge(libinput_device_config_scroll_has_natural_scroll(dev->libinput_device), 1);
415 ck_assert_int_eq(libinput_device_config_scroll_get_natural_scroll_enabled(dev->libinput_device), 0);
416 ck_assert_int_eq(libinput_device_config_scroll_get_default_natural_scroll_enabled(dev->libinput_device), 0);
420 START_TEST(pointer_scroll_natural_enable_config)
422 struct litest_device *dev = litest_current_device();
423 enum libinput_config_status status;
425 status = libinput_device_config_scroll_set_natural_scroll_enabled(dev->libinput_device, 1);
426 ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
427 ck_assert_int_eq(libinput_device_config_scroll_get_natural_scroll_enabled(dev->libinput_device), 1);
429 status = libinput_device_config_scroll_set_natural_scroll_enabled(dev->libinput_device, 0);
430 ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
431 ck_assert_int_eq(libinput_device_config_scroll_get_natural_scroll_enabled(dev->libinput_device), 0);
435 START_TEST(pointer_scroll_natural_wheel)
437 struct litest_device *dev = litest_current_device();
438 struct libinput_device *device = dev->libinput_device;
440 litest_drain_events(dev->libinput);
442 libinput_device_config_scroll_set_natural_scroll_enabled(device, 1);
444 test_wheel_event(dev, REL_WHEEL, -1);
445 test_wheel_event(dev, REL_WHEEL, 1);
447 test_wheel_event(dev, REL_WHEEL, -5);
448 test_wheel_event(dev, REL_WHEEL, 6);
450 if (libevdev_has_event_code(dev->evdev, EV_REL, REL_HWHEEL)) {
451 test_wheel_event(dev, REL_HWHEEL, -1);
452 test_wheel_event(dev, REL_HWHEEL, 1);
454 test_wheel_event(dev, REL_HWHEEL, -5);
455 test_wheel_event(dev, REL_HWHEEL, 6);
460 START_TEST(pointer_seat_button_count)
462 const int num_devices = 4;
463 struct litest_device *devices[num_devices];
464 struct libinput *libinput;
465 struct libinput_event *ev;
466 struct libinput_event_pointer *tev;
468 int seat_button_count;
469 int expected_seat_button_count = 0;
470 char device_name[255];
472 libinput = litest_create_context();
473 for (i = 0; i < num_devices; ++i) {
474 sprintf(device_name, "litest Generic mouse (%d)", i);
475 devices[i] = litest_add_device_with_overrides(libinput,
481 for (i = 0; i < num_devices; ++i)
482 litest_button_click(devices[i], BTN_LEFT, true);
484 libinput_dispatch(libinput);
485 while ((ev = libinput_get_event(libinput))) {
486 if (libinput_event_get_type(ev) !=
487 LIBINPUT_EVENT_POINTER_BUTTON) {
488 libinput_event_destroy(ev);
489 libinput_dispatch(libinput);
493 tev = libinput_event_get_pointer_event(ev);
494 ck_assert_notnull(tev);
495 ck_assert_int_eq(libinput_event_pointer_get_button(tev),
497 ck_assert_int_eq(libinput_event_pointer_get_button_state(tev),
498 LIBINPUT_BUTTON_STATE_PRESSED);
500 ++expected_seat_button_count;
502 libinput_event_pointer_get_seat_button_count(tev);
503 ck_assert_int_eq(expected_seat_button_count, seat_button_count);
505 libinput_event_destroy(ev);
506 libinput_dispatch(libinput);
509 ck_assert_int_eq(seat_button_count, num_devices);
511 for (i = 0; i < num_devices; ++i)
512 litest_button_click(devices[i], BTN_LEFT, false);
514 libinput_dispatch(libinput);
515 while ((ev = libinput_get_event(libinput))) {
516 if (libinput_event_get_type(ev) !=
517 LIBINPUT_EVENT_POINTER_BUTTON) {
518 libinput_event_destroy(ev);
519 libinput_dispatch(libinput);
523 tev = libinput_event_get_pointer_event(ev);
524 ck_assert_notnull(tev);
525 ck_assert_int_eq(libinput_event_pointer_get_button(tev),
527 ck_assert_int_eq(libinput_event_pointer_get_button_state(tev),
528 LIBINPUT_BUTTON_STATE_RELEASED);
530 --expected_seat_button_count;
532 libinput_event_pointer_get_seat_button_count(tev);
533 ck_assert_int_eq(expected_seat_button_count, seat_button_count);
535 libinput_event_destroy(ev);
536 libinput_dispatch(libinput);
539 ck_assert_int_eq(seat_button_count, 0);
541 for (i = 0; i < num_devices; ++i)
542 litest_delete_device(devices[i]);
543 libinput_unref(libinput);
547 START_TEST(pointer_no_calibration)
549 struct litest_device *dev = litest_current_device();
550 struct libinput_device *d = dev->libinput_device;
551 enum libinput_config_status status;
553 float calibration[6] = {0};
555 rc = libinput_device_config_calibration_has_matrix(d);
556 ck_assert_int_eq(rc, 0);
557 rc = libinput_device_config_calibration_get_matrix(d, calibration);
558 ck_assert_int_eq(rc, 0);
559 rc = libinput_device_config_calibration_get_default_matrix(d,
561 ck_assert_int_eq(rc, 0);
563 status = libinput_device_config_calibration_set_matrix(d,
565 ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_UNSUPPORTED);
569 START_TEST(pointer_left_handed_defaults)
571 struct litest_device *dev = litest_current_device();
572 struct libinput_device *d = dev->libinput_device;
575 rc = libinput_device_config_buttons_has_left_handed(d);
576 ck_assert_int_ne(rc, 0);
578 rc = libinput_device_config_buttons_get_left_handed(d);
579 ck_assert_int_eq(rc, 0);
581 rc = libinput_device_config_buttons_get_default_left_handed(d);
582 ck_assert_int_eq(rc, 0);
586 START_TEST(pointer_left_handed)
588 struct litest_device *dev = litest_current_device();
589 struct libinput_device *d = dev->libinput_device;
590 struct libinput *li = dev->libinput;
591 enum libinput_config_status status;
593 status = libinput_device_config_buttons_set_left_handed(d, 1);
594 ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
596 litest_drain_events(li);
597 litest_button_click(dev, BTN_LEFT, 1);
598 litest_button_click(dev, BTN_LEFT, 0);
600 litest_assert_button_event(li,
602 LIBINPUT_BUTTON_STATE_PRESSED);
603 litest_assert_button_event(li,
605 LIBINPUT_BUTTON_STATE_RELEASED);
607 litest_button_click(dev, BTN_RIGHT, 1);
608 litest_button_click(dev, BTN_RIGHT, 0);
609 litest_assert_button_event(li,
611 LIBINPUT_BUTTON_STATE_PRESSED);
612 litest_assert_button_event(li,
614 LIBINPUT_BUTTON_STATE_RELEASED);
616 if (libevdev_has_event_code(dev->evdev,
619 litest_button_click(dev, BTN_MIDDLE, 1);
620 litest_button_click(dev, BTN_MIDDLE, 0);
621 litest_assert_button_event(li,
623 LIBINPUT_BUTTON_STATE_PRESSED);
624 litest_assert_button_event(li,
626 LIBINPUT_BUTTON_STATE_RELEASED);
631 START_TEST(pointer_left_handed_during_click)
633 struct litest_device *dev = litest_current_device();
634 struct libinput_device *d = dev->libinput_device;
635 struct libinput *li = dev->libinput;
636 enum libinput_config_status status;
638 litest_drain_events(li);
639 litest_button_click(dev, BTN_LEFT, 1);
640 libinput_dispatch(li);
642 /* Change while button is down, expect correct release event */
643 status = libinput_device_config_buttons_set_left_handed(d, 1);
644 ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
646 litest_button_click(dev, BTN_LEFT, 0);
648 litest_assert_button_event(li,
650 LIBINPUT_BUTTON_STATE_PRESSED);
651 litest_assert_button_event(li,
653 LIBINPUT_BUTTON_STATE_RELEASED);
657 START_TEST(pointer_left_handed_during_click_multiple_buttons)
659 struct litest_device *dev = litest_current_device();
660 struct libinput_device *d = dev->libinput_device;
661 struct libinput *li = dev->libinput;
662 enum libinput_config_status status;
664 litest_drain_events(li);
665 litest_button_click(dev, BTN_LEFT, 1);
666 libinput_dispatch(li);
668 status = libinput_device_config_buttons_set_left_handed(d, 1);
669 ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
671 /* No left-handed until all buttons were down */
672 litest_button_click(dev, BTN_RIGHT, 1);
673 litest_button_click(dev, BTN_RIGHT, 0);
674 litest_button_click(dev, BTN_LEFT, 0);
676 litest_assert_button_event(li,
678 LIBINPUT_BUTTON_STATE_PRESSED);
679 litest_assert_button_event(li,
681 LIBINPUT_BUTTON_STATE_PRESSED);
682 litest_assert_button_event(li,
684 LIBINPUT_BUTTON_STATE_RELEASED);
685 litest_assert_button_event(li,
687 LIBINPUT_BUTTON_STATE_RELEASED);
691 START_TEST(pointer_scroll_button)
693 struct litest_device *dev = litest_current_device();
694 struct libinput *li = dev->libinput;
696 /* Make left button switch to scrolling mode */
697 libinput_device_config_scroll_set_method(dev->libinput_device,
698 LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN);
699 libinput_device_config_scroll_set_button(dev->libinput_device,
702 litest_drain_events(li);
704 litest_button_scroll(dev, BTN_LEFT, 1, 6);
705 litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL, 6);
706 litest_button_scroll(dev, BTN_LEFT, 1, -7);
707 litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL, -7);
708 litest_button_scroll(dev, BTN_LEFT, 8, 1);
709 litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL, 8);
710 litest_button_scroll(dev, BTN_LEFT, -9, 1);
711 litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL, -9);
713 /* scroll smaller than the threshold should not generate events */
714 litest_button_scroll(dev, BTN_LEFT, 1, 1);
715 /* left press without movement should not generate events */
716 litest_button_scroll(dev, BTN_LEFT, 0, 0);
718 litest_assert_empty_queue(li);
720 /* Restore default scroll behavior */
721 libinput_device_config_scroll_set_method(dev->libinput_device,
722 libinput_device_config_scroll_get_default_method(
723 dev->libinput_device));
724 libinput_device_config_scroll_set_button(dev->libinput_device,
725 libinput_device_config_scroll_get_default_button(
726 dev->libinput_device));
730 int main (int argc, char **argv) {
732 litest_add("pointer:motion", pointer_motion_relative, LITEST_RELATIVE, LITEST_ANY);
733 litest_add("pointer:motion", pointer_motion_absolute, LITEST_ABSOLUTE, LITEST_ANY);
734 litest_add("pointer:motion", pointer_motion_unaccel, LITEST_RELATIVE, LITEST_ANY);
735 litest_add("pointer:button", pointer_button, LITEST_BUTTON, LITEST_CLICKPAD);
736 litest_add_no_device("pointer:button_auto_release", pointer_button_auto_release);
737 litest_add("pointer:scroll", pointer_scroll_wheel, LITEST_WHEEL, LITEST_ANY);
738 litest_add("pointer:scroll", pointer_scroll_button, LITEST_RELATIVE|LITEST_BUTTON, LITEST_ANY);
739 litest_add("pointer:scroll", pointer_scroll_natural_defaults, LITEST_WHEEL, LITEST_ANY);
740 litest_add("pointer:scroll", pointer_scroll_natural_enable_config, LITEST_WHEEL, LITEST_ANY);
741 litest_add("pointer:scroll", pointer_scroll_natural_wheel, LITEST_WHEEL, LITEST_ANY);
742 litest_add_no_device("pointer:seat button count", pointer_seat_button_count);
744 litest_add("pointer:calibration", pointer_no_calibration, LITEST_ANY, LITEST_TOUCH|LITEST_SINGLE_TOUCH|LITEST_ABSOLUTE);
746 /* tests touchpads too */
747 litest_add("pointer:left-handed", pointer_left_handed_defaults, LITEST_BUTTON, LITEST_ANY);
748 litest_add("pointer:left-handed", pointer_left_handed, LITEST_RELATIVE|LITEST_BUTTON, LITEST_ANY);
749 litest_add("pointer:left-handed", pointer_left_handed_during_click, LITEST_RELATIVE|LITEST_BUTTON, LITEST_ANY);
750 litest_add("pointer:left-handed", pointer_left_handed_during_click_multiple_buttons, LITEST_RELATIVE|LITEST_BUTTON, LITEST_ANY);
752 return litest_run(argc, argv);