mardi 22 février 2011

Utiliser deux dispositions différentes de clavier simultanément

J'utilise un clavier avec disposition Dvorak. J'ai toujours un clavier avec disposition azerty branché sur ma machine pour les copains.

Un jour j'en ai eu assez de devoir faire une manipulation pour changer la disposition système du clavier à chaque fois que je tapais sur l'un ou l'autre des claviers.

J'ai fini par trouver une solution qui fonctionne sur une Ubuntu squeeze/sid pour que, lorsqu'on tape sur le clavier Dvorak, on utilise une disposition Dvorak et pour que, lorsqu'on tape sur le clavier azerty, on utilise une disposition azerty... le tout sans aucune manipulation.

Le principe est de définir des règles udev qui vont positionner le layout de chaque clavier séparément. Il faut donc pouvoir distinguer chacun de ces claviers. Pour cela j'utilise le couple vendor-id:product-id. Dans mon cas, j'ai :
  • un clavier USB Dell azerty avec vendor-id:product-id qui vaut 413c:2003 ;

  • un clavier USB TypeMatrix Dvorak avec vendor-id:product-id qui vaut ffff:8081.
Je veux que le clavier azerty ait un layout azerty et le clavier Dvorak un layout us_intl (oui, je sais, c'est bizarre mais c'est comme ça). Pour cela, je crée le fichier /etc/udev/rules.d/99-keyboards.rules avec le contenu suivant :


SUBSYSTEMS=="input",ACTION=="add",ENV{ID_VENDOR_ID}=="413c",ENV{ID_MODEL_ID}=="2003", RUN+="/usr/bin/logger configuring Dell keyboard"
SUBSYSTEMS=="input",ACTION=="add",ENV{ID_VENDOR_ID}=="413c",ENV{ID_MODEL_ID}=="2003", ENV{XKBLAYOUT}="fr"
SUBSYSTEMS=="input",ACTION=="add",ENV{ID_VENDOR_ID}=="413c",ENV{ID_MODEL_ID}=="2003", ENV{XKBVARIANT}="oss"
SUBSYSTEMS=="input",ACTION=="add",ENV{ID_VENDOR_ID}=="413c",ENV{ID_MODEL_ID}=="2003", ENV{XKBOPTIONS}=""

SUBSYSTEMS=="input",ACTION=="add",ENV{ID_VENDOR_ID}=="ffff",ENV{ID_MODEL_ID}=="8081", RUN+="/usr/bin/logger configuring TypeMatrix keyboard"
SUBSYSTEMS=="input",ACTION=="add",ENV{ID_VENDOR_ID}=="ffff",ENV{ID_MODEL_ID}=="8081", ENV{XKBLAYOUT}="us"
SUBSYSTEMS=="input",ACTION=="add",ENV{ID_VENDOR_ID}=="ffff",ENV{ID_MODEL_ID}=="8081", ENV{XKBVARIANT}="intl"
SUBSYSTEMS=="input",ACTION=="add",ENV{ID_VENDOR_ID}=="ffff",ENV{ID_MODEL_ID}=="8081", ENV{XKBOPTIONS}=""


Et hop ! Lorsque je branche mes deux claviers, le layout adéquate s'applique à chacun d'eux. Si je tape sur le clavier azerty, la touche 'a' écrit 'a'. Idem lorsque je tape sur mon clavier Dvorak :)

Si vous utilisez gnome, vous devez désactiver la gestion du clavier par gnome pour que cela fonctionne. Pour cela, lancez la commande gconf-editor et désactivez la clé /apps/gnome_settings_daemon/plugins/keyboard. Déconnectez-vous et reconnectez-vous pour que cela soit pris en compte.

Un bêmol : je ne sais pas pourquoi mais lorsque je redémarre ma machine ou lorsque je me déconnecte, je dois parfois débrancher puis rebrancher un clavier pour qu'il utilise la bonne disposition... si quelqu'un a la solution à ce problème, je suis preneur :)

Si vous ne connaissez pas le vendor-id:product-id de chacun de vos claviers, vous pouvez le découvrir avec la commande lsusb. Par exemple dans mon cas cette commande m'affiche :


$> lsusb
Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
...
Bus 007 Device 002: ID 046d:c00e Logitech, Inc. M-BJ58/M-BJ69 Optical Wheel Mouse
Bus 004 Device 004: ID 413c:2003 Dell Computer Corp. Keyboard
Bus 002 Device 004: ID ffff:8081
Bus 002 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
...


Cela me permet de déduire que mon clavier Dell est identifié par le couple vendor-id:product-id 413c:2003 et que mon clavier TypeMatrix est identifié par le couple ffff:8081 (oui, d'accord, celui-ci est plus difficile à reconnaitre mais j'ai quand même fini par deviner).

Merci à

3 commentaires:

  1. quel poseur tu fais avec ton clavier Dvorak !

    a+
    JP

    RépondreSupprimer
  2. Chez moi, ça marche avec un qwerty.

    Merci pour cette aide.

    RépondreSupprimer
    Réponses
    1. Ah, merci beaucoup!
      Je rencontre le même soucis que vous : nécessité de débrancher / rebrancher le bépo pour qu'il soit correctement reconnu…
      Sinon, ça marche parfaitement!

      Supprimer