Compare commits

...

9 commits
main ... 1.6.1

Author SHA1 Message Date
Peter Hutterer
254bd281f7 configure.ac: libinput 1.6.1
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2017-02-02 17:20:46 +10:00
Peter Hutterer
d7f6702e1b Revert "touchpad: reduce the initial timeout for tapping after touch"
The timeout is too short, a number of users are unable to tap now.

https://bugs.freedesktop.org/show_bug.cgi?id=99447

This reverts commit d0ba1e2b38.

(cherry picked from commit e86fdd5883)
2017-02-02 11:10:36 +10:00
Peter Hutterer
cc12b91a44 evdev: fix a comment typo
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit ab563d0920)
2017-02-02 11:10:36 +10:00
Peter Hutterer
e9d9681300 doc: add a table of contents to the FAQ
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit a5cefb76ac)
2017-02-02 11:10:36 +10:00
Peter Hutterer
049a4da864 pad: implement kernel-based pad led handling
For each device open the various led devices (brightness only) and map the one
nonzero brightness to the current mode.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit 5eb71b65e4)
2017-02-02 11:10:36 +10:00
Peter Hutterer
72788e809a test: fix two test udev rules
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit 9672e2f407)
2017-02-02 11:10:36 +10:00
Peter Hutterer
feb677344f doc: update the FAQ entry with how config options are stored
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit aae997e60e)
2017-02-02 11:10:36 +10:00
Peter Hutterer
22e8de0dcd evdev: fix an error message
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit 13a2336beb)
2017-02-02 11:10:36 +10:00
Peter Hutterer
6e094af2b6 test: fix pointer accel defaults test
Loop immediately exited, this code was never triggered.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit 4d20130e05)
2017-02-02 11:08:47 +10:00
9 changed files with 494 additions and 31 deletions

View file

@ -2,7 +2,7 @@ AC_PREREQ([2.64])
m4_define([libinput_major_version], [1]) m4_define([libinput_major_version], [1])
m4_define([libinput_minor_version], [6]) m4_define([libinput_minor_version], [6])
m4_define([libinput_micro_version], [0]) m4_define([libinput_micro_version], [1])
m4_define([libinput_version], m4_define([libinput_version],
[libinput_major_version.libinput_minor_version.libinput_micro_version]) [libinput_major_version.libinput_minor_version.libinput_micro_version])
@ -35,7 +35,7 @@ AM_INIT_AUTOMAKE([1.11 foreign no-dist-gzip dist-xz])
# b) If interfaces have been changed or added, but binary compatibility has # b) If interfaces have been changed or added, but binary compatibility has
# been preserved, change to C+1:0:A+1 # been preserved, change to C+1:0:A+1
# c) If the interface is the same as the previous version, change to C:R+1:A # c) If the interface is the same as the previous version, change to C:R+1:A
LIBINPUT_LT_VERSION=21:2:11 LIBINPUT_LT_VERSION=21:3:11
AC_SUBST(LIBINPUT_LT_VERSION) AC_SUBST(LIBINPUT_LT_VERSION)
AM_SILENT_RULES([yes]) AM_SILENT_RULES([yes])
@ -232,7 +232,7 @@ AC_ARG_ENABLE(libwacom,
[use_libwacom="$enableval"], [use_libwacom="$enableval"],
[use_libwacom="yes"]) [use_libwacom="yes"])
if test "x$use_libwacom" = "xyes"; then if test "x$use_libwacom" = "xyes"; then
PKG_CHECK_MODULES(LIBWACOM, [libwacom >= 0.12], [HAVE_LIBWACOM="yes"]) PKG_CHECK_MODULES(LIBWACOM, [libwacom >= 0.20], [HAVE_LIBWACOM="yes"])
AC_DEFINE(HAVE_LIBWACOM, 1, [Build with libwacom]) AC_DEFINE(HAVE_LIBWACOM, 1, [Build with libwacom])
OLD_LIBS=$LIBS OLD_LIBS=$LIBS

View file

@ -3,6 +3,8 @@
Frequently asked questions about libinput. Frequently asked questions about libinput.
@tableofcontents
@section faq_fast_mouse My mouse moves too fast, even at the slowest setting @section faq_fast_mouse My mouse moves too fast, even at the slowest setting
This is a symptom of high-dpi mice (greater than 1000dpi). These devices This is a symptom of high-dpi mice (greater than 1000dpi). These devices
@ -40,12 +42,20 @@ manage these and decide which configuration option to apply to each device.
This must be done at startup, after a resume and whenever a new device is This must be done at startup, after a resume and whenever a new device is
detected. detected.
In a GNOME X.Org stack a user would usually toggle an option in One commonly used way to configure libinput is to have the Wayland
the gnome-control-center which adjusts a gsettings entry. That change is compositor expose a compositor-specific configuration option. For example,
picked up by gnome-settings-daemon and applied to the device by adjusting in a GNOME stack, the gnome-control-center modifies dconf entries. These
input device properties that the xf86-input-libinput driver provides. changes are read by mutter and applied to libinput. Changing these entries
The input device property changes map to the respective libinput via the gsettings commandline tool has the same effect.
configuration options.
Another commonly used way to configure libinput is to have xorg.conf.d
snippets. When libinput is used with the xf86-input-libinput driver in an
X.Org stack, these options are read on startup and apply to each device.
Changing properties at runtime with the xinput commandline tool has the same
effect.
In both cases, the selection of available options and how they are exposed
depends on the libinput caller (e.g. mutter or xf86-input-libinput).
@dotfile libinput-stack-gnome.gv @dotfile libinput-stack-gnome.gv

View file

@ -33,7 +33,6 @@
#include "evdev-mt-touchpad.h" #include "evdev-mt-touchpad.h"
#define DEFAULT_TAP_INITIAL_TIMEOUT_PERIOD ms2us(100)
#define DEFAULT_TAP_TIMEOUT_PERIOD ms2us(180) #define DEFAULT_TAP_TIMEOUT_PERIOD ms2us(180)
#define DEFAULT_DRAG_TIMEOUT_PERIOD ms2us(300) #define DEFAULT_DRAG_TIMEOUT_PERIOD ms2us(300)
#define DEFAULT_TAP_MOVE_THRESHOLD TP_MM_TO_DPI_NORMALIZED(1.3) #define DEFAULT_TAP_MOVE_THRESHOLD TP_MM_TO_DPI_NORMALIZED(1.3)
@ -127,13 +126,6 @@ tp_tap_notify(struct tp_dispatch *tp,
state); state);
} }
static void
tp_tap_set_initial_timer(struct tp_dispatch *tp, uint64_t time)
{
libinput_timer_set(&tp->tap.timer,
time + DEFAULT_TAP_INITIAL_TIMEOUT_PERIOD);
}
static void static void
tp_tap_set_timer(struct tp_dispatch *tp, uint64_t time) tp_tap_set_timer(struct tp_dispatch *tp, uint64_t time)
{ {
@ -163,7 +155,7 @@ tp_tap_idle_handle_event(struct tp_dispatch *tp,
case TAP_EVENT_TOUCH: case TAP_EVENT_TOUCH:
tp->tap.state = TAP_STATE_TOUCH; tp->tap.state = TAP_STATE_TOUCH;
tp->tap.first_press_time = time; tp->tap.first_press_time = time;
tp_tap_set_initial_timer(tp, time); tp_tap_set_timer(tp, time);
break; break;
case TAP_EVENT_RELEASE: case TAP_EVENT_RELEASE:
break; break;

View file

@ -29,14 +29,143 @@
#include "evdev-tablet-pad.h" #include "evdev-tablet-pad.h"
#if HAVE_LIBWACOM
#include <libwacom/libwacom.h>
#endif
struct pad_led_group { struct pad_led_group {
struct libinput_tablet_pad_mode_group base; struct libinput_tablet_pad_mode_group base;
struct list led_list;
struct list toggle_button_list;
}; };
struct pad_mode_toggle_button {
struct list link;
unsigned int button_index;
};
struct pad_mode_led {
struct list link;
/* /sys/devices/..../input1235/input1235::wacom-led_0.1/brightness */
int brightness_fd;
int mode_idx;
};
static inline struct pad_mode_toggle_button *
pad_mode_toggle_button_new(struct pad_dispatch *pad,
struct libinput_tablet_pad_mode_group *group,
unsigned int button_index)
{
struct pad_mode_toggle_button *button;
button = zalloc(sizeof *button);
if (!button)
return NULL;
button->button_index = button_index;
return button;
}
static inline void
pad_mode_toggle_button_destroy(struct pad_mode_toggle_button* button)
{
list_remove(&button->link);
free(button);
}
static inline int
pad_led_group_get_mode(struct pad_led_group *group)
{
char buf[4] = {0};
int rc;
unsigned int brightness;
struct pad_mode_led *led;
list_for_each(led, &group->led_list, link) {
rc = lseek(led->brightness_fd, 0, SEEK_SET);
if (rc == -1)
return -errno;
rc = read(led->brightness_fd, buf, sizeof(buf) - 1);
if (rc == -1)
return -errno;
rc = sscanf(buf, "%u\n", &brightness);
if (rc != 1)
return -EINVAL;
/* Assumption: only one LED lit up at any time */
if (brightness != 0)
return led->mode_idx;
}
return -EINVAL;
}
static inline void
pad_led_destroy(struct libinput *libinput,
struct pad_mode_led *led)
{
list_remove(&led->link);
if (led->brightness_fd != -1)
close_restricted(libinput, led->brightness_fd);
free(led);
}
static inline struct pad_mode_led *
pad_led_new(struct libinput *libinput, const char *prefix, int group, int mode)
{
struct pad_mode_led *led;
char path[PATH_MAX];
int rc, fd;
led = zalloc(sizeof *led);
if (!led)
return NULL;
led->brightness_fd = -1;
led->mode_idx = mode;
list_init(&led->link);
/* /sys/devices/..../input1235/input1235::wacom-0.1/brightness,
* where 0 and 1 are group and mode index. */
rc = snprintf(path,
sizeof(path),
"%s%d.%d/brightness",
prefix,
group,
mode);
if (rc == -1)
goto error;
fd = open_restricted(libinput, path, O_RDONLY);
if (fd < 0) {
errno = -fd;
goto error;
}
led->brightness_fd = fd;
return led;
error:
pad_led_destroy(libinput, led);
return NULL;
}
static void static void
pad_led_group_destroy(struct libinput_tablet_pad_mode_group *g) pad_led_group_destroy(struct libinput_tablet_pad_mode_group *g)
{ {
struct pad_led_group *group = (struct pad_led_group *)g; struct pad_led_group *group = (struct pad_led_group *)g;
struct pad_mode_toggle_button *button, *tmp;
struct pad_mode_led *led, *tmpled;
list_for_each_safe(button, tmp, &group->toggle_button_list, link)
pad_mode_toggle_button_destroy(button);
list_for_each_safe(led, tmpled, &group->led_list, link)
pad_led_destroy(g->device->seat->libinput, led);
free(group); free(group);
} }
@ -58,10 +187,154 @@ pad_group_new_basic(struct pad_dispatch *pad,
group->base.current_mode = 0; group->base.current_mode = 0;
group->base.num_modes = nleds; group->base.num_modes = nleds;
group->base.destroy = pad_led_group_destroy; group->base.destroy = pad_led_group_destroy;
list_init(&group->toggle_button_list);
list_init(&group->led_list);
return group; return group;
} }
static inline struct pad_led_group *
pad_group_new(struct pad_dispatch *pad,
unsigned int group_index,
int nleds,
const char *syspath)
{
struct libinput *libinput = pad->device->base.seat->libinput;
struct pad_led_group *group;
int rc;
group = pad_group_new_basic(pad, group_index, nleds);
if (!group)
return NULL;
while (nleds--) {
struct pad_mode_led *led;
led = pad_led_new(libinput, syspath, group_index, nleds);
if (!led)
goto error;
list_insert(&group->led_list, &led->link);
}
rc = pad_led_group_get_mode(group);
if (rc < 0) {
errno = -rc;
goto error;
}
group->base.current_mode = rc;
return group;
error:
log_error(libinput, "Unable to init LED group: %s\n", strerror(errno));
pad_led_group_destroy(&group->base);
return NULL;
}
static inline bool
pad_led_get_sysfs_base_path(struct evdev_device *device,
char *path_out,
size_t path_out_sz)
{
struct udev_device *parent, *udev_device;
const char *test_path;
int rc;
udev_device = device->udev_device;
/* For testing purposes only allow for a base path set through a
* udev rule. We still expect the normal directory hierarchy inside */
test_path = udev_device_get_property_value(udev_device,
"LIBINPUT_TEST_TABLET_PAD_SYSFS_PATH");
if (test_path) {
rc = snprintf(path_out, path_out_sz, "%s", test_path);
return rc != -1;
}
parent = udev_device_get_parent_with_subsystem_devtype(udev_device,
"input",
NULL);
if (!parent)
return false;
rc = snprintf(path_out,
path_out_sz,
"%s/%s::wacom-",
udev_device_get_syspath(parent),
udev_device_get_sysname(parent));
return rc != -1;
}
#if HAVE_LIBWACOM
static int
pad_init_led_groups(struct pad_dispatch *pad,
struct evdev_device *device,
WacomDevice *wacom)
{
struct libinput *libinput = device->base.seat->libinput;
const WacomStatusLEDs *leds;
int nleds, nmodes;
int i;
struct pad_led_group *group;
char syspath[PATH_MAX];
leds = libwacom_get_status_leds(wacom, &nleds);
if (nleds == 0)
return 1;
/* syspath is /sys/class/leds/input1234/input12345::wacom-" and
only needs the group + mode appended */
if (!pad_led_get_sysfs_base_path(device, syspath, sizeof(syspath)))
return 1;
for (i = 0; i < nleds; i++) {
switch(leds[i]) {
case WACOM_STATUS_LED_UNAVAILABLE:
log_bug_libinput(libinput,
"Invalid led type %d\n",
leds[i]);
return 1;
case WACOM_STATUS_LED_RING:
nmodes = libwacom_get_ring_num_modes(wacom);
group = pad_group_new(pad, i, nmodes, syspath);
if (!group)
return 1;
list_insert(&pad->modes.mode_group_list, &group->base.link);
break;
case WACOM_STATUS_LED_RING2:
nmodes = libwacom_get_ring2_num_modes(wacom);
group = pad_group_new(pad, i, nmodes, syspath);
if (!group)
return 1;
list_insert(&pad->modes.mode_group_list, &group->base.link);
break;
case WACOM_STATUS_LED_TOUCHSTRIP:
nmodes = libwacom_get_strips_num_modes(wacom);
group = pad_group_new(pad, i, nmodes, syspath);
if (!group)
return 1;
list_insert(&pad->modes.mode_group_list, &group->base.link);
break;
case WACOM_STATUS_LED_TOUCHSTRIP2:
/* there is no get_strips2_... */
nmodes = libwacom_get_strips_num_modes(wacom);
group = pad_group_new(pad, i, nmodes, syspath);
if (!group)
return 1;
list_insert(&pad->modes.mode_group_list, &group->base.link);
break;
}
}
return 0;
}
#endif
static inline struct libinput_tablet_pad_mode_group * static inline struct libinput_tablet_pad_mode_group *
pad_get_mode_group(struct pad_dispatch *pad, unsigned int index) pad_get_mode_group(struct pad_dispatch *pad, unsigned int index)
{ {
@ -75,6 +348,192 @@ pad_get_mode_group(struct pad_dispatch *pad, unsigned int index)
return NULL; return NULL;
} }
#if HAVE_LIBWACOM
static inline int
pad_find_button_group(WacomDevice *wacom,
int button_index,
WacomButtonFlags button_flags)
{
int i;
WacomButtonFlags flags;
for (i = 0; i < libwacom_get_num_buttons(wacom); i++) {
if (i == button_index)
continue;
flags = libwacom_get_button_flag(wacom, 'A' + i);
if ((flags & WACOM_BUTTON_MODESWITCH) == 0)
continue;
if ((flags & WACOM_BUTTON_DIRECTION) ==
(button_flags & WACOM_BUTTON_DIRECTION))
return libwacom_get_button_led_group(wacom, 'A' + i);
}
return -1;
}
static int
pad_init_mode_buttons(struct pad_dispatch *pad,
WacomDevice *wacom)
{
struct libinput *libinput = pad_libinput_context(pad);
struct libinput_tablet_pad_mode_group *group;
unsigned int group_idx;
int i;
WacomButtonFlags flags;
/* libwacom numbers buttons as 'A', 'B', etc. We number them with 0,
* 1, ...
*/
for (i = 0; i < libwacom_get_num_buttons(wacom); i++) {
group_idx = libwacom_get_button_led_group(wacom, 'A' + i);
flags = libwacom_get_button_flag(wacom, 'A' + i);
/* If this button is not a mode toggle button, find the mode
* toggle button with the same position flags and take that
* button's group idx */
if ((int)group_idx == -1) {
group_idx = pad_find_button_group(wacom, i, flags);
}
if ((int)group_idx == -1) {
log_bug_libinput(libinput,
"%s: unhandled position for button %i\n",
pad->device->devname,
i);
return 1;
}
group = pad_get_mode_group(pad, group_idx);
if (!group) {
log_bug_libinput(libinput,
"%s: Failed to find group %d for button %i\n",
pad->device->devname,
group_idx,
i);
return 1;
}
group->button_mask |= 1 << i;
if (flags & WACOM_BUTTON_MODESWITCH) {
struct pad_mode_toggle_button *b;
struct pad_led_group *g;
b = pad_mode_toggle_button_new(pad, group, i);
if (!b)
return 1;
g = (struct pad_led_group*)group;
list_insert(&g->toggle_button_list, &b->link);
group->toggle_button_mask |= 1 << i;
}
}
return 0;
}
static void
pad_init_mode_rings(struct pad_dispatch *pad, WacomDevice *wacom)
{
struct libinput_tablet_pad_mode_group *group;
const WacomStatusLEDs *leds;
int i, nleds;
leds = libwacom_get_status_leds(wacom, &nleds);
if (nleds == 0)
return;
for (i = 0; i < nleds; i++) {
switch(leds[i]) {
case WACOM_STATUS_LED_RING:
group = pad_get_mode_group(pad, i);
group->ring_mask |= 0x1;
break;
case WACOM_STATUS_LED_RING2:
group = pad_get_mode_group(pad, i);
group->ring_mask |= 0x2;
break;
default:
break;
}
}
}
static void
pad_init_mode_strips(struct pad_dispatch *pad, WacomDevice *wacom)
{
struct libinput_tablet_pad_mode_group *group;
const WacomStatusLEDs *leds;
int i, nleds;
leds = libwacom_get_status_leds(wacom, &nleds);
if (nleds == 0)
return;
for (i = 0; i < nleds; i++) {
switch(leds[i]) {
case WACOM_STATUS_LED_TOUCHSTRIP:
group = pad_get_mode_group(pad, i);
group->strip_mask |= 0x1;
break;
case WACOM_STATUS_LED_TOUCHSTRIP2:
group = pad_get_mode_group(pad, i);
group->strip_mask |= 0x2;
break;
default:
break;
}
}
}
static int
pad_init_leds_from_libwacom(struct pad_dispatch *pad,
struct evdev_device *device)
{
struct libinput *libinput = device->base.seat->libinput;
WacomDeviceDatabase *db = NULL;
WacomDevice *wacom = NULL;
int rc = 1;
db = libwacom_database_new();
if (!db) {
log_info(libinput,
"Failed to initialize libwacom context.\n");
goto out;
}
wacom = libwacom_new_from_path(db,
udev_device_get_devnode(device->udev_device),
WFALLBACK_NONE,
NULL);
if (!wacom)
goto out;
rc = pad_init_led_groups(pad, device, wacom);
if (rc != 0)
goto out;
if ((rc = pad_init_mode_buttons(pad, wacom)) != 0)
goto out;
pad_init_mode_rings(pad, wacom);
pad_init_mode_strips(pad, wacom);
out:
if (wacom)
libwacom_destroy(wacom);
if (db)
libwacom_database_destroy(db);
if (rc != 0)
pad_destroy_leds(pad);
return rc;
}
#endif /* HAVE_LIBWACOM */
static int static int
pad_init_fallback_group(struct pad_dispatch *pad) pad_init_fallback_group(struct pad_dispatch *pad)
{ {
@ -112,11 +571,12 @@ pad_init_leds(struct pad_dispatch *pad,
return rc; return rc;
} }
/* Eventually we slot the libwacom-based led detection in here. That /* If libwacom fails, we init one fallback group anyway */
* requires getting the kernel ready first. For now we just init the #if HAVE_LIBWACOM
* fallback single-mode group. rc = pad_init_leds_from_libwacom(pad, device);
*/ #endif
rc = pad_init_fallback_group(pad); if (rc != 0)
rc = pad_init_fallback_group(pad);
return rc; return rc;
} }
@ -136,6 +596,7 @@ pad_button_update_mode(struct libinput_tablet_pad_mode_group *g,
enum libinput_button_state state) enum libinput_button_state state)
{ {
struct pad_led_group *group = (struct pad_led_group*)g; struct pad_led_group *group = (struct pad_led_group*)g;
int rc;
if (state != LIBINPUT_BUTTON_STATE_PRESSED) if (state != LIBINPUT_BUTTON_STATE_PRESSED)
return; return;
@ -143,9 +604,9 @@ pad_button_update_mode(struct libinput_tablet_pad_mode_group *g,
if (!libinput_tablet_pad_mode_group_button_is_toggle(g, button_index)) if (!libinput_tablet_pad_mode_group_button_is_toggle(g, button_index))
return; return;
log_bug_libinput(group->base.device->seat->libinput, rc = pad_led_group_get_mode(group);
"Button %d should not be a toggle button", if (rc >= 0)
button_index); group->base.current_mode = rc;
} }
int int

View file

@ -2077,7 +2077,7 @@ evdev_read_wheel_click_count_prop(struct evdev_device *device,
} }
log_error(evdev_libinput_context(device), log_error(evdev_libinput_context(device),
"Mouse wheel click count '%s' is present but invalid, " "Mouse wheel click count for '%s' is present but invalid, "
"using %d degrees for angle instead instead\n", "using %d degrees for angle instead instead\n",
device->devname, device->devname,
DEFAULT_WHEEL_CLICK_ANGLE); DEFAULT_WHEEL_CLICK_ANGLE);

View file

@ -546,7 +546,7 @@ evdev_to_left_handed(struct evdev_device *device,
/** /**
* Apply a hysteresis filtering to the coordinate in, based on the current * Apply a hysteresis filtering to the coordinate in, based on the current
* hystersis center and the margin. If 'in' is within 'margin' of center, * hysteresis center and the margin. If 'in' is within 'margin' of center,
* return the center (and thus filter the motion). If 'in' is outside, * return the center (and thus filter the motion). If 'in' is outside,
* return a point on the edge of the new margin. So for a point x in the * return a point on the edge of the new margin. So for a point x in the
* space outside c + margin we return r: * space outside c + margin we return r:

View file

@ -53,7 +53,7 @@ static const char udev_rule[] =
"KERNEL!=\"event*\", GOTO=\"wheel_click_angle_end\"\n" "KERNEL!=\"event*\", GOTO=\"wheel_click_angle_end\"\n"
"\n" "\n"
"ATTRS{name}==\"litest Wheel Click Angle Mouse*\",\\\n" "ATTRS{name}==\"litest Wheel Click Angle Mouse*\",\\\n"
" ENV{MOUSE_WHEEL_CLICK_ANGLE}=\"-7\",\n" " ENV{MOUSE_WHEEL_CLICK_ANGLE}=\"-7\",\\\n"
" ENV{MOUSE_WHEEL_CLICK_ANGLE_HORIZONTAL}=\"13\"\n" " ENV{MOUSE_WHEEL_CLICK_ANGLE_HORIZONTAL}=\"13\"\n"
"\n" "\n"
"LABEL=\"wheel_click_angle_end\""; "LABEL=\"wheel_click_angle_end\"";

View file

@ -232,7 +232,7 @@ static const char udev_rule[] =
"ENV{ID_INPUT_TABLET}==\"\", GOTO=\"waltop_end\"\n" "ENV{ID_INPUT_TABLET}==\"\", GOTO=\"waltop_end\"\n"
"\n" "\n"
"ATTRS{name}==\"litest WALTOP Batteryless Tablet*\",\\\n" "ATTRS{name}==\"litest WALTOP Batteryless Tablet*\",\\\n"
" ENV{LIBINPUT_ATTR_SIZE_HINT}=\"200x200\",\n" " ENV{LIBINPUT_ATTR_SIZE_HINT}=\"200x200\"\n"
"\n" "\n"
"LABEL=\"touchpad_end\""; "LABEL=\"touchpad_end\"";

View file

@ -1062,7 +1062,7 @@ START_TEST(pointer_accel_defaults)
speed); speed);
} }
for (speed = 1.2; speed <= -2.0; speed += 0.2) { for (speed = 1.2; speed <= 2.0; speed += 0.2) {
status = libinput_device_config_accel_set_speed(device, status = libinput_device_config_accel_set_speed(device,
speed); speed);
ck_assert_int_eq(status, ck_assert_int_eq(status,