Как исправить эту неправильную кнопку стилуса?
Я использую Kubuntu 15.10 на HP Specter x360, в котором встроен активный дигитайзер не Wacom. Я использую стилус с двумя кнопками, но вторая кнопка не работает. Я не мог получить xinput
показать любое изменение состояния при нажатии кнопки; Кажется, Х вообще не видит этого. evtest
видит событие, но сообщает о кнопке как BTN_TOOL_RUBBER
вместо соответствующего BTN_STYLUS2
:
Input driver version is 1.0.1
Input device ID: bus 0x3 vendor 0x4f3 product 0x2073 version 0x110
Input device name: "ELAN Touchscreen Pen"
Supported events:
Event type 0 (EV_SYN)
Event type 1 (EV_KEY)
Event code 256 (BTN_0)
Event code 320 (BTN_TOOL_PEN)
Event code 321 (BTN_TOOL_RUBBER)
Event code 330 (BTN_TOUCH)
Event code 331 (BTN_STYLUS)
Event type 3 (EV_ABS)
Event code 0 (ABS_X)
Value 23080
Min 0
Max 32256
Resolution 110
Event code 1 (ABS_Y)
Value 10408
Min 0
Max 17920
Resolution 108
Event code 24 (ABS_PRESSURE)
Value 0
Min 0
Max 255
Event type 4 (EV_MSC)
Event code 4 (MSC_SCAN)
Properties:
Testing ... (interrupt to exit)
Event: time 1453608432.242049, type 1 (EV_KEY), code 321 (BTN_TOOL_RUBBER), value 1
Event: time 1453608432.242049, -------------- SYN_REPORT ------------
Стилус не имеет ластика. input-kbd
дает мне сканкоды и показывает ту же проблему:
/dev/input/event8
bustype : BUS_USB
vendor : 0x4f3
product : 0x2073
version : 272
name : "ELAN Touchscreen Pen"
phys : "usb-0000:00:14.0-4/input0"
uniq : ""
bits ev : EV_SYN EV_KEY EV_ABS EV_MSC
map: 15 keys, size: 294/320
0xd0032 = 320 # BTN_TOOL_PEN
0xd0042 = 330 # BTN_TOUCH
0xd0044 = 331 # BTN_STYLUS
0xd003c = 321 # BTN_TOOL_RUBBER
0xd0045 = 256 # BTN_0
0xd0042 = 330 # BTN_TOUCH
0xd0042 = 330 # BTN_TOUCH
0xd0042 = 330 # BTN_TOUCH
0xd0042 = 330 # BTN_TOUCH
0xd0042 = 330 # BTN_TOUCH
0xd0042 = 330 # BTN_TOUCH
0xd0042 = 330 # BTN_TOUCH
0xd0042 = 330 # BTN_TOUCH
0xd0042 = 330 # BTN_TOUCH
0xd0042 = 330 # BTN_TOUCH
Пытаясь использовать input-kbd
назначение новой карты выдает ошибку "скан-код вне диапазона". Прямой setkeycodes d003c 332
также не работает (ошибка клавиатуры USB).
Обновление: я попытался исправить это с помощью udev, добавив собственный файл hwdb в /etc/udev/hwdb.d, но, похоже, это не дает никакого эффекта.
$ cat /etc/udev/hwdb.d/61-touchscreen-quirks.hwdb
evdev:input:b0003v04f3p2073e0110* # Matches ELAN Touchscreen devices
KEYBOARD_KEY_d003c=14c # Reassigns scancode from BTN_TOOL_RUBBER to BTN_STYLUS2
$ sudo udevadm --debug hwdb --update
calling: hwdb
reading file '/lib/udev/hwdb.d/20-OUI.hwdb'
reading file '/lib/udev/hwdb.d/20-acpi-vendor.hwdb'
reading file '/lib/udev/hwdb.d/20-bluetooth-vendor-product.hwdb'
reading file '/lib/udev/hwdb.d/20-libgphoto2-6.hwdb'
reading file '/lib/udev/hwdb.d/20-net-ifname.hwdb'
reading file '/lib/udev/hwdb.d/20-pci-classes.hwdb'
reading file '/lib/udev/hwdb.d/20-pci-vendor-model.hwdb'
reading file '/lib/udev/hwdb.d/20-sdio-classes.hwdb'
reading file '/lib/udev/hwdb.d/20-sdio-vendor-model.hwdb'
reading file '/lib/udev/hwdb.d/20-usb-classes.hwdb'
reading file '/lib/udev/hwdb.d/20-usb-media-players.hwdb'
reading file '/lib/udev/hwdb.d/20-usb-vendor-model.hwdb'
reading file '/lib/udev/hwdb.d/60-evdev.hwdb'
reading file '/lib/udev/hwdb.d/60-keyboard.hwdb'
reading file '/etc/udev/hwdb.d/61-touchscreen-quirks.hwdb'
reading file '/lib/udev/hwdb.d/69-libmtp.hwdb'
reading file '/lib/udev/hwdb.d/70-mouse.hwdb'
reading file '/lib/udev/hwdb.d/70-pointingstick.hwdb'
=== trie in-memory ===
nodes: 3899920 bytes ( 97498)
children arrays: 1559952 bytes ( 97497)
values arrays: 1241904 bytes ( 77619)
strings: 1721567 bytes
strings incoming: 4005992 bytes ( 240722)
strings dedup'ed: 2347672 bytes ( 177476)
=== trie on-disk ===
size: 6863455 bytes
header: 80 bytes
nodes: 2339952 bytes ( 97498)
child pointers: 1559952 bytes ( 97497)
value pointers: 1241904 bytes ( 77619)
string store: 1721567 bytes
strings start: 5141888
$ sudo udevadm -d control --reload
calling: control
$ sudo udevadm -d trigger /dev/input/event*
calling: trigger
$ sudo udevadm info -q all -p /devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/0003:04F3:2073.0004/input/input9
P: /devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/0003:04F3:2073.0004/input/input9
E: ABS=1000003
E: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/0003:04F3:2073.0004/input/input9
E: EV=1b
E: ID_BUS=usb
E: ID_FOR_SEAT=input-pci-0000_00_14_0-usb-0_4_1_0
E: ID_INPUT=1
E: ID_INPUT_TABLET=1
E: ID_MODEL=Touchscreen
E: ID_MODEL_ENC=Touchscreen
E: ID_MODEL_ID=2073
E: ID_PATH=pci-0000:00:14.0-usb-0:4:1.0
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_4_1_0
E: ID_REVISION=5107
E: ID_SERIAL=ELAN_Touchscreen
E: ID_TYPE=hid
E: ID_USB_DRIVER=usbhid
E: ID_USB_INTERFACES=:030000:
E: ID_USB_INTERFACE_NUM=00
E: ID_VENDOR=ELAN
E: ID_VENDOR_ENC=ELAN
E: ID_VENDOR_ID=04f3
E: KEY=c03 1 0 0 0 0
E: MODALIAS=input:b0003v04F3p2073e0110-e0,1,3,4,k100,140,141,14A,14B,ra0,1,18,m4,lsfw
E: MSC=10
E: NAME="ELAN Touchscreen Pen"
E: PHYS="usb-0000:00:14.0-4/input0"
E: PRODUCT=3/4f3/2073/110
E: PROP=0
E: SUBSYSTEM=input
E: TAGS=:seat:
E: UNIQ=""
E: USEC_INITIALIZED=4595650
Что я сделал не так, или, наоборот, как лучше это сделать?
2 ответа
Я наконец смог переназначить скан-код в BTN_STYLUS2
с помощью ir-keytable
, Команда была:
sudo ir-keytable --device /dev/input/event8 --set-key 0xd003c=BTN_STYLUS2
ОДНАКО, хотя я мог видеть, что скан-код был успешно восстановлен, кнопка осталась мертвой. evtest
больше не сообщалось ни о каком событии, когда кнопка была нажата.
До этого не было MSC_SCAN
событие сообщается evtest
когда эта кнопка была нажата, хотя сообщалось о кодах сканирования для другой кнопки и касания пера. В то время это не показалось мне странной причудой, но теперь кажется, что кнопка действительно не генерирует скан-код. Как evtest
сообщить о событии с кодом ключа вообще? Бьет меня, и на данный момент я исправляю это до ошибки ядра.
В конце концов, я просто собрал bash-скрипт, чтобы посмотреть evtest
за BTN_TOOL_RUBBER
события и имитировать щелчок правой кнопкой мыши с xdotool
:
#!/bin/bash
# Find the input device number.
devicename="ELAN Touchscreen Pen"
numevents=$(ls /dev/input | grep -c event*)
for ((devnr=0;devnr<$numevents;devnr++)); do
input-kbd $devnr | grep -q "$devicename"
if [[ $? == 0 ]]; then
break
fi
done
# Listen for BTN_TOOL_RUBBER events.
evtest /dev/input/event$devnr | while read line; do
for value in {0..1}; do
echo $line | grep -q "type 1 (EV_KEY), code 321 (BTN_TOOL_RUBBER), value $value"
if [[ $? == 0 ]]; then
case $value in
0) xdotool mouseup 3 ;;
1) xdotool mousedown 3 ;;
esac
fi
done
done
Это дает мне, по сути, базовую функциональность, которую я хотел в любом случае Он не идеален: событие mouseup происходит только после того, как ручка покидает близость, а не когда кнопка отпущена (это когда BTN_TOOL_RUBBER
о событии key-up сообщается в evtest
), но это работает достаточно хорошо, поэтому я не собираюсь пытаться отлаживать ядро.
У меня были те же проблемы с моим Surface Pro 3, и я решил их следующим образом:
https://forums.linuxmint.com/viewtopic.php?f=59&t=312005&p=1762496#p1762496
После того, как устройство будет указано в
xsetwacom list device
, вы можете переназначить кнопки с помощью
xsetwacom
легко.
Этому один год, но я хотел сказать, что ваш hwdb
файл почти правильный. Но:
- Правая часть должна быть десятичной, а не шестнадцатеричной, поэтому используйте
332
не14c
, - Левая сторона исходит от
evtest
неinput-kbd
(не спрашивай, потому что я действительно не знаю). Конкретно это изvalue
поле вMSC_SCAN
линия НЕМЕДЛЕННО предшествуетBTN_TOOL_RUBBER
(или каким бы ни был неверно сопоставленный ключ).
В моем случае у меня было:
type 4 (EV_MSC), code 4 (MSC_SCAN), value d0045
Итак, мой полный hwdb
файл:
evdev:input:b0003v04F3p21D0*
KEYBOARD_KEY_d0045=332
sudo udevadm hwdb --update
sudo udevadm trigger /dev/input/event*
- Перезагружать.