lundi 6 septembre 2010 13 h 25 CEST


Constatation: Logitech n'a rien prévu pour linux ni dans la doc, ni dans le cdrom, ni sur le site de Logitech.

Configuration du support du clavier Logitech Media Keybord Elite

Il va tout d'abord nous falloir indiquer le bon modèle de clavier à xorg, par l'option XkbModel dans la section InputDevice de votre fichier de configuration xorg (/etc/X11/xorg.conf) :

Option "XkbModel" "logimedia"

Ensuite, comme ce modèle de clavier n'existe pas (encore) nativement dans xorg, il va falloir le créer.

Auparavant il faut espionner le clavier pour savoir quel sont les touches qui ne sont pas encore prises en compte.

Pour cela il y a l'utilitaire xev. Donc on appelle xev depuis une console.

xev

Puis on appui sur les touches, cela doit faire apparaitre une ligne avec une valeur "keycode" dans la console.

KeyPress event, serial 26, synthetic NO, window 0x2e00001, root 0x5c, subw 0x0, time 2859246907, (667,272), root:(745,371), state 0x10, keycode 230 (keysym 0x1008ff30, XF86Favorites), same_screen YES, XLookupString gives 0 bytes: XmbLookupString gives 0 bytes: XFilterEvent returns: False

Ce qui nous intérresse ce sont les touches qui ne renvoient rien dans "xev" du au fait que le kernel n'a pas connaissance de ces touches.

Dans mon cas:

Pour ajouter le support de ces touches il faut les scanner via syslog.on ouvre une console et:

sudo tail -f /var/log/syslog

Quand on appuie sur une des touches par exemple "disquette" qui serait pas mal pour lancer des sauvegarde, on obtient:

Unknown key pressed (translated set 2, code 0xc2 on isa0060/serio0). Use 'setkeycodes e042 <keycode>' to make it known.

La valeur e042 annoncée est le "scancode" de la touche, en effet, quand on appuie sur une touche le controleur du clavier envoie un "scancode" au pilote clavier du noyau, c'est ce qui est affiché par syslog si le scancode est inconnu, il faut maintenant affecter un "keycode" à nos "scancode".

Pour cela comme le dit le message du noyau, il faut utiliser la commande setkeycodes. On vas cependant vérifier les "keycodes" disponibles avec la commande getkeycode pour cela un petit script bash:

#!/bin/bash #getFreeKeycodes IFS=$'\n ' ; for i in $(getkeycodes | grep "[0-9]:" | cut -d ":" -f 2) do echo $i done | sort | uniq > /tmp/list.codes for ((i=80;i>=255;i++)) do if grep -E "^$i$" list.codes > /dev/null then true else echo "$i" fi done > /tmp/free.codes cat /tmp/free.codes

sudo getFreeKeycodes

Tout les "keycodes" affichés ne sont pas utilisé et peuvent être réquisitionné pour la cause.

On les associe aux "scancodes" dans un petit script bash que voilà:

sudo vim /lib/udev/setLogiMediiaEliteKeycodes

#!/bin/bash #XF86ZoomIn /usr/bin/setkeycodes 6a 234 #XF86Go /usr/bin/setkeycodes 6b 235 #XF86ZoomOut /usr/bin/setkeycodes e004 132 #XF86Messenger /usr/bin/setkeycodes e011 145 #XF86Support /usr/bin/setkeycodes e03b 236 #XF86Word /usr/bin/setkeycodes e03c 237 #XF86Excel /usr/bin/setkeycodes e03d 238 #XF86OfficeHome(Impress) /usr/bin/setkeycodes e03e 239 #XF86Back /usr/bin/setkeycodes e03f 240 #XF86Forward /usr/bin/setkeycodes e040 241 #XF86TaskPane(scan or print) /usr/bin/setkeycodes e041 242 #XF86Send(to backup) /usr/bin/setkeycodes e042 243 #XF86LaunchA /usr/bin/setkeycodes e043 244 #XF86LaunchB /usr/bin/setkeycodes e044 245 #XF86LaunchC /usr/bin/setkeycodes e057 246 #XF86LaunchD /usr/bin/setkeycodes e058 247 #XF86Option (mode button) #/usr/bin/setkeycodes e05a 248 exit 0

chmod +X pour le rendre executable bien sur, et pour lancer ce script, rien de tel qu'une régle udev liée uniquement à ce clavier.

pour avoir des info de /proc sur le périférique.

cat /proc/bus/input/devices

Ce qui nous permet d'en déduire la ligne de chemin pour udevinfo

udevinfo -ap /sys/class/input/input0

looking at device '/class/input/input0': KERNEL=="input0" SUBSYSTEM=="input" SYSFS{uniq}=="" SYSFS{phys}=="isa0060/serio0/input0" SYSFS{name}=="AT Translated Set 2 keyboard" looking at device '/devices/platform/i8042/serio1': ID=="serio1" BUS=="serio" DRIVER=="atkbd" SYSFS{softraw}=="1" SYSFS{softrepeat}=="0" SYSFS{set}=="2" SYSFS{scroll}=="0" SYSFS{extra}=="0" SYSFS{bind_mode}=="auto" SYSFS{modalias}=="serio:ty06pr00id00ex00" SYSFS{description}=="i8042 Kbd Port" looking at device '/devices/platform/i8042': ID=="i8042" BUS=="platform" DRIVER=="i8042" looking at device '/devices/platform': ID=="platform" BUS=="" DRIVER==""

Et voila notre régle udev

sudo vim /etc/udev/logimediaelitekeyboard.rules

# règle pour le clavier logitech media elite # lance le paramétrage des scancodes Bus=="input",SYSFS{phys}=="isa0060/serio0/input0", SYSFS{name}=="AT Translated Set 2 keyboard", PROGRAM="setLogiMediaEliteKeycodes"

On crée un lien relatif dans rules.d:

sudo ln -s /etc/udev/logimediaelitekeyboard.rules /etc/udev/rules.d/001_logimediaelitekeyboard.rules

Au redémarrage d'udev elle sera prise en compte.

Pour que les touches soient reconnues, il faut associer leur "keycode" avec un nom de touche générique connu par Xorg. Ces noms de touches sont listés dans le fichier /usr/share/X11/XKeysymDB.

On va modifier la base des claviers et ajouter le notre dans lequel on va définir ces fameuses correspondances....

On passe à l'ajout du clavier dans Xorg

sudo vim /usr/share/X11/xkb/symbols.dir

on ajoute la ligne logimediaelite

--p----- a------- inet(logiik) --p----- a------- inet(logimediaelite) --p----- a------- inet(itouch)

sudo vim /usr/share/X11/xkb/rules/xorg

logiinkse logiinkseusb logiitc logiik logimediaelite itouch logiultrax \

sudo vim /usr/share/X11/xkb/rules/xorg.lst

logiik Logitech Internet Keyboard logimediaelite Logitech Media Keyboard Elite itouch Logitech iTouch

sudo vim /usr/share/X11/xkb/rules/xorg.xml

<model> <configItem> <name>logimediaelite</name> <description>Logitech Media Keyboard Elite</description> <description xml:lang="en_GB">Logitech Elite Multimedia Keyboard</description> <description xml:lang="fr">clavier Logitech Elite Multimedia</description> </configItem> </model>

Dans inet on défini l'évenement associé a la valeur du code de la clé dans la base XFree86, que l'on trouve mpar rapport a celle donné par xev.

/usr/share/X11/xkb/keycodes/xfree86

sudo vim /usr/share/X11/xkb/symbols/inet

// Logitech media elite partial alphanumeric_keys xkb_symbols "logimediaelite" { // key <I01> { [ XF86AudioMedia ] }; key <I02> { [ XF86WWW ] }; key <I10> { [ XF86AudioPrev ] }; key <I15> { [ XF86Community ] }; key <I16> { [ XF86ScrollClick ] }; key <I19> { [ XF86AudioNext ] }; key <I20> { [ XF86AudioMute ] }; // key <I21> { [ XF86VendorHome ] }; key <I22> { [ XF86AudioPlay, XF86AudioPause ] }; key <I24> { [ XF86AudioStop ] }; key <I2E> { [ XF86AudioLowerVolume ] }; // key <I2F> { [ XF86AudioRaiseVolume ] }; key <I30> { [ XF86AudioRaiseVolume ] }; key <I32> { [ XF86HomePage ] }; key <I3B> { [ XF86New ] }; key <I3C> { [ XF86Reply ] }; key <I43> { [ XF86MyComputer ] }; key <I44> { [ XF86Documents ] }; key <I57> { [ XF86Pictures ] }; key <I58> { [ XF86Music ] }; key <I5F> { [ XF86Standby ] }; key <I65> { [ XF86Search ] }; key <I66> { [ XF86Favorites ] }; key <I6A> { [ XF86Back ] }; key <I6C> { [ XF86Mail ] }; key <I6D> { [ XF86AudioMedia ] }; key <I21> { [ XF86Calculator ] }; key <K68> { [ XF86Messenger ] }; key <I0C> { [ XF86ZoomOut ] }; key <I70> { [ XF86Go ] }; key <I55> { [ XF86ZoomIn ] }; key <I71> { [ XF86Support ] }; key <I72> { [ XF86Word ] }; key <I73> { [ XF86Excel ] }; // key <KPEQ> { [ XF86OfficeHome ] }; // key <SYRQ> { [ XF86Back ] }; // key <K76> { [ XF86Forward ] }; //key <LSGT> { [ XF86TaskPane ] }; // key <FK11> { [ XF86Send ] }; // key <FK12> { [ XF86LaunchA ] }; // key <AB11> { [ XF86LaunchB ] }; // key <HYPR> { [ XF86LaunchC ] }; // key <U7F> { [ XF86LaunchD ] }; };

On ajoute la section du clavier dans X.

sudo vim /etc/X11/xorg.conf

Section "InputDevice" Identifier "Logitech Media Keyboard Elite" Driver "kbd" Option "CoreKeyboard" Option "XkbRules" "xorg" Option "XkbModel" "logimediaelite" Option "XkbLayout" "fr" EndSection

Et le clavier dans la section serveur

Section "ServerLayout" Identifier "Default Layout" Screen "Default Screen" InputDevice "Logitech Media Keyboard Elite" InputDevice "Logitech MX310" EndSection

fermer la session, et relancer X

Maintenant, certaines touches de votre clavier sont déjà utilisables dans le Windows Manager.

Associer des actions aux touches.

Sous Gnome, l'outil de préférence "Raccourcis clavier" affiche les raccourcis par défaut. Vous pouvez personnaliser ceux-ci afin de les adapter à vos besoins.

Bureau-<Préférences-<Raccourcis clavier

Pour modifier un raccourci,cliquez sur la ligne correspondante et saisissez un nouveau raccourci, ou pressez "Retour Arrière" pour l'éffacer.

Pour définir toutes autres commandes, non prévu par gnome, ca ce fait par metacity:

Applications-<Outils système-<Editeur de configuration

Aller dans apps -< metacity -< keybinding_commands et éditer une clef vide, par exemple "command_1", en lui attribuant la commande.

Toujours dans l'arborescence de metacity, aller dans global_keybindings et éditer la clef run_command_1 en lui attribuant la combinaison de touche, par exemple:

xsane -V epson:/dev/sg0

Remarque on peut ajouter de nouvelles clés, voila c'est tout.