Artisan Numérique

/système/clavier/x11/xmodmap/ Redéfinition d'un clavier

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.

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

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 :

 =  24;

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 Alt est... ALT :-)

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é 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 :

   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, et là, plusieurs options sont disponibles.

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

! 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

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

rootxmodmap monClavier.xmodmap

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

utilisation de xkb

Principe

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.

Définition d'une variante

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 :

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 ] };
};
/usr/share/X11/xkb/symbols/u810

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 :

gastonxkbcomp /usr/share/X11/xkb/symbols/u810

Une fois notre variante ajoutée elle est utilisable. Pour cela, lancez la commande suivante

changer la disposition et la variante
rootsetxkbmap -layout gb -variant fujitsu_u810

revenir à la variante française
rootsetxkbmap -layout fr

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 :

Section "InputDevice"
    Identifier "Keyboard"
    Driver "kbd"
    Option "XkbModel" "pc105"
    Option "XkbLayout" "gb"
    Option "XkbVariant" "fujitsu_u810"
    Option "XkbOptions" "compose:rwin"
EndSection

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 :

Section "InputDevice"
    Identifier "Keyboard"
    Driver "kbd"
    Option "Device" "/dev/input/by-id/usb-0566_3108-event-kbd"
    Option "XkbModel" "pc105"
    Option "XkbLayout" "fr"
    Option "XkbOptions" "compose:rwin"
EndSection

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 :

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

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.

Définition d'une disposition

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 { [ Up ] }, les anciens comportement avec SHIFT et ALTGR restent présents et je ne peux pas sélectionner un texte avec SHIFT+flèches.

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 :

partial default alphanumeric_keys
xkb_symbols "U810" {
    include "level3(ralt_switch)"
    name[Group1]="France";
    key <PGDN>    { [         XF86KbdLightOnOff   ] };
    key <PGUP>    { [         Menu   ] };
    key <K6B>     { [         XF86RotateWindows   ] };
    key <LALT>    { [         XF86Sleep   ] };
    key <OUTP>    { [         XF86Display ] };

    key <ESC>     { [         Tab,             Escape,      Tab                           ] };
    key <AE01>    { [         exclam,          1,           exclam                        ] };
    key <AE02>    { [         eacute,          2,           at                            ] };
    key <AE03>    { [         quotedbl,        3,           numbersign                    ] };
    key <AE04>    { [         apostrophe,      4,           dollar                        ] };
    key <AE05>    { [         percent,         5,           less                          ] };
    key <AE06>    { [         tilde,           6,           greater                       ] };
    key <AE07>    { [         egrave,          7,           ampersand                     ] };
    key <AE08>    { [         asterisk,        8,           asterisk                      ] };
    key <AE09>    { [         ccedilla,        9,           braceleft,        parenleft   ] };
    key <AE10>    { [         agrave,          0,           braceright,       parenright  ] };



    key <AD01>  { [         a,             A,          ae,               AE          ] };
    key <AD02>  { [         z,             Z,          guillemotleft,    less        ] };
    key <AD03>  { [         e,             E,          EuroSign,         cent        ] };
    key <AD04>  { [         r,             R,          paragraph,        registered  ] };
    key <AD05>  { [         t,             T,          tslash,           Tslash      ] };
    key <AD06>  { [         y,             Y,          leftarrow,        yen         ] };
    key <AD07>  { [         u,             U,          ugrave                        ] };
    key <AD08>  { [         i,             I,          rightarrow,       idotless    ] };
    key <AD09>  { [         o,             O,          bracketleft,       OE          ] };

    key <AD10>  { [         p,             P,          bracketright,     THORN       ] };
    key <AC11>  { [         apostrophe,    quotedbl                                  ] };



    key <AC01>  { [         q,          Q,           at,  Greek_OMEGA ]  };
    key <AC02>  { [         s,          S,       ssharp,      section ]  };
    key <AC03>  { [         d,          D,          eth,          ETH ]  };
    key <AC04>  { [         f,          F,      dstroke,  ordfeminine ]  };
    key <AC05>  { [         g,          G,          eng,          ENG ]  };
    key <AC06>  { [         h,          H,      hstroke,      Hstroke ]  };
    key <AC07>  { [         j,          J ]  };
    key <AC08>  { [         k,          K,          kra,    ampersand ]  };
    key <AC09>  { [         l,          L,      lstroke,      Lstroke ]  };
    key <AC10>  { [         m,          M,           mu,    masculine ]  };


    key <AB01>  { [         w,          W,      lstroke,      Lstroke ]  };
    key <AB02>  { [         x,          X, guillemotright,    greater ]  };
    key <AB03>  { [         c,          C,         cent,    copyright ]  };
    key <AB04>  { [         v,          V, leftdoublequotemark, leftsinglequotemark ]  };
    key <AB05>  { [         b,          B, rightdoublequotemark, rightsinglequotemark ] };
    key <AB06>  { [         n,          N                             ]  };
    key <AB07>  { [     comma,   period,   dead_acute, dead_doubleacute ] };
    key <AB08>  { [ semicolon,    colon, dead_acute, dead_doubleacute ]  };
    key <AB09> { [        Up                                         ] };
    key <AB10>  { [     slash,    question                             ] };

    key <LWIN> { [ISO_Level3_Shift]};
    key <TLDE>  { [dead_circumflex, dead_diaeresis, asciitilde        ]  };
    key <AE11>  { [     minus, underscore,    backslash, questiondown                   ] };
    key <AE12>  { [     equal,       plus, dead_cedilla,  dead_ogonek                   ] };
    key <AD11> { [ Left                                              ] };
    key <AD12> { [ Down                                              ] };
    key <BKSL> { [ Right                                             ] };


    key   <UP> {  [  Prior                    ]  };
    key <LEFT> {  [  Home                            ]  };
    key <DOWN> {  [  Next                            ]  };
    key <RGHT> {  [  End                                  ]  };
 };

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 :

<layout>
  <configItem>
    <name>U810</name>
    <shortDescription>Fra</shortDescription>
    <description>French U810</description>
    <languageList><iso639Id>fra</iso639Id></languageList>
  </configItem>
  <variantList/>
</layout>

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 :

passer à la nouvelle disposition
rootsetxkbmap -layout U810

revenir à la variante française
rootsetxkbmap -layout fr

Pour xorg.conf la syntaxe est la même sauf que nous oublions l'option "xkbVariant" :

Section "InputDevice"
    Identifier "Keyboard"
    Driver "kbd"
    Option "XkbModel" "pc105"
    Option "XkbLayout" "U810"
    Option "XkbOptions" "compose:rwin"
EndSection

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.

Ajout d'une géométrie

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 :

partial hidden xkb_geometry "basic" {

  description = "Fujitsu U810 Keyboard";
  width = 396;
  height = 106;

  shape.cornerRadius = 1;
  shape "NORM" { { [24, 22] }, { [2, 1], [22, 20] } };
  shape "SMALL" { { [22, 20] }, { [2, 1], [20, 18] } };
  shape "SPCE" { { [42, 20] }, { [2, 1], [40, 18] } };

  text.color = "black";

  section.left = 1;
  row.left = 1;
  key.shape = "NORM";
  key.gap = 1;

  section "Alphanumeric" {
    top = 1;
    row {
      top = 1;
      keys {
        { <ESC>, "SMALL" }, {<AE01>, "SMALL" }, {<AE02>, "SMALL" },
        {<AE03>, "SMALL" }, {<AE04>, "SMALL" }, {<AE05>, "SMALL" },
        {<AE06>, "SMALL" }, {<AE07>, "SMALL" }, {<AE08>, "SMALL" },
        {<AE09>, "SMALL" }, {<AE10>, "SMALL" }, {<BKSP>, "SMALL" }
      };
    };
    row {
      top = 21;
      keys {
        <AD01>, <AD02>, <AD03>, <AD04>, <AD05>,
        <AD06>, <AD07>, <AD08>, <AD09>, <AD10>,
        <AC11>
      };
    };
    row {
      top = 43;
         left = 4;
      keys {
        <AC01>, <AC02>, <AC03>, <AC04>, <AC05>,
        <AC06>, <AC07>, <AC08>, <AC09>, <AC10>,
        <RTRN>
      };
    };
    row {
      top = 65;
      keys {
        { <LFSH>, "Shift" },
        <AB01>, <AB02>, <AB03>, <AB04>, <AB05>,
        <AB06>, <AB07>, <AB08>, <AB09>, <AB10>
      };
    };
    row {
      top = 87;
      keys {
        {<LCTL>, "SMALL" }, {<FN>, "SMALL" }, {<LWIN>, "SMALL" },
        {<LALT>, "SMALL" }, {<TLDE>, "SMALL" }, {<SPCE>, "SPCE" },
        {<AE11>, "SMALL" }, {<AE12>, "SMALL" }, {<AD11>, "SMALL" },
        {<AD12>, "SMALL" }, {<BKSL>, "SMALL" }
      };
    };
  };

};

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 :

<model>
  <configItem>
    <name>U810</name>
    <description>U810 keyboard</description>
    <vendor>Fujitsu</vendor>
  </configItem>
</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 :

-d------ -------- U810(basic)

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.

Conclusion

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 :-)