title: Deux claviers branchés, deux dispositions différentes
date: 2013-11-02
tags: Asrall,Geekeries,Linux
url: deux-claviers-deux-dispositions
slug: deux-claviers-deux-dispositions


Une petite astuce simple et rapide, quand on a deux claviers différents, avec
deux dispositions différentes, genre un azerty et un bépo, sous Xorg.

Ce qui serait bien, c'est que si je tape quelque chose sur mon clavier bépo,
la map utilisée soit celle du bépo, et si je tape sur mon clavier azerty, la
map utilisée soit en azerty.

Comment faire ?

Commençons par lister les périphériques via xinput

   alex@yue ~> xinput -list
   ⎡ Virtual core pointer                            id=2    [master pointer  (3)]
   ⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
   ⎜   ↳ Wacom ISDv4 E3 Finger touch               id=11   [slave  pointer  (2)]
   ⎜   ↳ Wacom ISDv4 E3 Pen stylus                 id=12   [slave  pointer  (2)]
   ⎜   ↳ Logitech USB Laser Mouse                  id=13   [slave  pointer  (2)]
   ⎜   ↳ TypeMatrix.com USB Keyboard               id=15   [slave  pointer  (2)]
   ⎜   ↳ SynPS/2 Synaptics TouchPad                id=17   [slave  pointer  (2)]
   ⎜   ↳ Wacom ISDv4 E3 Pen eraser                 id=19   [slave  pointer  (2)]
   ⎣ Virtual core keyboard                           id=3    [master keyboard (2)]
       ↳ Virtual core XTEST keyboard                 id=5    [slave  keyboard (3)]
       ↳ Power Button                                id=6    [slave  keyboard (3)]
       ↳ Video Bus                                   id=7    [slave  keyboard (3)]
       ↳ Video Bus                                   id=8    [slave  keyboard (3)]
       ↳ Power Button                                id=9    [slave  keyboard (3)]
       ↳ Sleep Button                                id=10   [slave  keyboard (3)]
       ↳ TypeMatrix.com USB Keyboard                 id=14   [slave  keyboard (3)]
       ↳ AT Translated Set 2 keyboard                id=16   [slave  keyboard (3)]
       ↳ HP WMI hotkeys                              id=18   [slave  keyboard (3)]

Ce qui m'intéresse, ce sont les deux claviers, donc les deux lignes suivantes :

       ↳ TypeMatrix.com USB Keyboard                 id=14   [slave  keyboard (3)]
       ↳ AT Translated Set 2 keyboard                id=16   [slave  keyboard (3)]


Chaque clavier a un identifiant, reste à faire l'association [id clavier] -> [disposition].

Pour cela, il suffit de taper les deux commandes suivantes :

   alex@yue ~> setxkbmap -device 14 -layout fr bepo
   alex@yue ~> setxkbmap -device 16 -layout fr oss

La commande s'utilise comme suit :

   setxkbmap -device <id> -layout <langue> <variante>

À noter : ces ID peuvent changer d'un démarrage à l'autre, voire même si on
débranche/rebranche le clavier.

Du coup, il va falloir scripter un peu :)

   #!/bin/bash
   #Permet de redéfinir à la volée les dispositions des claviers branchés.
   #Clavier du laptop : fr-oss
   #TypeMatrix, si branché : fr-bépo

   #Clavier de mon pc portable
   setxkbmap -device $(xinput --list --id-only "keyboard:AT Translated Set 2 keyboard") -layout fr oss

   #À noter, le TypeMatrix peut ne pas être présent.
   #Dans ce cas, on ne fait rien
   CL_TMx2030=$(xinput --list --id-only "keyboard:TypeMatrix.com USB Keyboard" | sed 's/[^0-9]//g')

   if [ -n "$CL_TMx2030" ]
   then
       setxkbmap -device $CL_TMx2030 -layout fr bepo
   fi

Rien de compliqué. On récupère les deux ID via xinput, puis on applique les
dispositions. Une petite variante pour le TypeMatrix. En effet, il vaut mieux
détecter sa présence, d'où le "sed" pour extraire la valeur numérique si le
clavier est branché.

Il ne reste plus qu'à appeler ce script dans l'autoexec de WMaker, ou via un
raccourci clavier, ou une entrée de menu.


Après, pourquoi s'embêter avec ça alors que je pourrais définir les deux
claviers en bépo ? Plusieurs raisons :

 * Dosbox (enfin, DOS, dans dosbox) ne reconnait pas le bépo.
 * Quand je suis en extérieur, je ne prends pas systématiquement mon TM.
 * Je suis absolument incapable de taper en bépo sur mon clavier azerty, et en azerty sur mon bépo.
 * Quand quelqu'un utilise mon ordi (famille…), il/elle est habitué(e) à la disposition azerty, et n'a pas le temps (ni l'envie) d'apprendre le bépo.