Faire reconnaitre une touche (non standard) sous linux

En schématisant, sous GNU/Linux, le noyau prend en charge le clavier par le biais du module atkbd (pour les claviers AT), ce module transforme les scancodes envoyés par le clavier en keycodes auxquels sont attribués les actions.

Pour charger la map d’un clavier, on utilise loadmapkeys avec un fichier définissant la correspondance entre le keycode et l’action, par exemple avec un extrait du fichier /usr/share/kbd/keymaps/i386/azerty/azerty.map.gz:

keycode   1 = Escape           Escape
keycode   2 = ampersand        one              bar
 alt     keycode   2 = bar
keycode   3 = eacute           two              at

Ce qui précède est valable pour les consoles (tty), X agit différemment dans le sens ou il assigne les keycodes différemment mais nécessite néanmoins qu’un keycode existe au niveau système.

On en arrive à ce qui intéresse le plus… Pour des claviers comportant des touches non standards, il se peut que la correspondance scancode/keycode n’existe pas, il faut donc en définir une, pour cela, il suffit de surveiller les messages du noyau et utiliser la commande setkeycodes.

Exemple, pour la touche Media Direct d’un clavier DELL, une pression sur cette touche nous retourne dans /var/log/messages.log (le nom peut différer selon les distributions) ou en lancant dmesg:

atkbd.c: Unknown key pressed (translated set 2, code 0x92 on isa0060/serio0).
atkbd.c: Use 'setkeycodes e012 ' to make it known.

Pour lui définir un keycode:

setkeycodes e012 118

Le numéro du keycode est à choisir parmi les codes libres qu’on peut obtenir avec la commande suivante:

dumpkeys  | grep -e 'keycode [0-9]\+ =$' | more

Pour que cette action soit effective même après redémarrage, il faut rajouter la commande setkeycodes dans un fichier de démarrage tel que /etc/rc.local (diffère selon la distribution) par exemple.

Une fois ceci fait, on peut spécifier une action pour cette touche à l’aide de xmodmap ou xbindkeys, mais attention, sous X, le keycode diffère, pour le retrouver, vous pouvez utiliser xev ou xbindkeys -k.

Commentaire (1)