Redéfinition d'un clavier
Le 19 octobre 2008 à 21:00, 3ième version du billet (Intégration de xkb/layout).

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.

Historique (tout afficher)
  • v3 - Intégration de xkb/layout (2008-10-23 00:12)
  • v2 - Conversion de la version Zaurus en quelque chose de plus général (2008-07-18 13:53)

De la touche, à la console

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 (dumpkeys), de changer le mapping d'une touche setkeycodes et enfin de charger un mapping complet par la commande loadkeys.

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...

De la touche à X11

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 Wink.

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 :

<AD01> =  24;

L'interê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 Alt est... ALT Smiling

Petite information amusante, la disposition AZERTY, QWERTY & co, n'est en rien dictée par des impératifs ergonomique, bien au contraire. En effet, ces positions sont héritées des machines à écrire mécaniques, et l'objectif était de réduire la vitesse de frappe pour que les marteaux ne s'emmêlent pas... Il existe aujourd'hui des dispositions de clavier réellement ergonomiques, par exemple en suivant la méthode Dvorak. Ces dispositions exotiques sont bien évidement disponibles sous Xorg/Linux.

Comme évoqué plus haut, le key code symbolique permet la séparation entre spécificité materielles 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 apelle 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 :

   Section "InputDevice"
    Identifier "Keyboard"
    Driver "kbd"
    Option "XkbModel" "pc104"
    Option "XkbLayout" "fr"
    Option "XkbOptions" "compose:rwin"
EndSection

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, soit de manière temporaire grâce à l'utilitaire xmodmap, soit en créant son propre fichier de conversion et en le chargeant avec via l'interface de Gnome, ou par la commande setxkbmap.

Utilisation de xmodmap

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 de rendre accessible les accents sur le clavier QWERTY de U810 et de modifier au passage quelques "erreurs" de design. Cela consiste à :

  • "Remonter" les chiffres de la première ligne de touches en les rendant acessibles par la touche shift.
  • "Descendre" les symboles de la première ligne de touches en les rendant accessibles directement.
  • Remplacer les symboles @, &, ( et ) par les équivalents accentués d'un clavier AZERTY : é, è, ç et à.
  • Rendre les symboles @, &, ( et ) accessibles sur les touches d'origine, mais en passant par une combinaison AltGR+touche.
  • Comme le clavier de l'U810 ne dispose pas de la touche AltGR, utiliser la touche Win à la place.
  • Utiliser la touche ` assez peu utilisé en français pour décorrer les caractères avec tréma et accents circonflexe.
  • Remplacer la touche Esc par la touche Tab.
  • Placer la touche Esc sur la combinaison Shift+Tab.
  • Rendre les touches de direction accessibles directement et placer les symboles occultés sur des combinaisons Shift/AltGr.

Voilà, c'est tout et c'est déjà pas mal. Voyons comment cela se traduit en langage xmodmap :

! Refonte de la première ligne de touches
keycode 10 = exclam     1
keycode 11 = eacute     2   at
keycode 12 = numbersign 3
keycode 13 = dollar     4
keycode 14 = percent    5
keycode 15 = asciicircum 6
keycode 16 = egrave     7   ampersand
keycode 17 = asterisk    8
keycode 18 = ccedilla   9   parenleft
keycode 19 = agrave     0   parenright
keycode 9  = Tab        Escape

! Activation du décorateur de caractères
keycode 49 = dead_circumflex dead_diaeresis asciitilde

! Utilisation de la touche WIN comme AltGR
keycode 115 = Mode_switch
clear mod5
add mod5 = Mode_switch

! Redéfinition des touches de direction
keycode 60 = Up less greater
keycode 35 = Down bracketleft braceleft
keycode 34 = Left  bracketright braceright
keycode 51 = Right backslash bar

! Transfer du . sur le touche de la ,
keycode 59 = coma  period
contenu de monClavier.xmodmap

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

xmodmap monClavier.xmodmap

Enfin, vous pouvez à tout moment liste la disposition corrante par la commande xmodmap -pke.

Maintenant que nous maîtrisons la méthode des anciens, passons à celle des modernes, via xkb

utilisation de xkb

Dans le cas de l'U810, le clavier est totalement compatible avec un clavier de PC standard, du moins au regard des keycodes. Nous n'avons donc, pour créer notre nouveau clavier, qu'à créer une simple variante d'un clavier QWERTY anglais (GB).

Pour se faire nous allons modifier le fichier /usr/share/X11/xkb/rules/xorg.xml, y chercher le clavier gb, et ajouter dans la section variantlist, notre variante U810 :

  <variantList>
<variant>
  <configItem>
    <name>fujitsu_u810</name>
    <description>Fujitsu U810</description>
  </configItem>
</variant>
...

Ceci fait, nous allons maintenant 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 :

  partial alphanumeric_keys
xkb_symbols "fujitsu_u810" {

    include "gb(basic)"

    name[Group1]="France - Fujitsu U810";


    key <AE01>  { [         exclam,          1] };
    key <AE02>  { [         eacute,          2,           at,           AE ] };
    key <AE03>  { [         numbersign,          3] };
    key <AE04>  { [         dollar,          4] };
    key <AE05>  { [         percent,          5] };
    key <AE06>  { [         asciicircum,          6] };
    key <AE07>  { [         egrave,          7,           ampersand,           AE ] };
    key <AE08>  { [         asterisk,          8] };
    key <AE09>  { [         ccedilla,          9,           parenleft,           AE ] };
    key <AE10>  { [         agrave,          0,           parenright,           AE ] };
    key <TLDE>  { [ dead_circumflex,  dead_diaeresis ] };    

    key <LWIN> { [ISO_Level3_Shift]};
    key <ESC>    { [Tab,Escape,Tab]};
    key <AB09>  { [ Up, less, greater] };
    key <AD12>  { [ Down, bracketright, braceleft] };
    key <AD11>  { [ Left, bracketleft, braceright] };
    key <BKSL>  { [ Right,backslash, bar ] };
    key <AB08>  { [ coma, period ] };
};

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.

Maintenant pour tester notre clavier, nous utilisons la commande bien pratique

setxkbmap -layout gb -variant fujitsu_u810

Et pour revenir à un clavier AZERTY (si par exemple vous avez branché un clavier USB) :

setxkbmap -layout fr

Il est enfin possible, si vous devez comme moi passer régulièrement de l'un à l'autre, d'ajouter ce nouveau clavier dans le paramétrage de Gnome et d'ajouter dans le panneau du bureau, l'applet Indicateur de Claviers.

Conclusion

Voilà, le petit tour dans le monde des touches et des claviers est terminé et l'U810 me permet de saisir des textes en français.

Commentaires

dnartreb89 , le 18 July, 2008 - 05:20

Super 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 !

Ulhume, le 18 July, 2008 - 07:36

@dnarte Merci Smiling 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".

LHB , le 18 July, 2008 - 09:06

Un gros travail que tu as fait là!
Bravo et merci!!

the_glu , le 18 July, 2008 - 11:12

Huhuhu c'est sympa j'ai pu rajouter les accents sur mon EEE (clavier us) avec ça Wink

Omne , le 18 July, 2008 - 13:53

Merci 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

Ulhume, le 18 July, 2008 - 14:21

@Omne si tu regardes bien, j'en parle déjà du dvorak Smiling et je dis aussi que c'est déjà dans la boîte... En gros t'as pas lu quoi Wink

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 Smiling

Omne , le 18 July, 2008 - 14:35

Si, 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.

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...

Omne , le 18 July, 2008 - 15:10

Oui, 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.

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

Le contenu de ce champ est gardé secret et ne sera pas montré publiquement.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • To highlight piece of code, just surround them with <code type="language"> Your code &tl;/code>>. Language can be java,c++,bash,etc... Everything Geshi support.
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • Textual smileys will be replaced with graphical ones.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.

Plus d'informations sur les options de formatage

Connexion utilisateur
Les derniers bavardages...