added extra/libinput

This commit is contained in:
Kevin Mihelich 2017-04-23 22:11:40 +00:00
parent 3f4a9ecc57
commit acd737646a
5 changed files with 413 additions and 0 deletions

View file

@ -0,0 +1,248 @@
From c48c84a47ae45db3591d99237b72f9ac3b84de48 Mon Sep 17 00:00:00 2001
From: Peter Hutterer <peter.hutterer@who-t.net>
Date: Thu, 20 Apr 2017 14:59:23 +1000
Subject: [PATCH 1/4] touchpad: move the pressure range to a hwdb entry
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
src/evdev-mt-touchpad.c | 44 +++++++++++++++++++++++++++-----------
src/libinput-util.c | 36 +++++++++++++++++++++++++++++++
src/libinput-util.h | 1 +
test/test-misc.c | 43 +++++++++++++++++++++++++++++++++++++
udev/90-libinput-model-quirks.hwdb | 2 ++
udev/parse_hwdb.py | 8 ++++++-
6 files changed, 121 insertions(+), 13 deletions(-)
diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
index 4a8b618..184d37d 100644
--- a/src/evdev-mt-touchpad.c
+++ b/src/evdev-mt-touchpad.c
@@ -2364,8 +2364,9 @@ tp_init_pressure(struct tp_dispatch *tp,
struct evdev_device *device)
{
const struct input_absinfo *abs;
- unsigned int range;
unsigned int code = ABS_PRESSURE;
+ const char *prop;
+ int hi, lo;
if (tp->has_mt)
code = ABS_MT_PRESSURE;
@@ -2375,25 +2376,44 @@ tp_init_pressure(struct tp_dispatch *tp,
return;
}
- tp->pressure.use_pressure = true;
-
abs = libevdev_get_abs_info(device->evdev, code);
assert(abs);
- range = abs->maximum - abs->minimum;
+ prop = udev_device_get_property_value(device->udev_device,
+ "LIBINPUT_ATTR_PRESSURE_RANGE");
+ if (prop) {
+ if (!parse_pressure_range_property(prop, &hi, &lo)) {
+ evdev_log_bug_client(device,
+ "discarding invalid pressure range '%s'\n",
+ prop);
+ return;
+ }
- if (device->model_flags & EVDEV_MODEL_ELANTECH_TOUCHPAD) {
- tp->pressure.high = 24;
- tp->pressure.low = 10;
- } else if (device->model_flags & EVDEV_MODEL_CYAPA) {
- tp->pressure.high = 10;
- tp->pressure.low = 8;
+ if (hi == 0 && lo == 0) {
+ evdev_log_info(device,
+ "pressure-based touch detection disabled\n");
+ return;
+ }
} else {
+ unsigned int range = abs->maximum - abs->minimum;
+
/* Approximately the synaptics defaults */
- tp->pressure.high = abs->minimum + 0.12 * range;
- tp->pressure.low = abs->minimum + 0.10 * range;
+ hi = abs->minimum + 0.12 * range;
+ lo = abs->minimum + 0.10 * range;
+ }
+
+ if (hi > abs->maximum || hi < abs->minimum ||
+ lo > abs->maximum || lo < abs->minimum) {
+ evdev_log_bug_libinput(device,
+ "discarding out-of-bounds pressure range %d:%d\n",
+ hi, lo);
+ return;
}
+ tp->pressure.use_pressure = true;
+ tp->pressure.high = hi;
+ tp->pressure.low = lo;
+
evdev_log_debug(device,
"using pressure-based touch detection\n");
}
diff --git a/src/libinput-util.c b/src/libinput-util.c
index 351bbe4..38594fa 100644
--- a/src/libinput-util.c
+++ b/src/libinput-util.c
@@ -360,6 +360,42 @@ parse_tpkbcombo_layout_poperty(const char *prop,
}
/**
+ * Parses a string of the format "a:b" where both a and b must be integer
+ * numbers and a > b. Also allowed is the special string vaule "none" which
+ * amounts to unsetting the property.
+ *
+ * @param prop The value of the property
+ * @param hi Set to the first digit or 0 in case of 'none'
+ * @param lo Set to the second digit or 0 in case of 'none'
+ * @return true on success, false otherwise
+ */
+bool
+parse_pressure_range_property(const char *prop, int *hi, int *lo)
+{
+ int first, second;
+
+ if (!prop)
+ return false;
+
+ if (streq(prop, "none")) {
+ *hi = 0;
+ *lo = 0;
+ return true;
+ }
+
+ if (sscanf(prop, "%d:%d", &first, &second) != 2)
+ return false;
+
+ if (second >= first)
+ return false;
+
+ *hi = first;
+ *lo = second;
+
+ return true;
+}
+
+/**
* Return the next word in a string pointed to by state before the first
* separator character. Call repeatedly to tokenize a whole string.
*
diff --git a/src/libinput-util.h b/src/libinput-util.h
index d86ff12..66fd336 100644
--- a/src/libinput-util.h
+++ b/src/libinput-util.h
@@ -378,6 +378,7 @@ int parse_mouse_wheel_click_count_property(const char *prop);
double parse_trackpoint_accel_property(const char *prop);
bool parse_dimension_property(const char *prop, size_t *width, size_t *height);
bool parse_calibration_property(const char *prop, float calibration[6]);
+bool parse_pressure_range_property(const char *prop, int *hi, int *lo);
enum tpkbcombo_layout {
TPKBCOMBO_LAYOUT_UNKNOWN,
diff --git a/test/test-misc.c b/test/test-misc.c
index 3f4b229..5101dcf 100644
--- a/test/test-misc.c
+++ b/test/test-misc.c
@@ -1001,6 +1001,48 @@ START_TEST(calibration_prop_parser)
}
END_TEST
+struct parser_test_pressure_range {
+ char *tag;
+ bool success;
+ int hi, lo;
+};
+
+START_TEST(pressure_range_prop_parser)
+{
+ struct parser_test_pressure_range tests[] = {
+ { "10:8", true, 10, 8 },
+ { "100:-1", true, 100, -1 },
+ { "-203813:-502023", true, -203813, -502023 },
+ { "238492:28210", true, 238492, 28210 },
+ { "none", true, 0, 0 },
+ { "0:0", false, 0, 0 },
+ { "", false, 0, 0 },
+ { "abcd", false, 0, 0 },
+ { "10:30:10", false, 0, 0 },
+ { NULL, false, 0, 0 }
+ };
+ int i;
+ int hi, lo;
+ bool success;
+
+ for (i = 0; tests[i].tag != NULL; i++) {
+ hi = lo = 0xad;
+ success = parse_pressure_range_property(tests[i].tag, &hi, &lo);
+ ck_assert(success == tests[i].success);
+ if (success) {
+ ck_assert_int_eq(hi, tests[i].hi);
+ ck_assert_int_eq(lo, tests[i].lo);
+ } else {
+ ck_assert_int_eq(hi, 0xad);
+ ck_assert_int_eq(lo, 0xad);
+ }
+ }
+
+ success = parse_pressure_range_property(NULL, NULL, NULL);
+ ck_assert(success == false);
+}
+END_TEST
+
START_TEST(time_conversion)
{
ck_assert_int_eq(us(10), 10);
@@ -1275,6 +1317,7 @@ litest_setup_tests_misc(void)
litest_add_no_device("misc:parser", dimension_prop_parser);
litest_add_no_device("misc:parser", reliability_prop_parser);
litest_add_no_device("misc:parser", calibration_prop_parser);
+ litest_add_no_device("misc:parser", pressure_range_prop_parser);
litest_add_no_device("misc:parser", safe_atoi_test);
litest_add_no_device("misc:parser", safe_atod_test);
litest_add_no_device("misc:parser", strsplit_test);
diff --git a/udev/90-libinput-model-quirks.hwdb b/udev/90-libinput-model-quirks.hwdb
index 2ff50b6..4b9b7f2 100644
--- a/udev/90-libinput-model-quirks.hwdb
+++ b/udev/90-libinput-model-quirks.hwdb
@@ -85,6 +85,7 @@ libinput:name:* Touchpad:dmi:*svnDellInc.:*
##########################################
libinput:name:*ETPS/2 Elantech Touchpad*:dmi:*
LIBINPUT_ATTR_RESOLUTION_HINT=31x31
+ LIBINPUT_ATTR_PRESSURE_RANGE=24:8
LIBINPUT_MODEL_ELANTECH_TOUCHPAD=1
##########################################
@@ -111,6 +112,7 @@ libinput:name:Atmel maXTouch Touchpad:dmi:*svn*GOOGLE*:pn*Samus*
libinput:name:Cypress APA Trackpad ?cyapa?:dmi:*
LIBINPUT_MODEL_CYAPA=1
+ LIBINPUT_ATTR_PRESSURE_RANGE=10:8
##########################################
# HP
diff --git a/udev/parse_hwdb.py b/udev/parse_hwdb.py
index 2a342bf..97f04f4 100755
--- a/udev/parse_hwdb.py
+++ b/udev/parse_hwdb.py
@@ -112,7 +112,13 @@ def property_grammar():
Suppress('=') -
tpkbcombo_tags('VALUE')]
- grammar = Or(model_props + size_props + reliability + tpkbcombo)
+ pressure_range = INTEGER('X') + Suppress(':') + INTEGER('Y')
+ pressure_prop = [ Literal('LIBINPUT_ATTR_PRESSURE_RANGE')('NAME') -
+ Suppress('=') -
+ Group(pressure_range('SETTINGS*')) ]
+
+ grammar = Or(model_props + size_props + reliability + tpkbcombo +
+ pressure_prop)
return grammar
--
2.12.2

View file

@ -0,0 +1,33 @@
From a96753126be75ef8aee5035ad5be2df36e617877 Mon Sep 17 00:00:00 2001
From: Paul Kocialkowski <contact@paulk.fr>
Date: Fri, 21 Apr 2017 13:31:56 +0200
Subject: [PATCH 2/4] udev: Add name-based input device detection without dmi
Some devices do not use dmi at all (this is the case on most non-x86
platforms, such as arm and arm64) but should able to select specific
quirks based on the input device name too.
This adds name-based input device detection without dmi to support
these devices.
Signed-off-by: Paul Kocialkowski <contact at paulk.fr>
---
udev/90-libinput-model-quirks.rules.in | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/udev/90-libinput-model-quirks.rules.in b/udev/90-libinput-model-quirks.rules.in
index 8bff192..149ef0d 100644
--- a/udev/90-libinput-model-quirks.rules.in
+++ b/udev/90-libinput-model-quirks.rules.in
@@ -37,4 +37,8 @@ ENV{ID_INPUT_MOUSE}=="1", \
KERNELS=="input*", \
IMPORT{builtin}="hwdb 'libinput:name:$attr{name}:$attr{[dmi/id]modalias}'"
+# libinput:name:<name>
+KERNELS=="input*", \
+ IMPORT{builtin}="hwdb 'libinput:name:$attr{name}'"
+
LABEL="libinput_model_quirks_end"
--
2.12.2

View file

@ -0,0 +1,34 @@
From 7137ea7c201c1f3d7f7c2feb749f5c311ee6ea6c Mon Sep 17 00:00:00 2001
From: Paul Kocialkowski <contact@paulk.fr>
Date: Fri, 21 Apr 2017 13:31:57 +0200
Subject: [PATCH 3/4] udev: Add support for I2C Elan touchpads (without dmi)
This adds support for I2C Elan touchpads, such as the ones found in
various ARM CrOS devices. These devices do not use dmi.
The pressure range is copied as-is from the current Elantech PS/2
touchpads entry. It is not adapted to every touchpad configuration.
Signed-off-by: Paul Kocialkowski <contact at paulk.fr>
---
udev/90-libinput-model-quirks.hwdb | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/udev/90-libinput-model-quirks.hwdb b/udev/90-libinput-model-quirks.hwdb
index 4b9b7f2..77d0a67 100644
--- a/udev/90-libinput-model-quirks.hwdb
+++ b/udev/90-libinput-model-quirks.hwdb
@@ -88,6 +88,10 @@ libinput:name:*ETPS/2 Elantech Touchpad*:dmi:*
LIBINPUT_ATTR_PRESSURE_RANGE=24:8
LIBINPUT_MODEL_ELANTECH_TOUCHPAD=1
+libinput:name:*Elan Touchpad*
+ LIBINPUT_MODEL_ELANTECH_TOUCHPAD=1
+ LIBINPUT_ATTR_PRESSURE_RANGE=24:8
+
##########################################
# Google
##########################################
--
2.12.2

View file

@ -0,0 +1,38 @@
From 424058c86ef56a80fc9723e0afd1695681a145b8 Mon Sep 17 00:00:00 2001
From: Paul Kocialkowski <contact@paulk.fr>
Date: Fri, 21 Apr 2017 13:31:58 +0200
Subject: [PATCH 4/4] udev: Decrease high pressure value for Elantech touchpads
The high pressure value for Elantech touchpads (both PS/2 and I2C) is
not adapted to various devices, on which the touchpad is barely usable.
Decreasing the high value makes those devices usable again, while not
introducing any major drawback for other devices.
Signed-off-by: Paul Kocialkowski <contact at paulk.fr>
---
udev/90-libinput-model-quirks.hwdb | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/udev/90-libinput-model-quirks.hwdb b/udev/90-libinput-model-quirks.hwdb
index 77d0a67..a873546 100644
--- a/udev/90-libinput-model-quirks.hwdb
+++ b/udev/90-libinput-model-quirks.hwdb
@@ -85,12 +85,12 @@ libinput:name:* Touchpad:dmi:*svnDellInc.:*
##########################################
libinput:name:*ETPS/2 Elantech Touchpad*:dmi:*
LIBINPUT_ATTR_RESOLUTION_HINT=31x31
- LIBINPUT_ATTR_PRESSURE_RANGE=24:8
+ LIBINPUT_ATTR_PRESSURE_RANGE=10:8
LIBINPUT_MODEL_ELANTECH_TOUCHPAD=1
libinput:name:*Elan Touchpad*
LIBINPUT_MODEL_ELANTECH_TOUCHPAD=1
- LIBINPUT_ATTR_PRESSURE_RANGE=24:8
+ LIBINPUT_ATTR_PRESSURE_RANGE=10:8
##########################################
# Google
--
2.12.2

60
extra/libinput/PKGBUILD Normal file
View file

@ -0,0 +1,60 @@
# $Id$
# Maintainer: Andreas Radke <andyrtr@archlinux.org>
# Maintainer: Jan de Groot
# ALARM: Kevin Mihelich <kevin@archlinuxarm.org>
# - add proposed upstream patches to fix Elan I2C touchpads
pkgname=libinput
pkgver=1.7.0
pkgrel=1.1
pkgdesc="Input device management and event handling library"
arch=(i686 x86_64)
url="https://www.freedesktop.org/wiki/Software/libinput/"
license=(custom:X11)
depends=('mtdev' 'systemd' 'libevdev' 'libwacom')
# currently no doc files to install
makedepends=('doxygen' 'graphviz' 'gtk3')
#checkdepends=('check' 'libunwind')
source=(https://freedesktop.org/software/$pkgname/$pkgname-$pkgver.tar.xz{,.sig}
0001-touchpad-move-the-pressure-range-to-a-hwdb-entry.patch
0002-udev-Add-name-based-input-device-detection-without-d.patch
0003-udev-Add-support-for-I2C-Elan-touchpads-without-dmi.patch
0004-udev-Decrease-high-pressure-value-for-Elantech-touch.patch)
sha512sums=('9058eab813ea3de230835155ca843f248127cbafaf1aecc9a2e209a0215b090beef0468cc863a24320f8d0db1f2863baba680e2416e9e409e958b2c1d18e43a1'
'SKIP'
'96a368290c0d2993da2d4527546642345a41127dcd4ed52908c252086884f5107f026817c1e4c8abccc73c5dbfcd80fb5295685196795f9606b28dafe4b60576'
'2b9c903ad01c14a834dceef0cb8d889fc9f79e52517076e0ee7b3396d0647d10c11a4e4ad0615cbd37f6272e3bee5cd37681d3436786f850b24171fdd99742c5'
'031b3de6bf9201313028ceaa889580fdf43a63a520d205a61c77e1bb0c72decca69bf0a6a2e966e11098444629ca02328afdc636f4dac28106bbe32babcf93a6'
'6c1201a4bf64facb8384bbee3c1cd86c7b522332f6d105ea316bfbba18f3e740257527ba3b657952543dcf3e107406cf49f1f9b9e66963fd3272d7bce37bcacd')
validpgpkeys=('3C2C43D9447D5938EF4551EBE23B7E70B467F0BF') # Peter Hutterer (Who-T) <office@who-t.net>
prepare() {
cd $pkgname-$pkgver
patch -p1 -i ../0001-touchpad-move-the-pressure-range-to-a-hwdb-entry.patch
patch -p1 -i ../0002-udev-Add-name-based-input-device-detection-without-d.patch
patch -p1 -i ../0003-udev-Add-support-for-I2C-Elan-touchpads-without-dmi.patch
patch -p1 -i ../0004-udev-Decrease-high-pressure-value-for-Elantech-touch.patch
}
build() {
cd $pkgname-$pkgver
./configure --prefix=/usr --disable-static
make
}
check() {
cd $pkgname-$pkgver
# disabled for now:
# https://github.com/libcheck/check/issues/18
# make check
}
package() {
cd $pkgname-$pkgver
make DESTDIR="$pkgdir" install
install -Dm644 COPYING "${pkgdir}/usr/share/licenses/${pkgname}/COPYING"
# install doc - no Makefile target
install -v -dm755 ${pkgdir}/usr/share/doc/libinput
cp -rv doc/html/* ${pkgdir}/usr/share/doc/libinput
}