touches de remappage dur du clavier?

19

J'essaie de trouver un moyen de remapper les touches du clavier avec force.
J'ai essayé d'utiliser xmodmap et setxkbmap, mais ils ne fonctionnent pas pour une application spécifique. Ces commandes fonctionnent pour d'autres applications / fenêtres normales sur X tho.

Je pense que l'application peut lire les données brutes du clavier et ignorer l'entrée X?

Alors, comment remapper des clés sans utiliser xmodmap et setxkbmap? s'il est possible de le faire à l'aide d'un logiciel.

J'ai également essayé xkeycaps, xkbcomp, mais je n'ai pas essayé les clés de charge, car il fonctionne sur X.

J'ai trouvé ici que je pouvais essayer setkeycodes, "car après avoir assigné le code clé du noyau, le bouton devrait fonctionner dans xorg" , mais j'ai aussi trouvé que "vous ne pouvez pas utiliser 'setkeycodes' sur les claviers USB" , c'est mon cas (je suis intéressé par le cas quelqu'un le faire fonctionner sur ps2 car je pense que je pourrais utiliser un adaptateur).

Cela semblait prometteur "Mapper les scancodes aux codes clés" , mais après quelques tests, rien n'a changé, voici:
j'ai trouvé le code clé "36" (touche "j") sur vt1 avec le showkey
scancode "7e" (clavier ".") Sur vt1 avecshowkey --scancodes

$cat >/etc/udev/hwdb.d/90-custom-keyboard.hwdb
keyboard:usb:v*p*
keyboard:dmi:bvn*:bvr*:bd*:svn*:pn*:pvr*
 KEYBOARD_KEY_7e=36
$udevadm hwdb --update #updates file: /lib/udev/hwdb.bin
$udevadm trigger #should apply the changes but nothing happened
$cat /lib/udev/hwdb.bin |egrep "KEYBOARD_KEY_7e.{10}" -ao
KEYBOARD_KEY_7eleftmeta
$#that cat on hwdb.bin did not change after the commands..

Obs .: n'a pas fonctionné non plus avec: KEYBOARD_KEY_7e=j

D'autres moyens alternatifs (par @ vinc17) pour trouver les clés:
evtest /dev/input/by-id/... ou
input-kbd 3(mettre l'index id trouvé à ls -l /dev/input/by-id/*partir de ex. Event3)

PS .: * Si vous êtes intéressé à vous tester vous-même, le fil associé à l'application est le suivant: http://forums.thedarkmod.com/topic/14266-keyboard-issue-in-new-version-108/ Les problèmes que je ont sont les mêmes: certaines clés (KP_Decimal, DownArrow, UpArrow, RightArrow) sont ignorées et considérées toutes avec la même valeur là "0x00"

Puissance du Verseau
la source
Le fichier mis à jour devrait être /etc/udev/hwdb.bin, non /lib/udev/hwdb.bin. Mais bien que ce fichier soit correctement mis à jour, cela ne fonctionne pas non plus pour moi, même après un redémarrage. Peut-être que quelque chose manque dans la documentation. À propos de ceci: bugs.freedesktop.org/show_bug.cgi?id=82311
vinc17
@ vinc17 qui est vraiment intéressant, dès que je pourrai je vais réessayer, je pense que nous devons trouver ce fichier de paramètres et essayer de l'imiter, merci!
Aquarius Power
1
Mon problème était dû au fait que les lignes KEYBOARD_KEY_ ont commencé avec 2 espaces au lieu d'un seul (cela n'a pas été documenté et je n'ai reçu aucun message d'erreur!). Je ne sais pas pour vous, mais avec mon clavier USB, showkey --scancodesne donne pas les scancodes que udev attend (les valeurs sont différentes); l' input-kbdutilitaire donne les scancodes corrects.
vinc17
1
L' evtestutilitaire devrait également vous donner les scancodes corrects: après avoir tapé une clé, vous devriez obtenir 2 lignes et la première devrait se terminer par quelque chose de la forme code 4 (MSC_SCAN), value xxx, où xxxest le scancode. Mais le pilote de mon clavier est bogué, et je n'ai pas cette MSC_SCANligne pour certaines touches que je voulais remapper. C'est pourquoi j'ai utilisé input-kbd, qui répertorie tous les scancodes pour le périphérique sélectionné.
vinc17
1
J'ai publié des informations détaillées dans une réponse. Maintenant, je ne suis pas sûr que 36 ou 7002c fonctionne comme une valeur. Je pense que vous avez besoin de l'identifiant du code clé. Voir ma réponse.
vinc17

Réponses:

17

Trouvez d'abord le scancode de la clé qui doit être remappée, par exemple avec l' evtestutilitaire. Une ligne comme la suivante (avec MSC_SCANen elle) doit être sortie:

Event: time 1417131619.686259, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70068

suivi d'un second donnant le code clé actuel. Si aucune MSC_SCANligne n'est sortie, cela est dû à un bug du pilote du noyau, mais le scancode peut toujours être trouvé avec l' input-kbdutilitaire; evtestdevrait avoir donné le code clé, de sorte qu'il devrait être facile de trouver la ligne correspondante dans la input-kbdsortie (par exemple en utilisant grep).

Une fois les scancodes des clés à remapper déterminés, créez un fichier tel que /etc/udev/hwdb.d/98-custom-keyboard.hwdbcontenant les remappages. Le début du fichier /lib/udev/hwdb.d/60-keyboard.hwdbdonne quelques informations. Dans mon cas (qui fonctionne), j'ai:

evdev:input:b0003v05ACp0221*
 KEYBOARD_KEY_70035=102nd       # Left to z: backslash bar
 KEYBOARD_KEY_70064=grave       # Left to 1: grave notsign
 KEYBOARD_KEY_70068=insert      # F13: Insert

(Avant udev 220, je devais utiliser keyboard:usb:v05ACp0221*pour la première ligne.)

La evdev:chaîne doit être au début de la ligne. Notez que les lettres du fournisseur et de l'ID de produit doivent être en majuscules. Chaque KEYBOARD_KEY_paramètre doit avoir exactement un espace avant (note: une ligne sans espaces donnera un message d'erreur, et une ligne avec deux espaces était silencieusement ignorée avec les anciennes versions d'udev). KEYBOARD_KEY_est suivi du scancode en hexadécimal (comme ce que les deux evtestet input-kbddonner). Des valeurs valides pourraient être obtenues à partir de la evtestsortie ou de la input-kbdsortie, ou même du /usr/include/linux/input.hfichier: par exemple, KEY_102NDdonnerait 102nd(en supprimant KEY_et en convertissant en minuscules), que j'ai utilisé ci-dessus.

Une fois le fichier enregistré, tapez:

udevadm hwdb --update

pour (re) construire la base de données /etc/udev/hwdb.bin(vous pouvez vérifier son horodatage). Alors,

udevadm trigger --sysname-match="event*"

prendra en compte les nouveaux paramètres. Vous pouvez vérifier avec evtest.

En 2014, le udev publié contenait des informations incomplètes / bogues /lib/udev/hwdb.d/60-keyboard.hwdb, mais vous pouvez consulter la dernière version de développement du fichier et / ou mon rapport de bogue et une discussion concernant la documentation et les problèmes d'espacement.

Si cela ne fonctionne pas, le problème peut être détecté après une augmentation temporaire du niveau de journalisation de udevdwith udevadm control(voir la page de manuel udevadm (8) pour plus de détails).

Pour les anciennes udevversions telles que 204, cette méthode devrait toujours fonctionner.

vinc17
la source
Lorsque j'exécute les commandes udevadm, le fichier qui est mis à jour est /lib/udev/hwdb.bin, j'ai regardé avec blesset KEYBOARD_KEY_70085apparaît à sa fin. Je pense que Ubuntu 14.04 est configuré (protégé?) De cette façon. J'ai essayé udevadm control --log-priority=debug. basé sur lsusb(045e: 0750) mon clavier ressemble keyboard:usb:v045ep0750*, mais j'ai aussi essayé avec keyboard:usb:v*p*. Je suppose que cela /etc/udev/hwdb.bindevrait être mis à jour mais n'existe même pas.
Aquarius Power
Comme je l'ai lu ici, cela pourrait être comme si j'utilisais cette commande udevadm hwdb --usr --update, malgré que je n'étais pas.
Aquarius Power
Après udevadm hwdb --updateje copiais /lib/udev/hwdb.binà /etc/udev/hwdb.binet RAN strace udevadm trigger --sysname-match="event*"et le fichier hwdb.binne paraît pas avoir été lu par (si elle est comme ça fonctionne).
Aquarius Power
1
@AquariusPower Oui, il peut y avoir un bogue spécifique à Ubuntu (j'utilise Debian / unstable). Pour voir si la base de données est lue lors de cette opération udevadm trigger ..., consultez mon test ici . Notez qu'avant d'exécuter udevadm trigger ..., vous devez vous assurer que l'heure de modification du fichier a été mise à jour, sinon l'heure d'accès ne sera pas mise à jour lors de la lecture du fichier.
vinc17
1
@AquariusPower udevadm --version: 215 (et version du paquet udev: 215-7). Merci à udevadm trigger ..., vous ne devriez pas avoir besoin de redémarrer (sauf si vous souhaitez supprimer les paramètres, AFAIK). Mais vous voudrez peut-être essayer un redémarrage pour voir s'il y a un effet.
vinc17