mirror of
https://gitlab.freedesktop.org/libinput/libinput.git
synced 2026-03-26 08:50:49 +01:00
Compare commits
18 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8be6d697ac | ||
|
|
2908beb272 | ||
|
|
d9c8da9da6 | ||
|
|
f9207606aa | ||
|
|
41f03cb767 | ||
|
|
6bff32a750 | ||
|
|
568be0867f | ||
|
|
0d5d367a82 | ||
|
|
0694e46ccf | ||
|
|
97ff0002e9 | ||
|
|
23bacd16c3 | ||
|
|
5acd9a373b | ||
|
|
e2c54e1db2 | ||
|
|
dca3360866 | ||
|
|
c69a5bb785 | ||
|
|
58f6eed9db | ||
|
|
544d4b6b74 | ||
|
|
31ffda96fa |
13 changed files with 281 additions and 20 deletions
|
|
@ -2,7 +2,7 @@ AC_PREREQ([2.64])
|
|||
|
||||
m4_define([libinput_major_version], [1])
|
||||
m4_define([libinput_minor_version], [3])
|
||||
m4_define([libinput_micro_version], [0])
|
||||
m4_define([libinput_micro_version], [2])
|
||||
m4_define([libinput_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
|
||||
# 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
|
||||
LIBINPUT_LT_VERSION=18:3:8
|
||||
LIBINPUT_LT_VERSION=18:5:8
|
||||
AC_SUBST(LIBINPUT_LT_VERSION)
|
||||
|
||||
AM_SILENT_RULES([yes])
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ header_files = \
|
|||
$(top_srcdir)/src/libinput.h \
|
||||
$(top_srcdir)/README.txt \
|
||||
$(srcdir)/absolute-axes.dox \
|
||||
$(srcdir)/absolute-coordinate-ranges.dox \
|
||||
$(srcdir)/clickpad-softbuttons.dox \
|
||||
$(srcdir)/device-configuration-via-udev.dox \
|
||||
$(srcdir)/faqs.dox \
|
||||
|
|
@ -37,17 +38,25 @@ diagram_files = \
|
|||
$(srcdir)/dot/libinput-stack-xorg.gv \
|
||||
$(srcdir)/dot/libinput-stack-gnome.gv \
|
||||
$(srcdir)/dot/evemu.gv \
|
||||
$(srcdir)/svg/software-buttons.svg \
|
||||
$(srcdir)/svg/clickfinger.svg \
|
||||
$(srcdir)/svg/button-scrolling.svg \
|
||||
$(srcdir)/svg/clickfinger.svg \
|
||||
$(srcdir)/svg/clickfinger-distance.svg \
|
||||
$(srcdir)/svg/edge-scrolling.svg \
|
||||
$(srcdir)/svg/gesture-2fg-ambiguity.svg \
|
||||
$(srcdir)/svg/palm-detection.svg \
|
||||
$(srcdir)/svg/pinch-gestures.svg \
|
||||
$(srcdir)/svg/pinch-gestures-softbuttons.svg \
|
||||
$(srcdir)/svg/ptraccel-linear.svg \
|
||||
$(srcdir)/svg/ptraccel-low-dpi.svg \
|
||||
$(srcdir)/svg/ptraccel-touchpad.svg \
|
||||
$(srcdir)/svg/ptraccel-trackpoint.svg \
|
||||
$(srcdir)/svg/software-buttons.svg \
|
||||
$(srcdir)/svg/swipe-gestures.svg \
|
||||
$(srcdir)/svg/tablet-axes.svg \
|
||||
$(srcdir)/svg/tablet-interfaces.svg \
|
||||
$(srcdir)/svg/tablet-left-handed.svg \
|
||||
$(srcdir)/svg/tablet-out-of-bounds.svg \
|
||||
$(srcdir)/svg/tablet.svg \
|
||||
$(srcdir)/svg/tap-n-drag.svg \
|
||||
$(srcdir)/svg/thumb-detection.svg \
|
||||
$(srcdir)/svg/top-software-buttons.svg \
|
||||
|
|
|
|||
119
doc/absolute-coordinate-ranges.dox
Normal file
119
doc/absolute-coordinate-ranges.dox
Normal file
|
|
@ -0,0 +1,119 @@
|
|||
/**
|
||||
@page absolute_coordinate_ranges Coordinate ranges for absolute axes
|
||||
|
||||
libinput requires that all touchpads provide a correct axis range and
|
||||
resolution. These are used to enable or disable certain features or adapt
|
||||
the interaction with the touchpad. For example, the software button area is
|
||||
narrower on small touchpads to avoid reducing the interactive surface too
|
||||
much. Likewise, palm detection works differently on small touchpads as palm
|
||||
interference is less likely to happen.
|
||||
|
||||
Touchpads with incorrect axis ranges generate error messages
|
||||
in the form:
|
||||
<blockquote>
|
||||
Axis 0x35 value 4000 is outside expected range [0, 3000]
|
||||
</blockquote>
|
||||
|
||||
This error message indicates that the ABS_MT_POSITION_X axis (i.e. the x
|
||||
axis) generated an event outside the expected range of 0-3000. In this case
|
||||
the value was 4000.
|
||||
This discrepancy between the coordinate range the kernels advertises vs.
|
||||
what the touchpad sends can be the source of a number of perceived
|
||||
bugs in libinput.
|
||||
|
||||
@section absolute_coordinate_ranges_fix Measuring and fixing touchpad ranges
|
||||
|
||||
To fix the touchpad you need to:
|
||||
-# measure the physical size of your touchpad in mm
|
||||
-# run touchpad-edge-detector
|
||||
-# trim the udev match rule to something sensible
|
||||
-# replace the resolution with the calculated resolution based on physical
|
||||
settings
|
||||
-# test locally
|
||||
-# send a patch to the systemd project
|
||||
|
||||
Detailed explanations are below.
|
||||
|
||||
[libevdev](http://freedesktop.org/wiki/Software/libevdev/) provides a tool
|
||||
called **touchpad-edge-detector** that allows measuring the touchpad's input
|
||||
ranges. Run the tool as root against the device node of your touchpad device
|
||||
and repeatedly move a finger around the whole outside area of the
|
||||
touchpad. Then control+c the process and note the output.
|
||||
An example output is below:
|
||||
|
||||
@code
|
||||
$> sudo touchpad-edge-detector /dev/input/event4
|
||||
Touchpad SynPS/2 Synaptics TouchPad on /dev/input/event4
|
||||
Move one finger around the touchpad to detect the actual edges
|
||||
Kernel says: x [1024..3112], y [2024..4832]
|
||||
Touchpad sends: x [2445..4252], y [3464..4071]
|
||||
|
||||
Touchpad size as listed by the kernel: 49x66mm
|
||||
Calculate resolution as:
|
||||
x axis: 2088/<width in mm>
|
||||
y axis: 2808/<height in mm>
|
||||
|
||||
Suggested udev rule:
|
||||
# <Laptop model description goes here>
|
||||
evdev:name:SynPS/2 Synaptics TouchPad:dmi:bvnLENOVO:bvrGJET72WW(2.22):bd02/21/2014:svnLENOVO:pn20ARS25701:pvrThinkPadT440s:rvnLENOVO:rn20ARS25701:rvrSDK0E50512STD:cvnLENOVO:ct10:cvrNotAvailable:*
|
||||
EVDEV_ABS_00=2445:4252:<x resolution>
|
||||
EVDEV_ABS_01=3464:4071:<y resolution>
|
||||
EVDEV_ABS_35=2445:4252:<x resolution>
|
||||
EVDEV_ABS_36=3464:4071:<y resolution>
|
||||
|
||||
@endcode
|
||||
|
||||
Note the discrepancy between the coordinate range the kernels advertises vs.
|
||||
what the touchpad sends.
|
||||
To fix the advertised ranges, the udev rule should be taken and trimmed
|
||||
before being sent to the [systemd project](https://github.com/systemd/systemd).
|
||||
An example commit can be found
|
||||
[here](https://github.com/systemd/systemd/commit/26f667eac1c5e89b689aa0a1daef6a80f473e045).
|
||||
|
||||
In most cases the match can and should be trimmed to the system vendor (svn)
|
||||
and the product version (pvr), with everything else replaced by a wildcard
|
||||
(*). In this case, a Lenovo T440s, a suitable match string would be: @code
|
||||
evdev:name:SynPS/2 Synaptics TouchPad:dmi:*svnLENOVO:*pvrThinkPadT440s*
|
||||
@endcode
|
||||
|
||||
@note hwdb match strings only allow for alphanumeric ascii characters. Use a
|
||||
wildcard (* or ?, whichever appropriate) for special characters.
|
||||
|
||||
The actual axis overrides are in the form:
|
||||
@code
|
||||
# axis number=min:max:resolution
|
||||
EVDEV_ABS_00=2445:4252:42
|
||||
@endcode
|
||||
or, if the range is correct but the resolution is wrong
|
||||
@code
|
||||
# axis number=::resolution
|
||||
EVDEV_ABS_00=::42
|
||||
@endcode
|
||||
|
||||
Note the leading single space. The axis numbers are in hex and can be found
|
||||
in *linux/input-event-codes.h*. For touchpads ABS_X, ABS_Y,
|
||||
ABS_MT_POSITION_X and ABS_MT_POSITION_Y are required.
|
||||
|
||||
@note The touchpad's ranges and/or resolution should only be fixed when
|
||||
there is a significant discrepancy. A few units do not make a difference and
|
||||
a resolution that is off by 2 or less usually does not matter either.
|
||||
|
||||
Once a match and override rule has been found, follow the instructions at
|
||||
the top of the
|
||||
[60-evdev.hwdb](https://github.com/systemd/systemd/blob/master/hwdb/60-evdev.hwdb)
|
||||
file to save it locally and trigger the udev hwdb reload. Rebooting is
|
||||
always a good idea. If the match string is correct, the new properties will
|
||||
show up in the
|
||||
output of
|
||||
@code
|
||||
udevadm info /sys/class/input/event4
|
||||
@endcode
|
||||
|
||||
Adjust the command for the event node of your touchpad.
|
||||
A udev builtin will apply the new axis ranges automatically.
|
||||
|
||||
When the axis override is confirmed to work, please submit it as a patch to
|
||||
the [systemd project](https://github.com/systemd/systemd) or if that is not
|
||||
possible as a libinput bug here:
|
||||
https://bugs.freedesktop.org/enter_bug.cgi?product=Wayland&component=libinput
|
||||
*/
|
||||
|
|
@ -8,6 +8,7 @@
|
|||
- @subpage palm_detection
|
||||
- @subpage t440_support
|
||||
- @subpage touchpad_jumping_cursor
|
||||
- @subpage absolute_coordinate_ranges
|
||||
|
||||
@page touchscreens Touchscreens
|
||||
|
||||
|
|
|
|||
|
|
@ -248,7 +248,7 @@ tp_gesture_handle_state_none(struct tp_dispatch *tp, uint64_t time)
|
|||
if (ntouches == 2)
|
||||
return GESTURE_STATE_SCROLL;
|
||||
else
|
||||
return GESTURE_STATE_SWIPE;
|
||||
return GESTURE_STATE_NONE;
|
||||
}
|
||||
|
||||
first = touches[0];
|
||||
|
|
|
|||
|
|
@ -289,6 +289,39 @@ tp_get_delta(struct tp_touch *t)
|
|||
return tp_normalize_delta(t->tp, delta);
|
||||
}
|
||||
|
||||
static inline void
|
||||
tp_check_axis_range(struct tp_dispatch *tp,
|
||||
unsigned int code,
|
||||
int value)
|
||||
{
|
||||
int min, max;
|
||||
|
||||
switch(code) {
|
||||
case ABS_X:
|
||||
case ABS_MT_POSITION_X:
|
||||
min = tp->warning_range.min.x;
|
||||
max = tp->warning_range.max.x;
|
||||
break;
|
||||
case ABS_Y:
|
||||
case ABS_MT_POSITION_Y:
|
||||
min = tp->warning_range.min.y;
|
||||
max = tp->warning_range.max.y;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
if (value < min || value > max) {
|
||||
log_info_ratelimit(tp_libinput_context(tp),
|
||||
&tp->warning_range.range_warn_limit,
|
||||
"Axis %#x value %d is outside expected range [%d, %d]\n"
|
||||
"See %s/absolute_coordinate_ranges.html for details\n",
|
||||
code, value, min, max,
|
||||
HTTP_DOC_LINK);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
tp_process_absolute(struct tp_dispatch *tp,
|
||||
const struct input_event *e,
|
||||
|
|
@ -298,12 +331,14 @@ tp_process_absolute(struct tp_dispatch *tp,
|
|||
|
||||
switch(e->code) {
|
||||
case ABS_MT_POSITION_X:
|
||||
tp_check_axis_range(tp, e->code, e->value);
|
||||
t->point.x = e->value;
|
||||
t->millis = time;
|
||||
t->dirty = true;
|
||||
tp->queued |= TOUCHPAD_EVENT_MOTION;
|
||||
break;
|
||||
case ABS_MT_POSITION_Y:
|
||||
tp_check_axis_range(tp, e->code, e->value);
|
||||
t->point.y = e->value;
|
||||
t->millis = time;
|
||||
t->dirty = true;
|
||||
|
|
@ -339,12 +374,14 @@ tp_process_absolute_st(struct tp_dispatch *tp,
|
|||
|
||||
switch(e->code) {
|
||||
case ABS_X:
|
||||
tp_check_axis_range(tp, e->code, e->value);
|
||||
t->point.x = e->value;
|
||||
t->millis = time;
|
||||
t->dirty = true;
|
||||
tp->queued |= TOUCHPAD_EVENT_MOTION;
|
||||
break;
|
||||
case ABS_Y:
|
||||
tp_check_axis_range(tp, e->code, e->value);
|
||||
t->point.y = e->value;
|
||||
t->millis = time;
|
||||
t->dirty = true;
|
||||
|
|
@ -928,6 +965,7 @@ tp_detect_jumps(const struct tp_dispatch *tp, struct tp_touch *t)
|
|||
static void
|
||||
tp_process_state(struct tp_dispatch *tp, uint64_t time)
|
||||
{
|
||||
struct evdev_device *device = tp->device;
|
||||
struct tp_touch *t;
|
||||
unsigned int i;
|
||||
bool restart_filter = false;
|
||||
|
|
@ -953,14 +991,16 @@ tp_process_state(struct tp_dispatch *tp, uint64_t time)
|
|||
if (!t->dirty)
|
||||
continue;
|
||||
|
||||
if (t->pressure_delta < -7)
|
||||
if ((device->model_flags & EVDEV_MODEL_LENOVO_T450_TOUCHPAD) &&
|
||||
t->pressure_delta < -7)
|
||||
tp_motion_history_reset(t);
|
||||
|
||||
if (tp_detect_jumps(tp, t)) {
|
||||
log_bug_kernel(tp_libinput_context(tp),
|
||||
"Touch jump detected and discarded.\n"
|
||||
"See %stouchpad_jumping_cursor for details\n",
|
||||
HTTP_DOC_LINK);
|
||||
if (!tp->semi_mt)
|
||||
log_bug_kernel(tp_libinput_context(tp),
|
||||
"Touch jump detected and discarded.\n"
|
||||
"See %stouchpad_jumping_cursor.html for details\n",
|
||||
HTTP_DOC_LINK);
|
||||
tp_motion_history_reset(t);
|
||||
}
|
||||
|
||||
|
|
@ -2058,6 +2098,26 @@ want_hysteresis:
|
|||
return;
|
||||
}
|
||||
|
||||
static void
|
||||
tp_init_range_warnings(struct tp_dispatch *tp,
|
||||
struct evdev_device *device,
|
||||
int width,
|
||||
int height)
|
||||
{
|
||||
const struct input_absinfo *x, *y;
|
||||
|
||||
x = device->abs.absinfo_x;
|
||||
y = device->abs.absinfo_y;
|
||||
|
||||
tp->warning_range.min.x = x->minimum - 0.05 * width;
|
||||
tp->warning_range.min.y = y->minimum - 0.05 * height;
|
||||
tp->warning_range.max.x = x->maximum + 0.05 * width;
|
||||
tp->warning_range.max.y = y->maximum + 0.05 * height;
|
||||
|
||||
/* One warning every 5 min is enough */
|
||||
ratelimit_init(&tp->warning_range.range_warn_limit, s2us(3000), 1);
|
||||
}
|
||||
|
||||
static int
|
||||
tp_init(struct tp_dispatch *tp,
|
||||
struct evdev_device *device)
|
||||
|
|
@ -2081,6 +2141,8 @@ tp_init(struct tp_dispatch *tp,
|
|||
height = device->abs.dimensions.y;
|
||||
diagonal = sqrt(width*width + height*height);
|
||||
|
||||
tp_init_range_warnings(tp, device, width, height);
|
||||
|
||||
tp->reports_distance = libevdev_has_event_code(device->evdev,
|
||||
EV_ABS,
|
||||
ABS_MT_DISTANCE);
|
||||
|
|
|
|||
|
|
@ -244,6 +244,11 @@ struct tp_dispatch {
|
|||
|
||||
struct device_coords hysteresis_margin;
|
||||
|
||||
struct {
|
||||
struct device_coords min, max;
|
||||
struct ratelimit range_warn_limit;
|
||||
} warning_range;
|
||||
|
||||
struct {
|
||||
double x_scale_coeff;
|
||||
double y_scale_coeff;
|
||||
|
|
|
|||
|
|
@ -403,6 +403,10 @@ pad_process(struct evdev_dispatch *dispatch,
|
|||
case EV_SYN:
|
||||
pad_flush(pad, device, time);
|
||||
break;
|
||||
case EV_MSC:
|
||||
/* The EKR sends the serial as MSC_SERIAL, ignore this for
|
||||
* now */
|
||||
break;
|
||||
default:
|
||||
log_error(device->base.seat->libinput,
|
||||
"Unexpected event type %s (%#x)\n",
|
||||
|
|
|
|||
12
src/evdev.c
12
src/evdev.c
|
|
@ -568,7 +568,11 @@ get_key_type(uint16_t code)
|
|||
return EVDEV_KEY_TYPE_BUTTON;
|
||||
if (code >= KEY_OK && code <= KEY_LIGHTS_TOGGLE)
|
||||
return EVDEV_KEY_TYPE_KEY;
|
||||
if (code >= BTN_DPAD_UP && code <= BTN_TRIGGER_HAPPY40)
|
||||
if (code >= BTN_DPAD_UP && code <= BTN_DPAD_RIGHT)
|
||||
return EVDEV_KEY_TYPE_BUTTON;
|
||||
if (code >= KEY_ALS_TOGGLE && code <= KEY_KBDINPUTASSIST_CANCEL)
|
||||
return EVDEV_KEY_TYPE_KEY;
|
||||
if (code >= BTN_TRIGGER_HAPPY && code <= BTN_TRIGGER_HAPPY40)
|
||||
return EVDEV_KEY_TYPE_BUTTON;
|
||||
return EVDEV_KEY_TYPE_NONE;
|
||||
}
|
||||
|
|
@ -1738,10 +1742,12 @@ evdev_read_model_flags(struct evdev_device *device)
|
|||
};
|
||||
const struct model_map *m = model_map;
|
||||
uint32_t model_flags = 0;
|
||||
const char *val;
|
||||
|
||||
while (m->property) {
|
||||
if (!!udev_device_get_property_value(device->udev_device,
|
||||
m->property)) {
|
||||
val = udev_device_get_property_value(device->udev_device,
|
||||
m->property);
|
||||
if (val && !streq(val, "0")) {
|
||||
log_debug(device->base.seat->libinput,
|
||||
"%s: tagged as %s\n",
|
||||
evdev_device_get_sysname(device),
|
||||
|
|
|
|||
|
|
@ -1889,10 +1889,13 @@ libinput_event_tablet_tool_get_y_transformed(struct libinput_event_tablet_tool *
|
|||
*
|
||||
* Returns the tool that was in use during this event.
|
||||
*
|
||||
* If the caller holds at least one reference (see
|
||||
* libinput_tablet_tool_ref()), this struct is used whenever the
|
||||
* tools enters proximity. Otherwise, if no references remain when the tool
|
||||
* leaves proximity, the tool may be destroyed.
|
||||
* The returned tablet tool is not refcounted and may become invalid after
|
||||
* the next call to libinput. Use libinput_tablet_tool_ref() and
|
||||
* libinput_tablet_tool_unref() to continue using the handle outside of the
|
||||
* immediate scope.
|
||||
*
|
||||
* If the caller holds at least one reference, this struct is used
|
||||
* whenever the tools enters proximity again.
|
||||
*
|
||||
* @note Physical tool tracking requires hardware support. If unavailable,
|
||||
* libinput creates one tool per type per tablet. See @ref
|
||||
|
|
@ -1999,7 +2002,7 @@ libinput_event_tablet_tool_get_time_usec(struct libinput_event_tablet_tool *even
|
|||
/**
|
||||
* @ingroup event_tablet
|
||||
*
|
||||
* Return the type of tool type for a tool object, see @ref
|
||||
* Return the tool type for a tool object, see @ref
|
||||
* tablet-tool-types for details.
|
||||
*
|
||||
* @param tool The libinput tool
|
||||
|
|
@ -2047,7 +2050,8 @@ libinput_tablet_tool_ref(struct libinput_tablet_tool *tool);
|
|||
* @ingroup event_tablet
|
||||
*
|
||||
* Decrement the reference count of the tool by one. When the reference
|
||||
* count of tool reaches 0, the memory allocated for tool will be freed.
|
||||
* count of the tool reaches 0, the memory allocated for the tool will be
|
||||
* freed.
|
||||
*
|
||||
* @param tool The tool to decrement the ref count of
|
||||
* @return NULL if the tool was destroyed otherwise the passed tool
|
||||
|
|
@ -3065,6 +3069,11 @@ libinput_device_get_output_name(struct libinput_device *device);
|
|||
* seat name pair at any given time, but if no external reference is kept, it
|
||||
* may be destroyed if no device belonging to it is left.
|
||||
*
|
||||
* The returned seat is not refcounted and may become invalid after
|
||||
* the next call to libinput. Use libinput_seat_ref() and
|
||||
* libinput_seat_unref() to continue using the handle outside of the
|
||||
* immediate scope.
|
||||
*
|
||||
* @param device A previously obtained device
|
||||
* @return The seat this input device belongs to
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -342,6 +342,42 @@ START_TEST(keyboard_time_usec)
|
|||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(keyboard_no_buttons)
|
||||
{
|
||||
struct litest_device *dev = litest_current_device();
|
||||
struct libinput *li = dev->libinput;
|
||||
struct libinput_event *event;
|
||||
int code;
|
||||
const char *name;
|
||||
|
||||
litest_drain_events(dev->libinput);
|
||||
|
||||
for (code = 0; code < KEY_MAX; code++) {
|
||||
if (!libevdev_has_event_code(dev->evdev, EV_KEY, code))
|
||||
continue;
|
||||
|
||||
name = libevdev_event_code_get_name(EV_KEY, code);
|
||||
if (!name || !strneq(name, "KEY_", 4))
|
||||
continue;
|
||||
|
||||
litest_keyboard_key(dev, code, true);
|
||||
litest_keyboard_key(dev, code, false);
|
||||
libinput_dispatch(li);
|
||||
|
||||
event = libinput_get_event(li);
|
||||
litest_is_keyboard_event(event,
|
||||
code,
|
||||
LIBINPUT_KEY_STATE_PRESSED);
|
||||
libinput_event_destroy(event);
|
||||
event = libinput_get_event(li);
|
||||
litest_is_keyboard_event(event,
|
||||
code,
|
||||
LIBINPUT_KEY_STATE_RELEASED);
|
||||
libinput_event_destroy(event);
|
||||
}
|
||||
}
|
||||
END_TEST
|
||||
|
||||
void
|
||||
litest_setup_tests(void)
|
||||
{
|
||||
|
|
@ -351,4 +387,6 @@ litest_setup_tests(void)
|
|||
litest_add("keyboard:keys", keyboard_has_key, LITEST_KEYS, LITEST_ANY);
|
||||
litest_add("keyboard:keys", keyboard_keys_bad_device, LITEST_ANY, LITEST_ANY);
|
||||
litest_add("keyboard:time", keyboard_time_usec, LITEST_KEYS, LITEST_ANY);
|
||||
|
||||
litest_add("keyboard:events", keyboard_no_buttons, LITEST_KEYS, LITEST_ANY);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -204,7 +204,7 @@ accel_profiles(struct libinput_device *device)
|
|||
|
||||
profile = libinput_device_config_accel_get_default_profile(device);
|
||||
xasprintf(&str,
|
||||
"%s%s%s%s",
|
||||
"%s%s %s%s",
|
||||
(profile == LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT) ? "*" : "",
|
||||
(profiles & LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT) ? "flat" : "",
|
||||
(profile == LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE) ? "*" : "",
|
||||
|
|
|
|||
|
|
@ -26,6 +26,10 @@ libinput:name:*AlpsPS/2 ALPS DualPoint TouchPad:fwversion:800
|
|||
libinput:name:*AlpsPS/2 ALPS GlidePoint:fwversion:800
|
||||
LIBINPUT_ATTR_SIZE_HINT=100x55
|
||||
|
||||
libinput:name:*AlpsPS/2 ALPS DualPoint TouchPad:fwversion:300
|
||||
libinput:name:*AlpsPS/2 ALPS GlidePoint:fwversion:300
|
||||
LIBINPUT_MODEL_WOBBLY_TOUCHPAD=1
|
||||
|
||||
libinput:name:*AlpsPS/2 ALPS DualPoint TouchPad:fwversion:310
|
||||
libinput:name:*AlpsPS/2 ALPS GlidePoint:fwversion:310
|
||||
LIBINPUT_MODEL_ALPS_RUSHMORE=1
|
||||
|
|
@ -115,6 +119,10 @@ libinput:name:SynPS/2 Synaptics TouchPad:dmi:*svnLENOVO:*:pvrThinkPad??60*:
|
|||
libinput:name:SynPS/2 Synaptics TouchPad:dmi:*svnLENOVO:*:pvrThinkPadX1Carbon3rd:*
|
||||
LIBINPUT_MODEL_LENOVO_T450_TOUCHPAD=1
|
||||
|
||||
# Lenovo Yoga 2013
|
||||
libinput:name:*SynPS/2 Synaptics TouchPad*:dmi:*svnLENOVO*pvrLenovoYoga213:*
|
||||
LIBINPUT_MODEL_WOBBLY_TOUCHPAD=1
|
||||
|
||||
##########################################
|
||||
# Synaptics
|
||||
##########################################
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue