GNU/Linux et XKB/Xorg offrent une grande souplesse quant il s'agit de devoir modifier la disposition des touches d'un clavier. La longue histoire de l'environnement mais surtout la multitude de plate forme sur lequel il fonctionne, a fait évolué cet aspect jusqu'à fournir un véritable langage de définition avec xkb. Voyons donc comment exploiter cela lorsque l'on tombe sur une machine au clavier peu ou mal reconnu.
Lorsque vous pressez une touche sur votre clavier, disons la touche A, sa position est transmise à Linux par le contrôleur USB (module usbhid) ou par le contrôleur du port PS/2 (module gêrant la puce ancestrale i8042) sous la forme d'un scan code composé de deux chiffres. Dans notre cas Linux recevra 0x10 0x90 (0x signifiant de l'hexadécimal).
A partir de là il y a deux circuits possibles. Le premier est celui qui mène à la console. Dans ce cas, Linux converti le scan code en un key code selon une table prédéfine. Pour notre touche A, cela nous donne 16.
Ensuite ce key code est converti en un caractère ou un contrôle par une table de conversion. Ces tables, ou du moins les fichiers qui les décrivent, se trouve en /usr/lib/kbd/keymaps. C'est ainsi que la touche A devient le code ASCII 97, puis le caractère a affiché dans la console.
Une batterie de commandes permettent de lister le mapping courrant (
Ainsi, si par exemple en utilisant un disque d'urgence (mode rescue), vous vous retrouvez avec un clavier QWERTY, un loadkey fr, peut grandement aider...
Bon, la console c'est bien sympathique mais comment tout cela fonctionne t-il sous X ? Et bien de la même manière, en beaucoup plus complexe. Sous X, le module chargé du clavier est XKB. Comme Linux, XKB s'alimente à la source, aux scan codes. Et comme Linux, il dispose d'une table qui va permettre la conversion de ces scan codes en key codes. Seulement ce ne sont pas les mêmes correspondance, évidement
.
Ainsi notre touche A, a cette fois pour code 24. Grâce à une table, XKB va ensuite transforme ce key code en un key code symbolique. La liste de ces valeurs peut être consultée dans le fichier /usr/share/X11/xkb/keycodes/xfree86 où l'on trouve la ligne :
L'intérêt du key code symbolique est qu'il permet de séparer d'un côté les spécificités d'un modèle de clavier, de l'autre, nous allons le voir, la disposition de ce clavier. Par exemple, pour un clavier de Mac, le key code de la touche A est 20, mais pour le mac, comme pour le PC, le key code symbolique est le même, à savoir AD01. Enfin j'utilise le terme symbolique car AD01 n'est pas un chiffre en hexadécimal, mais bien un identifiant. Par exemple le key code symbolique de la touche
Comme évoqué plus haut, le key code symbolique permet la séparation entre spécificité matérielles et disposition du clavier. Cela implique qu'il existe une seconde table de conversion qui elle fait le lien entre key code symbolique et un caractère ou contrôle. On appelle cela un Key Sym. Ainsi que le clavier soit celui d'un PC, d'un Mac, ou d'un Amiga, le keySym du key code symbolique AD01 sera toujours a. On peut donc avoir un même fichier de description des positions pour un clavier de AZERTY de Mac et de PC.
D'ailleurs, lorsque sous Gnome vous allez dans le paramétrage du clavier, vous avez bien choisir d'abord un modèle, puis seulement ensuite, une disposition. Il en va de même dans le fichier /etc/X11/xorg.conf :
Ici le modèle physiques (la table key codes / key codes symbolique est celle d'un clavier générique PC104, et la disposition (la table key code symbolique / key sym, est celle d'un clavier AZERTY.
L'ensemble des fichiers responsables des dispositions de clavier est stocké dans le dossier /usr/share/X11/xkb/symbols et une liste des symboles, les key syms disponibles, peut être trouvée ici.
Maintenant, comme pour la console, il est possible de modifier la disposition du clavier, et là, plusieurs options sont disponibles.
xmodmap ne tombe pas du placard, c'est en fait l'outil d'origine pour modifier la disposition des touches et ce bien avant Xorg, à l'époque de XFree86. Et même si l'utilitaire est amené à disparaître au profit d'xkb, il reste pratique pour hacker rapidement un clavier.
A titre d'exemple, nous allons créer un fichier .xmodmap permettant changer la ligne des chiffres sur un clavier QWERTY de sorte à rendre disponibles les accents comme sur un clavier AZERTY. En Qwerty les chifffres sont directement accessibles, les symboles étant liés à la touche Shift. En AZERTY ce sont les symboles qui sont directement accessibles, dont les accents, et les chiffres sont eux relégués au niveau du Shift.
Notre "nouveau" clavier va donc mélanger les deux approches. La règles est de placer les symboles en premiers plans, de remplacer ceux des touches 2, 7, 9 et 0 par é, è, ç et à. On va aussi ajouter une touche d'accents circonflexes et trémas sur le keycode 49, transformer la touche WIN en touche AltGR et redéfinir les touches de directions. Cet exemple n'est pas pris au hasard, il s'agit juste de rendre le clavier du netbook U810 utilisable en français. L'avantage ce cet exemple est qu'il est assez complet.
Dans le langage xmodmap cette modification se traduit comme cela :
Nous retrouvons dans ce listing nos key code que vous pouvez retrouver grâce à l'utilitaire xev ou encore en utilisant la commande xbindkeys -mk.
Ensuite, nous avons une série de 1 à 4 keySyms. Le premier correspond à la touche pressée, le second à la même touche mais avec Shift, le troisième avec la touche AltGr, et le quatrième correspond à Shift+AltGr.
Le keycode 49 est un peu spécial car faisant appel à ce que l'on appel les touches mortes. Une touche morte est une touche qui ne produit aucun symbole mais qui va altérer la prochaine touche frappée. Ici nous définissons la touche morte qui ajoute l'accent circonflexe, puis le trema avec le Shift.
Dernier point, la définition de la touche pour Mode_Switch qui n'est autre que ALTGR, sur la touche Windows.
Une fois que votre fichier est créé, il se charge très simplement par la commande
Enfin, vous pouvez à tout moment liste la disposition courante par la commande xmodmap -pke.
Maintenant que nous maîtrisons la méthode des anciens, passons à celle des modernes, via xkb
XKB est le pilote X11 qui gère le clavier. Il est donc possible d'écrire des configurations spécialement pour celui-ci, sans passer par XModMap et ainsi intégrer définitivement un nouveau clavier au système.
XKB permet de définir une correspondance entre les keycodes (ex. 176, 134) et des symboles (ex. ESC, AE01). Ensuite entre des symboles et une série de caractères correspondant à la touche "libre", via Shift, via AltGr puis via Shift+AltGr. Et enfin, de manière plus anecdotique, de définir une correspondance entre les symboles et une géométrie du clavier permettant d'en obtenir un aperçu visuel à l'écran.
La configuration de XKB est stockée dans le dossier /usr/share/X11/xkb. Les fichiers de keycodes/symboles sont placés dans le sous-dossier keycodes. Les claviers de PC sont (je pense) gérés par le fichier xfree98.
Les fichiers de correspondance symboles/caractères sont quant à eux dans le sous-dossier symbols. On y trouve le fichier fr responsable du clavier AZERTY. Si l'on regarde de plus près ces fichiers, on constate deux choses. Tout d'abord ils font références à d'autre fichiers. Dans le cas du fr c'est latin. La définition du clavier français n'est donc qu'un "patch" de la version latine commune avec l'anglais.
le second constat est qu'un fichier contient plusieurs définitions s'incluant généralement les unes les autres. Ces sections représente des "variantes" de la version "basic". Ces variantes sont utilisable sous le nom principal(variante). Ainsi le clavier français, variante OSS, est appelée fr(oss).
Enfin, les fichiers associant symboles et position physique des touches sont disponibles dans le dossier geometry. Ainsi, deux clavier de type PC, peuvent avoir une géométrie différente.
Le cas de l'U810 est, d'un point de vue keycode, un clavier de PC standard. Notre nouveau clavier n'est donc qu'une "variante" du clavier anglais (gb). Nous allons donc modifier le fichier responsable de la translation key codes symboliques / key syms de la disposition gb. Pour cela, il faut cette fois éditer le fichier /usr/share/X11/xkb/symbols/gb pour y ajouter, par exemple à la fin, la définition de notre variante :
On remarque d'emblée que mise à part la syntaxe différente, il existe de grosse similitude avec le langage de xmodmap. La seule différence tient à ce que l'on n'utilise pas directement les key codes, mais le key codes symboliques. Pour le reste, c'est exactement la même chose qu'avec xmodmap avec une définition plus simple de la touche AltGr en passant par le symbole ISO_Level3_Shift.
Pour être sur de ne rien avoir écrit de travers, vous pouvez compiler ce code :
Une fois notre variante ajoutée elle est utilisable. Pour cela, lancez la commande suivante
Normalement cela devrait fonctionner directement. Pour que cela soit automatiquement pris en compte au démarrage de X, il faut simplement modifier /etc/X11/xorg.conf, localiser l'enregistrement InputDevice lié au clavier modifier comme suit :
Maintenant un problème reste entier, celui de l'utilisation d'un clavier "normal". Si ce clavier est connecté directement par le port USB, il suffit de le trouver par un lsusb et de chercher la correspondance dans /dev/input/by-id. Par exemple pour mon enermax, c'est /dev/input/by-id/usb-0566_3108-event-kbd. Ensuite il faut simplement dupliquer votre entrée existante pour le clavier dans /etc/X11/xorg.conf et la modifier comme suit :
Ceci fait, le clavier d'origine fonctionne avec sa variante, et le nouveau clavier en mode classique français. Bien évidement il est possible d'inverser.
Le problème qui nous reste concerne des outils comme synergy qui se base sur le layout/variant courant. Dans ce cas là, il faut pouvoir basculer rapidement d'un clavier à l'autre en utilisant par exemple l'applet Indicateur de Claviers de Gnome, et donc ajouter notre variante dans Système/Préférences/Clavier/Agencements.
Pour que Gnome connaisse notre variante, il faut la déclarer dans le fichier /usr/share/X11/xkb/rules/xorg.xml. Ouvrez-le et cherchez le clavier gb. Ajoutez ensuite dans la section variantlist, notre variante U810 comme suit :
Ceci fait, nous allons maintenant pouvoir ajouter au tableau de bord Gnome l'applet Indicateur de Claviers et basculer d'une disposition à l'autre en cliquant dessus.
Un des problèmes posé par l'approche "variante" est que XKB permet de redéfinir une touche mais pas de réinitialiser une définition. Ainsi dans le cas de l'U810, la touche flèche haut est connectée au symbole AB09. Sur un clavier de PC normal, ce symbole correspond à la touche colon, slash, periodcentered, division.
Du coup, si je place dans mon fichier fr une simple variante en redéfinissant le comportement de la touche AB09 par un key
La solution est donc de créer une nouvelle disposition plutôt qu'une variante sur une disposition existante.
Le clavier de l'U810 étant le même qu'un PC standard du point de vue des keycodes, nous ne touchons donc qu'à la table des symboles en créant la notre dans un fichier symbols/U810 :
La définition est plus volumineuse que notre version "layout", et pour cause, il s'agit cette fois d'une redéfinition propre et complète du clavier. Pour le reste, la syntaxe en elle-même n'a rien de nouveau maintenant.
Ce qui l'est en revanche, c'est qu'il va falloir modifier /usr/share/X11/xkb/rules/xorg.xml pour supprimer notre variante et ajouter notre disposition. Cela se fait simplement en ajoutant dans le tag layouts l'entrée suivante :
Cette fois nous ne sommes plus une variante de la disposition "gb" mais une disposition French U810 appartenant au groupe de langue française. La commande de bascule est donc cette fois :
Pour xorg.conf la syntaxe est la même sauf que nous oublions l'option "xkbVariant" :
Enfin ayant modifie xorg.xml, Gnome est capable de retrouver la nouvelle disposition mais de manière un peu détournée. Lorsque vous ajouter un nouvel agencement, allez dans l'onglet Par langue, sélectionnez Français et dans la seconde liste vous devriez trouver French U810.
Là c'est un peu le gadget. En effet, lorsque l'on choisi une disposition avec Gnome, s'affiche l'image du clavier. Il est possible de créer sa propre image correspondant à la réalité du clavier physique. Pour cela, créer le fichier geometry/U810 suivant :
Ca fait un peu peur la première fois mais c'est en réalité assez simple. On définit ici une image de 396x106 pixels. Ensuite vient la définition de trois formes de touches (normales, petites et barre d'espace). Le premier groupe est la taille, le second et le troisième définissent un sous-rectangle permettant de représenter la perspective de la touche.
Ensuite on passe à la définition du clavier ligne par ligne (row) en indiquant à chaque fois la propriété top de la ligne en pixels. Pour la première lignes toutes les touches ont l'attribut small, pour la suivante, aucun attribut n'est spécifié, c'est donc norm qui est utilisé, et ainsi de suite. Les codes entres < et > sont les mêmes symboles utilisés dans la définition du layout.
Une fois notre clavier dessiné, il faut le déclarer. Tout d'abord dans rules/base.xml en ajoutant cette fois un model :
Ensuite, ça se corse un peu, il faut modifier le fichier rules/base, recherche la ligne ! model = geometry, et avant la dernière ligne * = pc(pc104), insérez la ligne U810 = U810(basic).
Enfin, dans le fichier geometry.dir, il faut rajouter :
Voilà, c'est terminé, un coup de redémarrage de X, allez dans le panneau de configuration du clavier, et dans les modèles de clavier, sélectionnez Fujitsu/U810. Ensuite allez changer le layout en cliquant sur ajouter et vous devriez voir apparaître un clavier à peu prés identique à celui de l'U810.
Voilà, le petit tour dans le monde des touches et des claviers est terminé. La seule chose qui nous manque ici pour aller encore plus loin serait de redéfinir cette fois le modèle même du clavier, mais je n'en ai pas encore trouvé l'usage 
- répondre
dnartreb89 , le 18 July, 2008 - 05:20Super tuto.
Je le verrais bien en copie sur Linuxpédia, pour pouvoir le retrouver hyper facilement. Je risque d'en avoir besoin d'ici quelques mois. xmodmap me permettra d'ajouter des fonctions a ma télécommande qui est reconnue comme un clavier !
Bonne journée à tous !
- répondre
Ulhume, le 18 July, 2008 - 07:36@dnarte Merci
Le problème des *pedia et autres Wiki, c'est qu'ils n'y a pas de protocole automatique de lien avec des articles. Du coup, soit on le pose et on l'oublie, soit je suis obligé de maintenir plusieurs versions du même tuturiel. C'est un peu "lourd".
- répondre
LHB , le 18 July, 2008 - 09:06Un gros travail que tu as fait là!
Bravo et merci!!
- répondre
the_glu , le 18 July, 2008 - 11:12Huhuhu c'est sympa j'ai pu rajouter les accents sur mon EEE (clavier us) avec ça
- répondre
Omne , le 18 July, 2008 - 13:53Merci pour la super doc, ça nous aurait été utile fut un temps
Allez… je le dis que quitte à taper des accents autant le faire sur une disposition ergonomique et opensource ?
Oui, je le dis ! Il faut essayer le dvorak-bépo ! (et virer son clavier décalé).
Toutes les infos sont là : http://www.clavier-dvorak.org/wiki/Pourquoi_apprendre_le_b%C3%A9po
Et l’accueil : http://www.clavier-dvorak.org
- répondre
Ulhume, le 18 July, 2008 - 14:21@Omne si tu regardes bien, j'en parle déjà du dvorak
et je dis aussi que c'est déjà dans la boîte... En gros t'as pas lu quoi 
Maintenant c'est très sympathique mais le clavier c'est peu comme langue étrangère. Il faut l'apprendre, la parler couramment et apprendre à être capable de passer de l'une à l'autre très facilement. Alors pour ceux qui n'utilisent jamais qu'un seul clavier c'est pas un gros problème, mais lorsque tu passes ta vie chez un client, puis un autre etc.... Rien que la disposition du bloc directionnel qui change entre les anciennes et les nouvelles générations de clavier est un merdier à gérer quant tu développes. Alors toutes les touches, y'a de quoi devenir autiste
- répondre
Omne , le 18 July, 2008 - 14:35Si, si, j’ai lu. Mais je fais de la pub (clairement) spécifique pour le bépo car c’est un dvorak francophone. Et contrairement au Leboute (dvorak-f) il est — ainsi que tous ses outils de génération automatique des pilotes — totalement sous licence libre.
Dans la section installation, il y a des pilotes pour tous les os qui peuvent s’utiliser sans être admin de la machine. Donc une clef usb et c’est bon.
Cela dit, il est certain que cela demande un certain investissement lors de l’apprentissage.
De là a en devenir autiste… non ! (je ne suis pas certain qu’on devienne autiste…) On apprend même assez vite, en fait.
- répondre
Ulhume, le 18 July, 2008 - 14:52@Omne il me semble bien que le bepo est déjà dans les définitions standards de xkb non ? Ligne 463 dans ma définition /usr/share/X11/xkb/symbols/fr
Je veux bien que l'on ne devienne pas réellement autiste, mais passes-tu ton temps à changer de clavier d'un client à l'autre ? C'est ça que je crains moi...
- répondre
Omne , le 18 July, 2008 - 15:10Oui, le bépo est dans Xorg, mais une version ancienne. Nous venons de finir la 067 qui sera sans doute une v1-rc1. Et attendons la v1 stricte pour demander le changement dans Xorg.
Je ne suis pas informaticien… mais kiné ! Alors je ne change pas sans cesse de machine. Quand je vais dépanner un pote, j’ai mon pilote sur la clef (et de plus en plus souvent mon typematrix dans le sac).
Mais je suis bien conscient de ce que tu dis. Est-ce pour autant une raison pour garder une dispo de clavier complètement mal foutue ? Ça se discute.
- répondre
Ulhume, le 18 July, 2008 - 16:09@Omne Tu sais que la largeur de la navettes spatiale américaine est liée à la taille de l'arrière train d'un cheval romain...
Ceci dit, l'idée d'avoir son propre clavier est bonne, j'avoue n'y avoir bêtement jamais pensé...
Poster un nouveau commentaire