Comment get des codes-keys pour xmodmap?

J'essaie d'utiliser xmodmap pour xmodmap touches Alt / Super sur le keyboard Dell L100, et j'ai du mal à get les codes-keys.

Par exemple, utiliser xev ne me donne pas de code 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 la touche Super droite , xev et showkey donnent des codes de touches différents – 134 et 126 respectivement.

Que se passe-t-il avec ces codes-keys?

J'ai essayé d'get des keycodes à partir de showkey -k , et en utilisant le file xmodmap ci-dessous, mais cela a donné une carte étrange qui a remappé b key:

 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 

Il y a beaucoup de joueurs entre votre keyboard et le process qui gère finalement l'événement keyboard. Parmi les principaux éléments du paysage, citons le fait que le système X possède sa propre couche de manipulation de keyboard et X associe différents «codes de touches» avec des keys que ne le fait votre système de base Linux. La command showkey vous montre les codes-keys dans le jargon Linux-base-system. Pour xmodmap vous avez besoin des codes-keys X, qui sont affichés par xev . Tant que vous avez l'intention de travailler dans X et de refaire votre key avec xmodmap , ignorez les showkeys et écoutez ce que xev dit.

Ce que vous voulez searchr 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, XLookupSsortingng gives 0 bytes: XmbLookupSsortingng 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, XLookupSsortingng gives 0 bytes: XFilterEvent returns: False 

xev tendance à générer beaucoup de sortie, surtout lorsque vous déplacez votre souris. Vous devrez peut-être remonter un certain time pour find la sortie que vous searchz. Dans la sortie précédente, on voit que le keysym Alt_L est associé au code keycode 64 .

xev devrait fonctionner

Odd, mon xev donne un événement KeyPress et KeyRelease pour alt (et pour la key 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, XLookupSsortingng gives 0 bytes: XmbLookupSsortingng 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, XLookupSsortingng 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, XLookupSsortingng gives 0 bytes: XmbLookupSsortingng 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, XLookupSsortingng gives 0 bytes: XFilterEvent returns: False 

Je peux voir deux possibilités:

  1. Quelque chose d'autre est complètement en train de manger la touche, ou défocaliser la window sur vous en appuyant sur alt. Essayez d'exécuter xev dans un server X vide (par exemple, exécutez simplement xinit -- :1 , qui devrait vous fournir un server X avec seulement un xterm – il n'y aura même pas de gestionnaire de windows en cours d'exécution. ).
  2. Vous venez de manquer les deux events dans le volume que xev crache.

Un moyen facile, si vous connaissez le nom de la key

Une autre possibilité: il suffit d'get les keycodes 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 les 64 et 108. xmodmap -pm va vous montrer juste la carte des modificateurs, qui vous donne également les numéros (bien que cette fois-ci, en hexadécimal).

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

  1. Pourquoi xev et showkey signalent-ils différents codes-keys pour une key?
  2. Pourquoi xev ne montre-t-il pas que Alt est pressé correctement?
  3. Comment échanger Alt et Win ?

En ce qui concerne la première question: ces jours-ci, où le keyboard «driver» dans X ne conduit pas vraiment le hardware, il pourrait simplement traverser les keycodes du kernel vers le core X, mais ce n'est pas le cas. Il ajoute 8 au keycode avant de le transmettre.

Deuxièmement: Quelque chose dans votre session X attrape l'événement Alt . Les autres réponses couvrent déjà cela. (Ie xev n'obtient pas l'événement que vous aimeriez voir). Le coupable pourrait être lié à votre gestionnaire de window. Essayez une session X plus nue.

Troisièmement: n'utilisez pas xmodmap . Il a été 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 

J'essayais de résoudre ça pour moi et je l'ai juste compris.

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

 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 que les events Focus{In,Out} ont un mode Notify{Grab,Ungrab} . Cela indique qu'une key a été traitée par un autre process (probablement un raccourci / application de binding).

Dans mon cas, il était xbindkeys, mais si vous utilisez un environnement de bureau, ils ont probablement un système de binding. Pour voir ces events, vous devez arrêter / désactiver l'autre programme.

Si vous ne parvenez pas à déterminer le programme qui vole les events keys, la meilleure solution consiste à démarrer une autre session X sans l'exécuter. Exécutez la command suivante pour démarrer une autre session X à l'écran :1 , si elle est déjà prise, augmentez simplement le nombre à la fin. Vous pouvez bien entendu changer le terminal selon ce que vous préférez ou installé sur votre système.

 xinit /usr/bin/xterm -- :1 

Exécutez ensuite xev nouveau. Cela devrait vous donner le résultat sans qu'il soit capturé par d'autres programmes. Notez que le gestionnaire de windows qui démarre est en hover-focus, vous devrez donc placer votre slider au-dessus de la window xev pour que les keys soient capturées.


Comme il a été dit dans cette excellente réponse par dbiousjim , le code key est différent car il y a beaucoup de couches entre xev et le kernel.

En tant que root, exécutez:

 showkey -s 

… pour voir ce que le scancode est pour votre key de 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 key génère deux scancodes. Ce n'est pas une chose keydown / keyup, aussi proche que je pourrais dire du model. Notez l'avertissement, vous pouvez donc l'exécuter en mode mono-user.

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

Ensuite, trouvez un code key inutilisé avec:

 xmodmap -pke | less 

Ici vous pouvez voir le code 97 est inutilisé 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 key X utilise et le code key utilisé par le kernel est OFF BY 8 pour des "raisons historiques". Donc, prenez 97 – 8 = 89 et utilisez 89 avec la command setkeycodes (à nouveau en tant que root):

 # setkeycodes 46 89 

Et vous devriez être réglé. Confirmez avec xev que vous obtenez un Keypress Event avec le code keycode de 97. (bien qu'une fois j'ai dit au file de keys Fluxbox d'utiliser ce keycode, je n'ai plus eu d'évènements KeyPress – peut-être parce que Fluxbox les avale quand il les utilise?)

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

J'ai eu le même problème avec Alt_L disparaissant dans XUbuntu 14.04 ( Alt_R allait bien). Après avoir beaucoup joué, j'ai observé que showkey enregistré la frappe, mais xev ne l'a pas fait: il devait y avoir quelque chose dans le système de la window. J'ai parcouru tous les parameters "Window Manager" et "Window Manager Tweaks", et n'a rien trouvé. Enfin, j'ai trouvé un Alt_L dans la list des raccourcis keyboard (raccourcis keyboard xfce4-keyboard-shortcuts ) dans l'éditeur de parameters. Je "réinitialise" cela, et j'ai mon Alt_L return! Le raccourci Alt_L pas ailleurs que dans l'éditeur de parameters.