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. De telles commandes fonctionnent pour d'autres applications/fenêtres normales sur X.
Je pense que l'application peut lire les données brutes du clavier et ignorer l'entrée X ?
Alors, comment remapper les 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é loadkeys, car il fonctionne sur X.
J'ai trouvé ici que je pouvais essayer setkeycodes
, "parce qu'après avoir attribué le code clé du noyau, le bouton devrait fonctionner dans xorg", mais j'ai également trouvé que "vous ne pouvez pas utiliser 'setkeycodes' sur les claviers USB", c'est mon cas (je suis intéressé au cas où quelqu'un le ferait fonctionner sur ps2 comme Je pense que je pourrais utiliser un adaptateur).
Cela semblait prometteur "Mapper les scancodes sur les codes clés", mais après quelques tests, rien n'a changé, les voici :
J'ai trouvé le code clé "36" (touche "j") à vt1 avec showkey
J'ai trouvé le scancode "7e" (clavier ".") sur vt1 avec showkey --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. :ne fonctionnait pas non plus avec :KEYBOARD_KEY_7e=j
Quelques méthodes alternatives (par @vinc17) pour trouver les clés :evtest /dev/input/by-id/...
ouinput-kbd 3
(mettre l'index d'id trouvé à ls -l /dev/input/by-id/*
de l'ex. événement3)
PS. :* Si vous souhaitez vous tester, le fil de discussion associé à l'application est le suivant :http://forums.thedarkmod.com/topic/14266-keyboard-issue-in-new-version-108/ 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 en "0x00"
Réponse acceptée :
Trouvez d'abord le scancode de la clé qui doit être remappée, par ex. avec le evtest
utilitaire. Une ligne comme la suivante (avec MSC_SCAN
dedans) doit être affiché :
Event: time 1417131619.686259, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70068
suivi d'un second indiquant le code clé actuel. Si aucun MSC_SCAN
est sortie, cela est dû à un bogue du pilote du noyau, mais le scancode peut toujours être trouvé avec le input-kbd
utilitaire; evtest
aurait dû donner le code de la clé, afin qu'il soit facile de trouver la ligne correspondante dans le input-kbd
sortie (par exemple en utilisant grep
).
Une fois les scancodes des touches à remapper déterminés, créez un fichier tel que /etc/udev/hwdb.d/98-custom-keyboard.hwdb
contenant les remappages. Le début du fichier /lib/udev/hwdb.d/60-keyboard.hwdb
donne 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.)
Le evdev:
La chaîne doit être au début de la ligne.
Notez que les lettres du fournisseur et de l'identifiant du produit doivent être en majuscules.
Chaque KEYBOARD_KEY_
les paramètres doivent avoir exactement un espace avant (remarque :une ligne sans espace donnera un message d'erreur, et une ligne avec deux espaces était silencieuse ignoré avec les anciennes versions d'udev). KEYBOARD_KEY_
est suivi du scancode en hexadécimal (comme ce que font les deux evtest
et input-kbd
donner). Des valeurs valides peuvent être obtenues à partir de l'evtest
sortie ou le input-kbd
sortie, ou même depuis le /usr/include/linux/input.h
fichier :par exemple, KEY_102ND
donnerait 102nd
(en supprimant KEY_
et conversion en minuscules), que j'ai utilisé ci-dessus.
Une fois le fichier enregistré, saisissez :
udevadm hwdb --update
pour (re)construire la base de données /etc/udev/hwdb.bin
(vous pouvez vérifier son horodatage). Ensuite,
udevadm trigger --sysname-match="event*"
prendra en compte les nouveaux paramètres. Vous pouvez vérifier avec evtest
.
En 2014, l'udev publié avait des informations incomplètes/buguées dans /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 la discussion concernant la documentation et les problèmes d'espacement.
Si cela ne fonctionne pas, le problème peut être trouvé après avoir temporairement augmenté le niveau de journalisation de udevd
avec udevadm control
(voir la page de manuel udevadm(8) pour plus de détails).
Pour l'ancien udev
versions telles que 204, cette méthode devrait toujours fonctionner.