Client xmodmap

Le client xmodmap permet de modifier les associations entre les touches physiques et les touches logiques. Il permet aussi de modifier les associations des boutons de la souris.

Touches physiques et touches symboliques

Sous X, les touches physiques du clavier sont codées par des entiers appelés keycode qui ne peuvent pas être changés. À ces touches physiques sont associées des touches symboliques qui représentent des actions. Ces touches symboliques sont des noms appelés keysym ou keysymname. Le client xmodmap permet justement de gérer ces associations, c'est-à-dire de les afficher et de les modifier.

Les noms symboliques des touches logiques sont définis dans le fichier keysymdef.h qui se trouve habituellement dans le répertoire /usr/X11R6/include/X11/. Dans ce fichier, les noms symboliques commencent par un préfixe XK_ qu'il faut supprimer.

Sous X, on distingue des touches particulières appelées modificateurs (modifiers en anglais) qui peuvent être enfoncées en même temps qu'une autre touche pour modifier son action. Ces modificateurs sont au nombre de huit et portent les noms suivants Shift, Lock, Control, Mod1, Mod2, Mod3, Mod4 et Mod5. Le modificateur Lock correspond à la touche Caps Lock. Le modificateur Mod1 est généralement associé aux touchent Meta ou Alt.

Événements X

Le fait d'enfoncer ou de relâcher une touche provoque l'envoi d'un événement à l'application qui possède le focus. Cet événement contient en autre, le keycode de la touche, le keysym associé et les modificateurs enfoncés en même temps (sous forme d'un octet avec un bit par modificateur). Les touches des modificateurs provoquent également l'envoi d'événements. Ainsi, si on appuie sur les touches Shift et z dans une fenêtre du client xev, on obtient les affichage suivants. Le champ state représente les modificateurs. On remarque que le modificateurs Shift est codé par le bit de poids faible de ce champ. Si on avait utilisé le modificateur Control, le champ state aurait eu la valeur 4.

    KeyPress event, serial 24, synthetic NO, window 0x2400001,
	root 0xae, subw 0x2400002, time 2701669, (31,37), root:(35,651),
	state 0x0, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
	XLookupString gives 0 bytes:  ""

    KeyPress event, serial 24, synthetic NO, window 0x2400001,
	root 0xae, subw 0x2400002, time 2702141, (31,37), root:(35,651),
	state 0x1, keycode 52 (keysym 0x5a, Z), same_screen YES,
	XLookupString gives 1 bytes:  "Z"

    KeyRelease event, serial 24, synthetic NO, window 0x2400001,
	root 0xae, subw 0x2400002, time 2702221, (31,37), root:(35,651),
	state 0x1, keycode 52 (keysym 0x5a, Z), same_screen YES,
	XLookupString gives 1 bytes:  "Z"

    KeyRelease event, serial 24, synthetic NO, window 0x2400001,
	root 0xae, subw 0x2400002, time 2702501, (31,37), root:(35,651),
	state 0x1, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
	XLookupString gives 0 bytes:  ""

Tables d'associations

Pour le clavier, un client X gère deux tables, une pour les associations entre keycode et keysym et une autre pour les modificateurs.

Table des associations touches physiques/touches symboliques

La première table donne pour chaque keycode d'une touche, keysym qui lui sont associés. Au plus huit keysym peuvent être associés mais seul les quatre premiers sont généralement utilisés. Le premier keysym est la signification de la touche lorsqu'aucun modificateur n'est enfoncé, le second lorsque le modificateur Shift est enfoncé, le troisième lorsque la touche Mode_Switch est enfoncé et le quatrième lorsque Shift et Mode_Switch sont enfoncés. Il faut remarquer que Shift est le nom d'un modificateur alors que Mode_Switch est le nom symbolique d'une touche.

Cette table peut être affichée par le client xmodmap avec l'option -pk. Une partie de cette table ressemble par exemple à l'affichage suivant. Chaque keysym est donné par son code et son nom symbolique entre parenthèses.

  ...
  48  0x0027 (apostrophe)  0x0022 (quotedbl)   0xfe51 (dead_acute)  0xfe57 (dead_diaeresis)
  49  0x0060 (grave)       0x007e (asciitilde) 0xfe50 (dead_grave)  0xfe53 (dead_tilde)
  50  0xffe1 (Shift_L)
  51  0x005c (backslash)   0x007c (bar)
  52  0x007a (z)           0x005a (Z)
  53  0x0078 (x)           0x0058 (X)
  54  0x0063 (c)           0x0043 (C)
  55  0x0076 (v)           0x0056 (V)
  56  0x0062 (b)           0x0042 (B)
  57  0x006e (n)           0x004e (N)
  58  0x006d (m)           0x004d (M)
  59  0x002c (comma)       0x003c (less)
  60  0x002e (period)      0x003e (greater)
  61  0x002f (slash)       0x003f (question)
  62  0xffe2 (Shift_R)
  ...

On retrouve que le la touche de keycode 52 est associé aux deux keysym z et Z. On remarque aussi que les deux touches shift gauche et droite ont les keycode 50 et 62.

Les associations de cette table peuvent être modifiées par les commandes keycode et keysym. La première permet de changer les touches symboliques associées à une touche donnée par son keycode. La seconde permet de changer les touches symboliques associées à plusieurs touches données par un keysym associé.

La commande keycode a la syntaxe keycode code = sym1 sym2code est le code de la touche et sym1, sym2 sont les touches symboliques qui lui seront associées dans la table.

La commande keysym a la syntaxe keysym sym0 = sym1 sym2sym0 désigne tous les keycode des touches auxquelles ce nom est associé et sym1, sym2 sont les touches symboliques qui leur seront associées dans la table. Une commande keysym est en faite équivalente à plusieurs commandes keycode, une pour chacune des touches à qui est associé le nom sym0.

Table d'associations des modificateurs

Cette table donne pour chacun des huit modificateurs la liste des touches symboliques qui jouent le rôle de ce modificateur.

Cette table peut être affichée par le client xmodmap avec l'option -pm. Cette table ressemble par exemple à l'affichage suivant.

shift       Shift_L (0x32),  Shift_R (0x3e)
lock
control     Control_L (0x25),  Control_R (0x6d)
mod1        Alt_L (0x40),  Alt_R (0x71)
mod2        Num_Lock (0x4d)
mod3        Mode_switch (0x73),  Mode_switch (0x74)
mod4
mod5        Scroll_Lock (0x4e)

On retrouve que les deux touches shift gauche et droite (noms symboliques Shift_L et Shift_R) jouent le rôle du modificateur Shift. De même, les deux touches control (noms symboliques Control_L et Control_R) jouent le rôle du modificateur Control. Par contre, aucune touche n'est affectée au modificateur Lock. Ceci signifie que la touche Caps lock est ineffective. On remarque finalement que la touche symbolique Mode_Switch est affectée au modificateur Mod3. C'est nécessaire pour qu'elle soit prise en compte comme modificateur.

Les commandes add, remove et clear permettent respectivement d'ajouter une touche symbolique associée à un modificateur, de supprimer une touche symbolique associée à un modificateur et de supprimer toutes les touches symboliques associées à un modificateur.

La commande add a la syntaxe add mod = sym1 sym2mod est le modificateur et sym1, sym2 sont les touches symboliques qui lui seront ajoutées dans la table.

La commande remove a la syntaxe remove mod = sym1 sym2mod est le modificateur et sym1, sym2 sont les touches symboliques qui lui seront supprimées de la table.

La commande clear a la syntaxe clear modmod est le modificateur.

Boutons de la souris

Le client X gère aussi une table d'associations entre les boutons physiques de la souris et des boutons logiques. Cette table peut être affichée par le client xmodmap avec l'option -pp. Cette table ressemble par exemple à l'affichage suivant qui est la table par défaut.

There are 5 pointer buttons defined.

    Physical        Button
     Button          Code
        1              1
        2              2
        3              3
        4              4
        5              5

Chaque bouton physique ou logique est repéré par un entier. Le premier bouton a le numéro 1. Dans la table par défaut, chaque bouton physique n° i est associé au bouton logique n° i.

La table des associations entre les boutons physiques de la souris et les événements envoyés aux application peut être modifiée avec le client xmodmap. Ceci peut par exemple être utile aux gauchers qui veulent inverser l'ordre des boutons.

La commande pointer permet de changer les associations des boutons de la souris. Elle a la syntaxe pointer = num1, num2num1, num2, … sont les numéros des boutons symboliques associés aux boutons physiques 1, 2, … de la souris. La commande suivante permet par exemple d'inverser l'ordre des trois premiers boutons.

  xmodmap -e "pointer = 3 2 1"

On peut aussi utiliser la commande pointer = default pour restaurer la table d'associations par défaut.

Syntaxe du client xmodmap

Le client exécute des commandes qu'il lit dans un fichier passé en paramètre sur la ligne de commande. Une commande peut être mise directement sur la ligne de commande. Elle doit alors être précédée de l'option -e et elle doit former un seule paramètre de la ligne de commandes. Elle doit donc être délimitée par des quotes. C'est cette dernière solution qui est utilisée dans les exemples ci-dessous car elle évite d'utiliser des fichiers extérieurs.

Exemples d'utilisation

Voici quelques exemples d'utilisation de ce client.

Dans certaines configurations, le clavier possèdent deux touches Alt (appelées aussi Meta) à gauche et à droite du clavier. Il arrive que seule celle de gauche est active et que celle de droite n'ait aucune action. Les commandes suivantes permettent de faire en sorte que les touches aient la même action. On suppose dans cet exemple que le keycode de la seconde touche Alt est 113, ce qui peut être vérifié à l'aide du client xev.

# Touche Alt droite de keycode 113
xmodmap -e "keycode 113 = Alt_R"
xmodmap -e "add Mod1 = Alt_R"

La première commande est seulement utile si aucune touche logique n'est associée à la touche Alt de droite qui a généralement le code 113.

Le commandes suivantes sont utiles lorsqu'on désire saisir des caractères accentués sur un clavier QWERTY qui possède une touche inutilisée comme par exemple une touche Windows sous Linux. Les commandes suivantes permettent de saisir des accents en utilisant les touches d'accents comme des touches mortes (dead key en anglais). La touche inutilisée devient un modificateur et les touches d'accents deviennent des touches mortes lorsqu'elles sont enfoncées en même temps que ce modificateur.

# Touche windows de code 115
xmodmap -e "keycode 115 = Mode_switch"
# Cette touche comme un modificateur 
xmodmap -e "add mod3 = Mode_switch"
# Ajout des autres associations aux touches d'accents
xmodmap -e "keysym apostrophe = apostrophe quotedbl dead_acute dead_diaeresis"
xmodmap -e "keysym grave = grave asciitilde dead_grave dead_tilde"
xmodmap -e "keysym 6 = 6 asciicircum 6 dead_circumflex"