web-dev-qa-db-fra.com

Comment obtenir des codes clés pour xmodmap?

J'essaie d'utiliser xmodmap pour remapper Alt / Super sur le clavier Dell L100 et rencontrez des difficultés pour obtenir les codes de touche.

Par exemple, l'utilisation de xev ne me donne pas de code clé pour Alt

FocusOut event, serial 36, synthetic NO, window 0x4a00001,
    mode NotifyGrab, detail NotifyAncestor

FocusIn event, serial 36, synthetic NO, window 0x4a00001,
    mode NotifyUngrab, detail NotifyAncestor

KeymapNotify event, serial 36, synthetic NO, window 0x0,
    keys:  122 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
           0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   

Pour Right Super , xev et showkey donnent des codes clés différents - 134 et 126 respectivement.

Que se passe-t-il avec ces codes clés?

J'ai essayé d'obtenir des codes clés à partir de showkey -k, et en utilisant le fichier xmodmap ci-dessous, mais cela a donné une carte étrange qui a remappé b clé:

clear Mod1
clear Control
keycode 125 = Meta_L
keycode 126 = Meta_R
keycode 58 = Control_L
keycode 56 = Control_L
keycode 100 = Control_R
add Control = Control_L Control_R
add Mod1 = Meta_L Meta_R
83
Yaroslav Bulatov

Il y a beaucoup de joueurs entre votre clavier et le processus qui gère finalement l'événement clavier. Parmi les éléments majeurs du paysage, il y a le fait que le système X possède sa propre couche de gestion des claviers, et X associe différents "codes-clés" aux touches que votre système de base Linux. La commande showkey vous montre les codes clés dans le jargon du système de base Linux. Pour xmodmap, vous avez besoin des codes X, qui sont ce que xev affiche. Tant que vous prévoyez de travailler dans X et de faire votre reliure de clé avec xmodmap, alors, ignorez showkeys et écoutez simplement ce que xev dit.

Ce que vous voulez rechercher dans votre sortie xev sont des blocs comme celui-ci:

KeyPress event, serial 27, synthetic NO, window 0x1200001,
    root 0x101, subw 0x0, time 6417361, (340,373), root:(342,393),
    state 0x0, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 27, synthetic NO, window 0x1200001,
    root 0x101, subw 0x0, time 6417474, (340,373), root:(342,393),
    state 0x8, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

xev a tendance à générer beaucoup de sortie, surtout lorsque vous déplacez votre souris. Vous devrez peut-être faire défiler un certain temps pour trouver la sortie que vous recherchez. Dans la sortie précédente, nous voyons que le keysym Alt_L est associé au code clé X 64.

59
dubiousjim

xev devrait fonctionner

Bizarrement, mon xev donne un événement KeyPress et KeyRelease pour alt (et pour la touche Windows, ici appelé "super"):

KeyPress event, serial 40, synthetic NO, window 0xae00001,
    root 0x2ca, subw 0x0, time 595467354, (98,77), root:(102,443),
    state 0x10, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 40, synthetic NO, window 0xae00001,
    root 0x2ca, subw 0x0, time 595467453, (98,77), root:(102,443),
    state 0x18, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

Et celui de droite:

KeyPress event, serial 40, synthetic NO, window 0xae00001,
    root 0x2ca, subw 0x0, time 595572876, (75,33), root:(79,399),
    state 0x10, keycode 108 (keysym 0xffea, Alt_R), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 40, synthetic NO, window 0xae00001,
    root 0x2ca, subw 0x0, time 595572972, (75,33), root:(79,399),
    state 0x18, keycode 108 (keysym 0xffea, Alt_R), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

Je peux voir deux possibilités:

  1. Quelque chose d'autre mange complètement la touche ou défocale la fenêtre lorsque vous appuyez sur alt. Essayez d'exécuter xev sur un serveur X autrement vide (par exemple, exécutez simplement xinit -- :1, qui devrait vous procurer un serveur X avec seulement un xterm - il n'y aura même pas de gestionnaire de fenêtres en cours d'exécution. Quitter xterm fermera la session).
  2. Vous venez de manquer les deux événements dans la masse que crache xev.

Un moyen simple, si vous connaissez le nom de la clé

Autre possibilité: récupérez simplement les codes clés de xmodmap:

anthony@Zia:~$ xmodmap -pk | grep -i alt
     64         0xffe9 (Alt_L)  0xffe7 (Meta_L) 0xffe9 (Alt_L)  0xffe7 (Meta_L)
    108         0xffea (Alt_R)  0xffe8 (Meta_R) 0xffea (Alt_R)  0xffe8 (Meta_R)
    204         0x0000 (NoSymbol)       0xffe9 (Alt_L)  0x0000 (NoSymbol)       0xffe9 (Alt_L)
anthony@Zia:~$ xmodmap -pk | grep -i super
    133         0xffeb (Super_L)        0x0000 (NoSymbol)       0xffeb (Super_L)
    134         0xffec (Super_R)        0x0000 (NoSymbol)       0xffec (Super_R)
    206         0x0000 (NoSymbol)       0xffeb (Super_L)        0x0000 (NoSymbol)       0xffeb (Super_L)

Il y a encore le 64 et le 108. xmodmap -pm ne vous montrera que la carte des modificateurs, qui vous donne également les chiffres (bien que, cette fois, en hexadécimal).

26
derobert

Je "détecte" trois problèmes dans votre question:

  1. Pourquoi xev et showkey signalent des codes clés différents pour une clé?
  2. Pourquoi xev ne s'affiche pas Alt être pressé correctement?
  3. Comment échanger Alt et Win?

En ce qui concerne première question: ces jours-ci, où le "pilote" du clavier dans X ne pilote pas vraiment le matériel, il pourrait simplement transmettre les codes clés du noyau au noyau X, mais il ne le fait pas '' t. Il ajoute 8 au code clé avant de le transmettre.

Second: Quelque chose dans votre session X saisit le Alt un événement. Les autres réponses couvrent déjà cela. (C'est-à-dire xev n'obtient pas l'événement que vous souhaitez voir). Le coupable pourrait être lié à votre gestionnaire de fenêtres. Essayez une session X plus nue.

Troisième: N'utilisez pas xmodmap. Il est dépassé depuis une décennie. Les nouveaux gars sont XKB et son outil setxkbmap.

$ setxkbmap -query
rules:      evdev
model:      pc105
layout:     us
variant:    altgr-intl
options:    caps:backspace

Pour échanger Alt et Win il existe déjà une option préparée dans XKB. Ajoutez-le simplement:

$ setxkbmap -option altwin:swap_alt_win
$ setxkbmap -query
rules:      evdev
model:      pc105
layout:     us
variant:    altgr-intl
options:    altwin:swap_alt_win,caps:backspace
17
Robert Siemer

J'essayais de résoudre cela par moi-même et je viens de le comprendre.

Le problème principal est que vous n'obtenez pas l'événement pour la touche. En regardant le journal que vous avez publié, la raison est apparente.

FocusOut event, serial 36, synthetic NO, window 0x4a00001,
    mode NotifyGrab, detail NotifyAncestor

FocusIn event, serial 36, synthetic NO, window 0x4a00001,
    mode NotifyUngrab, detail NotifyAncestor

KeymapNotify event, serial 36, synthetic NO, window 0x0,
    keys:  122 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
           0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   

Vous pouvez voir le Focus{In,Out} les événements ont un mode de Notify{Grab,Ungrab}. Cela indique qu'une clé a été gérée par un autre processus (probablement une application de raccourci/raccourci clavier).

Dans mon cas, c'était xbindkeys, mais si vous utilisez un environnement de bureau, ils ont probablement un système de liaison de touches. Pour voir ces événements est xev, vous devrez arrêter/désactiver l'autre programme.

Si vous ne pouvez pas déterminer quel programme vole les événements clés, la meilleure solution consiste à démarrer une autre session X sans l'exécuter. Exécutez la commande suivante pour démarrer une autre session X sur l'écran :1, si c'est déjà pris, augmentez simplement le nombre à la fin. Vous pouvez bien sûr changer le terminal selon ce que vous préférez ou avez installé sur votre système.

xinit /usr/bin/xterm -- :1

Ensuite, exécutez à nouveau xev. Cela devrait vous donner le résultat sans qu'il soit capturé par d'autres programmes. Notez que le gestionnaire de fenêtres qui démarre est en survol, vous devrez donc placer votre curseur au-dessus de la fenêtre xev pour que les clés soient capturées.


Comme cela a été dit dans cette excellente réponse de dubiousjim , le keycode est différent car il y a beaucoup de couches entre xev et le noyau.

12
Kevin Cox

En tant que root, exécutez:

showkey -s

... pour voir quel est le scancode pour votre clé mystère. J'ai quelque chose comme ça:

# showkey -s
kb mode was RAW
[ if you are trying this under X, it might not work
since the X server is also reading /dev/console ]

press any key (program terminates 10s after last keypress)...

0xc6 
0x46 0xc6 
0xc6 
0x46 0xc6 
0x46 

Je ne sais pas pourquoi il semble qu'une clé génère deux scancodes. Ce n'est pas une chose keydown/keyup, pour autant que je sache d'après le motif. Notez l'avertissement, vous voudrez peut-être l'exécuter en mode mono-utilisateur.

J'ai deviné que 0x46 était mon scancode.

Ensuite, trouvez un code clé inutilisé avec:

xmodmap -pke | less

Ici, vous pouvez voir que le code clé 97 n'est pas utilisé sur mon système:

keycode  94 = less greater less greater bar brokenbar
keycode  95 = F11 XF86Switch_VT_11 F11 XF86Switch_VT_11
keycode  96 = F12 XF86Switch_VT_12 F12 XF86Switch_VT_12
keycode  97 =
keycode  98 = Katakana NoSymbol Katakana
keycode  99 = Hiragana NoSymbol Hiragana

Le code de clé utilisé par X et le code de clé utilisé par le noyau sont désactivés par 8 pour des "raisons historiques". Prenez donc 97 - 8 = 89 et utilisez 89 avec la commande setkeycodes (à nouveau en tant que root):

# setkeycodes 46 89

Et vous devriez être prêt. Confirmez avec xev que vous obtenez un événement Keypress avec le code clé de 97. (bien qu'une fois que j'ai dit au fichier de clés Fluxbox d'utiliser ce code clé, je n'ai plus reçu d'événements KeyPress - peut-être parce que Fluxbox les avale lorsqu'il les utilise?)

Notez que le 'setkeycodes' ne survivra pas à un redémarrage, vous devrez donc l'ajouter à vos scripts d'initialisation (par exemple dans /etc/rc.local)

11
Greg

J'ai eu le même problème avec la disparition de Alt_L Dans XUbuntu 14.04 (Alt_R Allait bien). Après beaucoup de jeu, j'ai remarqué que showkey enregistrait la frappe, mais xev ne le faisait pas --- cela devait être quelque chose dans le système de fenêtres. J'ai parcouru tous les paramètres "Window Manager" et "Window Manager Tweaks", et je n'ai rien trouvé. Enfin, j'ai trouvé un Alt_L Errant dans la liste des raccourcis clavier (xfce4-keyboard-shortcuts) Dans l '"Éditeur de paramètres". Je "réinitialise" cela et je récupère mon Alt_L! Le raccourci erroné Alt_L N'apparaît nulle part ailleurs que dans "l'Éditeur de paramètres".

4
Paul Price