J'utilise Kubuntu 15.10 sur un HP Spectre x360, doté d'un numériseur non-Wacom actif intégré à l'écran. J'utilise un stylet à deux boutons avec cela, mais le deuxième bouton ne fonctionne pas. Je ne pouvais pas obtenir xinput
pour montrer un changement d'état lorsque le bouton est enfoncé; il semble que X ne peut pas le voir du tout. evtest
voit un événement, mais indique le bouton sous la forme BTN_TOOL_RUBBER
au lieu du BTN_STYLUS2
approprié:
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 ------------
Le stylet n'a pas de pointe de gomme. input-kbd
me donne les scancodes et montre le même problème:
/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
Essayer d'utiliser input-kbd
pour assigner une nouvelle carte donne une erreur "scancode out of range". Le simple setkeycodes d003c 332
ne fonctionne pas non plus (bug du clavier USB).
Mise à jour: j'ai essayé de résoudre ce problème via udev en ajoutant un fichier hwdb personnalisé à /etc/udev/hwdb.d, mais cela ne semble pas avoir d'effet.
$ 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
Qu'est-ce que j'ai mal fait ici, ou bien quelle est la meilleure façon de faire cela?
J'ai finalement pu remapper le scancode en BTN_STYLUS2
en utilisant ir-keytable
. La commande était:
Sudo ir-keytable --device /dev/input/event8 --set-key 0xd003c=BTN_STYLUS2
TOUTEFOIS, alors que je pouvais voir que le scancode avait été rebondi avec succès, le bouton restait mort. evtest
ne signalait plus aucun événement lorsque le bouton était enfoncé.
Avant cela, il n'y avait pas d'événement MSC_SCAN
signalé par evtest
lorsque ce bouton était enfoncé, bien que des scancodes aient été signalés pour l'autre bouton et pour le toucher du stylet. Cela ne m'a pas semblé plus qu'une bizarrerie bizarre à l'époque, mais maintenant, il semble que le bouton ne génère vraiment aucun scancode. Comment evtest
a-t-il signalé un événement de code clé, alors? Cela me bat, et à ce stade, je le jette sur un bogue du noyau.
En fin de compte, je viens de combiner un script bash pour regarder les événements evtest
et BTN_TOOL_RUBBER
et simuler un clic droit avec 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
Cela me donne essentiellement la fonctionnalité de base que je souhaitais de toute façon. Ce n'est pas parfait: l'événement mouseup ne se produit que lorsque le stylo quitte la proximité, pas lorsque le bouton est relâché (c'est lorsque l'événement de raccourci BTN_TOOL_RUBBER
est signalé dans evtest
), mais cela fonctionne suffisamment bien. que je ne vais pas essayer de déboguer le noyau.