From acd737646ac833463bd25642f2d83094487dc40e Mon Sep 17 00:00:00 2001 From: Kevin Mihelich Date: Sun, 23 Apr 2017 22:11:40 +0000 Subject: [PATCH] added extra/libinput --- ...e-the-pressure-range-to-a-hwdb-entry.patch | 248 ++++++++++++++++++ ...sed-input-device-detection-without-d.patch | 33 +++ ...t-for-I2C-Elan-touchpads-without-dmi.patch | 34 +++ ...gh-pressure-value-for-Elantech-touch.patch | 38 +++ extra/libinput/PKGBUILD | 60 +++++ 5 files changed, 413 insertions(+) create mode 100644 extra/libinput/0001-touchpad-move-the-pressure-range-to-a-hwdb-entry.patch create mode 100644 extra/libinput/0002-udev-Add-name-based-input-device-detection-without-d.patch create mode 100644 extra/libinput/0003-udev-Add-support-for-I2C-Elan-touchpads-without-dmi.patch create mode 100644 extra/libinput/0004-udev-Decrease-high-pressure-value-for-Elantech-touch.patch create mode 100644 extra/libinput/PKGBUILD diff --git a/extra/libinput/0001-touchpad-move-the-pressure-range-to-a-hwdb-entry.patch b/extra/libinput/0001-touchpad-move-the-pressure-range-to-a-hwdb-entry.patch new file mode 100644 index 000000000..776f76b69 --- /dev/null +++ b/extra/libinput/0001-touchpad-move-the-pressure-range-to-a-hwdb-entry.patch @@ -0,0 +1,248 @@ +From c48c84a47ae45db3591d99237b72f9ac3b84de48 Mon Sep 17 00:00:00 2001 +From: Peter Hutterer +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 +--- + 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 + diff --git a/extra/libinput/0002-udev-Add-name-based-input-device-detection-without-d.patch b/extra/libinput/0002-udev-Add-name-based-input-device-detection-without-d.patch new file mode 100644 index 000000000..4372c6b2d --- /dev/null +++ b/extra/libinput/0002-udev-Add-name-based-input-device-detection-without-d.patch @@ -0,0 +1,33 @@ +From a96753126be75ef8aee5035ad5be2df36e617877 Mon Sep 17 00:00:00 2001 +From: Paul Kocialkowski +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 +--- + 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: ++KERNELS=="input*", \ ++ IMPORT{builtin}="hwdb 'libinput:name:$attr{name}'" ++ + LABEL="libinput_model_quirks_end" +-- +2.12.2 + diff --git a/extra/libinput/0003-udev-Add-support-for-I2C-Elan-touchpads-without-dmi.patch b/extra/libinput/0003-udev-Add-support-for-I2C-Elan-touchpads-without-dmi.patch new file mode 100644 index 000000000..33010ce24 --- /dev/null +++ b/extra/libinput/0003-udev-Add-support-for-I2C-Elan-touchpads-without-dmi.patch @@ -0,0 +1,34 @@ +From 7137ea7c201c1f3d7f7c2feb749f5c311ee6ea6c Mon Sep 17 00:00:00 2001 +From: Paul Kocialkowski +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 +--- + 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 + diff --git a/extra/libinput/0004-udev-Decrease-high-pressure-value-for-Elantech-touch.patch b/extra/libinput/0004-udev-Decrease-high-pressure-value-for-Elantech-touch.patch new file mode 100644 index 000000000..cdcbe9fa9 --- /dev/null +++ b/extra/libinput/0004-udev-Decrease-high-pressure-value-for-Elantech-touch.patch @@ -0,0 +1,38 @@ +From 424058c86ef56a80fc9723e0afd1695681a145b8 Mon Sep 17 00:00:00 2001 +From: Paul Kocialkowski +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 +--- + 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 + diff --git a/extra/libinput/PKGBUILD b/extra/libinput/PKGBUILD new file mode 100644 index 000000000..071d5fb88 --- /dev/null +++ b/extra/libinput/PKGBUILD @@ -0,0 +1,60 @@ +# $Id$ +# Maintainer: Andreas Radke +# Maintainer: Jan de Groot + +# ALARM: Kevin Mihelich +# - 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) + +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 +}