Remappage de clés générant plusieurs codes de balayage

33

J'ai un ThinkPad W540. Sur son clavier, il y a quatre touches multimédia au-dessus du pavé numérique. Deux de ces clés génèrent des codes clés (et, apparemment, des scancodes) qui correspondent à une combinaison de clés, Win_L+ Let Win_L+ E. En d'autres termes, pour la clé générant Win_L+ L,
showkey --scancodesrenvoie ceci:

0xe0 0x5b 0x26 0xa6 0xe0 0xdb

La setkeycodescommande nécessite soit des séquences non codées sur un seul octet, soit des séquences échappées de deux octets pour indiquer les codes de balayage et showkeyme donne bien plus que cela. Par conséquent, je ne peux pas vraiment mapper cette clé sur l'un des codes de clé libres de mon système setkeycodes <scancode> <keycode>.

J'apprécierais vraiment toutes les astuces permettant de remapper cette touche sur une autre fonction qui ne duplique pas simplement l'une des combinaisons de touches existantes sur mon clavier.

moonwalker
la source
1
Vous voudrez peut-être jeter un coup d'œil à ceci: Touches de raccourci indépendantes de la disposition du clavier
terdon
1
Je pense que cela peut être délicat: du moins sur les Thinkpads plus anciens, ce type de mappage est effectué par le contrôleur intégré, et non par le système d'exploitation.
mirabilos
1
J'ai un clavier multimédia Microsoft Tout-en-un qui présente le même problème. Avez-vous pu trouver une solution?
osolmaz
5
J'ai fait quelque chose de similaire sur un Thinkpad t61 il y a quelque temps en mappant les touches à l'aide /etc/acpi/events de l' acpidemballage et en définissant simplement une action lorsque ces touches de fonction étaient enfoncées.
Cesar
2
Avez-vous le programme d'installation Win_L en tant que modificateur dans X-windows? C'est par défaut pour moi.
mcr

Réponses:

1

Vous pouvez le faire en deux étapes:

  1. attraper des combinaisons de touches
  2. simuler la frappe de différentes touches.

Vous pouvez utiliser xchainkeyspour 1. et [xdotool][2]pour 2 .:

Pour créer la nouvelle clé simulée avec xdotool, l'option --clearmodifiersde keypeut être importante pour neutraliser le modificateur d'origine simulé, appuyez sur:

xdotool key --clearmodifiers Shift+a

Cela devrait taper une capitale Acomme test.

Dans la configuration de xchainkeysin ~/.config/xchainkeys/xchainkeys.conf, nous pouvons lier la commande à une combinaison de touches:

W-l :exec xdotool key --clearmodifiers Shift+a

Maintenant, la combinaison de touches Winet l( Wingauche ou droite font la même chose), ainsi que la clé qui génère Win_L + L, devrait créer un capital A.

(Il existe de nombreux autres programmes disponibles pour les deux parties. Pour le premier, on pourrait utiliser la configuration des touches de raccourci d'un environnement de bureau, mais je préfère le garder indépendant des DE.)

Volker Siegel
la source
2
Le problème avec cette solution, si je ne me trompe pas, serait le même que d'utiliser simplement ladite combinaison de touches pour déclencher une action - cette action ne serait pas déclenchée uniquement par cette touche, en appuyant sur la combinaison de touches qui génère la même les codes donneraient également le même résultat. En d'autres termes, cela ne satisfait pas la condition "remapper cette clé à une autre chose qui ne duplique pas simplement l'une des combinaisons de clés existantes". Mais j'apprécie l'effort.
moonwalker
3
Oui, c'est vrai - je ne savais pas trop ce que vous entendiez par cette phrase, maintenant je comprends. Mais il semble que votre clé produise les deux codes de clé dans le matériel (c'est-à-dire dans le micrologiciel du clavier). Je ne vois donc aucune guerre autour de vous, sauf que vous détectez le minutage des appuis artificiels "modificateur inactif", "autre clé", "modificateur jusqu'à". Hmm ... peut-être qu'une solution impliquant de la soudure est plus simple;)
Volker Siegel
1
@ Moonwalker Pouvez-vous essayer de remapper Win_L à la place de l'autre clé et vérifier s'il remappe également le modificateur de l'autre?
Volker Siegel
1
euh, ne perdrais-je pas des combinaisons comme Win_L + R, Win + Break, Win + L, Win + etc. dans ce cas?
moonwalker
1
Non je ne pense pas. Win-L est Win-Shift-lMais vous pouvez aussi mapper des chaînes de combinaisons de touches à une commande. Comme Win-aet après ça b. Sans le Win-a, bse comporte normalement. C'est de loin la caractéristique la plus utile xchainkeyset assez unique, je pense.
Volker Siegel
-2

C’est ce que j’ai fait sur mon Thinkpad Yoga afin de relier la clé antislash / pipe à la bonne clé. Parce que pour une raison quelconque, chaque machine virtuelle Linux a interprété la clé de barre oblique inversée \ pipe (\ |) comme la clé inférieure à (<).

Exécutez d'abord la commande: xev

Appuyez sur la touche désirée pour obtenir le code de la touche que vous souhaitez relier:

Sortie d'événement xev KeyPress

Dans cet exemple, le code d'activation est 94 et l'action est "less" mais nous voulons qu'il ait l'action de barre oblique inversée et de barre, aka "pipe".

Remappez le code clé 94 sur la barre oblique inversée et la barre de code aka "tuyau":

xmodmap -e 'keycode 94 = backslash bar'

Maintenant rendons cela persistant:

xmodmap -pke | egrep "backslash|bar" | grep 94 > ~/.Xmodmap`

Renvoie ce qui suit dans le fichier ~/.Xmodmap:

keycode  94 = backslash bar backslash bar

Ensuite, vous devez créer le fichier suivant pour le rendre persistant:

echo "xmodmap .Xmodmap" > ~/.xinitrc
Kentgrav
la source
1
La barre oblique inversée / clé de canal génère un code d'analyse unique. Le sujet concerne le remappage de clés générant plusieurs codes d'analyse.
moonwalker