Xmodmap

De ArchwikiFR


Xmodmap est un utilitaire de Xorg permettant de modifier la disposition des touches des clavier et les fonctions des touches d'autres périphériques tels que les souris. À chaque touche, le noyau associe un "keycode", et à la plupart de ceux-ci une action. Sous X, xmodmap permet de modifier ces actions, voire d'en affecter une si des touches sont inactives.

Installation

Le nom du paquet à installer est xorg-xmodmap.

pacman -S xorg-xmodmap

Explications

La commande suivante permet d'afficher la disposition actuelle de votre clavier

$ xmodmap -pke

<pre<noinclude></noinclude> style="white-space: pre-wrap; overflow-x: auto; border-top: none; margin-top: 0">... keycode 22 = BackSpace Terminate_Server BackSpace Terminate_Server keycode 23 = Tab ISO_Left_Tab Tab ISO_Left_Tab keycode 24 = a A a A ae AE ae AE keycode 25 = z Z z Z acircumflex Acircumflex acircumflex Acircumflex keycode 26 = e E e E EuroSign cent EuroSign cent keycode 27 = r R r R ecircumflex Ecircumflex ecircumflex Ecircumflex keycode 28 = t T t T thorn THORN thorn THORN ... keycode 168 = keycode 169 = XF86Eject NoSymbol XF86Eject keycode 170 = XF86Eject XF86Eject XF86Eject XF86Eject keycode 171 = XF86AudioNext NoSymbol XF86AudioNext keycode 172 = XF86AudioPlay XF86AudioPause XF86AudioPlay XF86AudioPause keycode 173 = XF86AudioPrev NoSymbol XF86AudioPrev ...</pre<noinclude></noinclude>>

À chaque "keycode" est associé au maximum 8 "keysyms" représentant les cas suivant :

  1. touche ;
  2. shift + touche ;
  3. mode_switch + touche ;
  4. mode_switch + shift + touche ;
  5. AltGr + touche ;
  6. AltGr + shift + touche ;
  7. AltGr + mode_switch + touche ;
  8. AltGr + mode_switch + shift + touche.
Note: mode_switch est un symbol qui selon la map et le clavier que vous utilisez est associé ou pas à une touche.

Ces données sont incrémentales : s'il n'y a que deux fonctions listées, la touche n'est «active» que utilisée seule (1) et avec la touche "shift" (2). Il faut combler avec des NoSymbol les positions intermédiaires vides si on souhaite affecter une fonction à la combinaison AltGr+touche (5) par exemple :

keycode 236 = ActionNormale NoSymbol NoSymbol NoSymbol ActionDésirée_avec_AltGr

S'il n'y a aucune valeur renseignée, c'est que la touche est inactive.

On aura remarqué que le keycode d'une touche est unique et ne change pas avec l'utilisation des touches telle AltGr ou autres. La seule exception est pour les touches Fn : «Fn+touche» a un keycode différent de «touche».

La sortie de la commande précédente donne une bonne idée des keysyms disponibles. Si on souhaite utiliser d'autres keysyms, on trouvera leur nom dans les fichiers /usr/include/X11/keysymdef.h et /usr/include/X11/XF86keysym.h :

$ cat /usr/include/X11/keysymdef.h

<pre<noinclude></noinclude> style="white-space: pre-wrap; overflow-x: auto; border-top: none; margin-top: 0"> ...

  1. define XK_Pointer_Left 0xfee0
  2. define XK_Pointer_Right 0xfee1
  3. define XK_Pointer_Up 0xfee2
  4. define XK_Pointer_Down 0xfee3
  5. define XK_Pointer_UpLeft 0xfee4

...</pre<noinclude></noinclude>>

$ cat /usr/include/X11/XF86keysym.h

<pre<noinclude></noinclude> style="white-space: pre-wrap; overflow-x: auto; border-top: none; margin-top: 0"> ...

  1. define XF86XK_Standby 0x1008FF10 /* System into standby mode */
  2. define XF86XK_AudioLowerVolume 0x1008FF11 /* Volume control down */
  3. define XF86XK_AudioMute 0x1008FF12 /* Mute sound from the system */
  4. define XF86XK_AudioRaiseVolume 0x1008FF13 /* Volume control up */
  5. define XF86XK_AudioPlay 0x1008FF14 /* Start playing of audio > */
  6. define XF86XK_AudioStop 0x1008FF15 /* Stop playing audio */

...</pre<noinclude></noinclude>> Le nom des keysyms se lit en omettant la chaine XK_ : par exemple "Pointer_Left" ou "XF86AudioMute".

Configuration

Xmodmap fonctionne par couches de configurations superposées, qu'il prend en compte en écrasant les valeurs initiales (configuration de X) par celles qui seraient définies, dans l'ordre de lecture suivant :

  • la disposition de clavier donnée pour X ;
  • un éventuel fichier de configuration général ;
  • un éventuel fichier de configuration propre à l'utilisateur ;
  • une commande xmodmap avec les arguments qui vont bien.

En clair, un fichier de configuration personnel a prééminence sur ce qui est défini dans la configuration de X.

Utilisation d'une commande

Pour modifier la fonction d'une touche on invoque simplement xmodmap avec en argument la chaîne de caractères que l'on souhaite modifier :

xmodmap -e "keycode  25 = z Z z Z acircumflex acircumflex acircumflex acircumflex"

Cette commande fait que la touche Z associée à AltGr ne produira que des â minuscules et jamais majuscules, jusqu'à ce qu'on quitte la session graphique.

Fichiers de configuration

Pour rendre les modifications permanentes, (touches spéciales de souris, variantes personnelles de dispositions de claviers...), il faut créer des fichiers de configuration affectant aux "keycodes" désiré les "keysyms" voulus (on ne renseigne que les keycodes que l'on désire modifier) :

Fichier: ~/.xmodmap.conf

<pre<noinclude></noinclude> style="padding: 0.25em; margin: 0 0 0.50em 0; background-color: #F7F7F7; border: thin dashed #7F7F7F; border-top: none">keycode 91 = NoSymbol comma</pre<noinclude></noinclude>> Ce fichier affecte la valeur «,» à la touche . du pavé numérique lorsque le verrouillage dudit pavé est activé (de façon à ce que openoffice ou libreoffice admettent cette touche comme séparateur décimal dans leur tableur). Ce n'est qu'une idée d'utilisation parmi d'autres, on rajoutera les lignes correspondantes pour prendre en compte certaines touches multimedia de claviers par exemple.

Pour prendre en compte ce fichier, il suffit de faire :

xmodmap /home/USERNAME/.xmodmap.conf
Note: Il reste éventuellement à automatiser cette commande au lancement de votre session.

Pour aller plus loin:

man xmodmap

Astuce

Pour récupérer facilement les "keycodes" ou "keysyms", vous pouvez utilisez xev (paquet à installer : xorg-xev). Lancer cet utiliaire ouvre une petite fenêtre, qui doit être active pour afficher les signaux du clavier et des autres périphériques d'entrée. Il est donc conseillé de le lancer à partir d'un terminal virtuel fenêtré (l'utilisation de Yakuake ou équivalent n'est pas conseillé pour cette raison de focus).

$ xev

<pre<noinclude></noinclude> style="white-space: pre-wrap; overflow-x: auto; border-top: none; margin-top: 0"> ... KeyPress event, serial 36, synthetic NO, window 0xc00001,

   root 0xaa, subw 0xc00002, time 12953242, (43,59), root:(832,243),
   state 0x0, keycode 24 (keysym 0x61, a), same_screen YES,
   XLookupString gives 1 bytes: (61) "a"
   XmbLookupString gives 1 bytes: (61) "a"
   XFilterEvent returns: False

KeyRelease event, serial 39, synthetic NO, window 0xc00001,

   root 0xaa, subw 0xc00002, time 12953313, (43,59), root:(832,243),
   state 0x0, keycode 24 (keysym 0x61, a), same_screen YES,
   XLookupString gives 1 bytes: (61) "a"
   XFilterEvent returns: False

... </pre<noinclude></noinclude>> Ou pour avoir moins de texte:

$ xev | sed -n 's/.*keycode *\([0-9]\+\)[^,]*, \([^)]\+\)).*$/keycode \1, keysym \2/p'

<pre<noinclude></noinclude> style="white-space: pre-wrap; overflow-x: auto; border-top: none; margin-top: 0"> ... keycode 24, keysym a keycode 24, keysym a ... </pre<noinclude></noinclude>>