Programmer une touche clavier sous Linux (console et X11)

Qing Liu (qliu@club-internet.fr), version 0.4, 24 août 2003

J'ai un clavier Internet Explorer Pro avec des "extra-touches": touches de navigation "précédent, suivant" etc, touches de fonctions "calcul, veille"... Autant que je sache, ces touches ne sont pas reconnues par les applications sous Linux. Le présent document explique comment exploiter ces touches.

1. En mode console

Il est possible d'associer une commande à une touche. Dans l'exemple qui suit, nous allons associer à la touche "veille" la commande apm -s. Il va sans dire que cela vaut également pour une touche normale. Malheureusement, le système (inittab) n'accepte qu'une touche programmée.

1.1 Repérer le code clavier de la touche

Passer en mode console Ctrl-Alt-F1 et taper
$ showkey -s
Si vous voulez programmer une touche ordinaire, par exemple la touche "windows", showkey tout court suffit. Vous voyez
0xe0 0x5f 0xe0 0xdf
Le code à retenir est e05f (qui vient de 0xe0 et de 0x5f).

1.2. Intégrer le code dans la carte clavier (keymap)

Imaginons que la carte clavier que nous utilisons soit fr-latin1. On peut vérifier avec
    grep -rs loadkeys /etc/*
ou
    rgrep loadkeys /etc/* 2>/dev/null
Un petit "locate fr-latin1" permet de trouver où se cache le fichier fr-latin1.map. S'il est compressé, il faut le décompresser avant de l'éditer (et le recompresser avec gzip après l'édition, si on veut). Dans ce fichier on doit d'abord repérer un code non attribué. Par exemple, on voit qu'il n'y a aucune ligne contenant 90. On y ajoute alors une ligne "keycode 90 = KeyboardSignal":
...
keycode 86 = less greater bar
      alt keycode 86 = Meta_less
keycode 90 = KeyboardSignal
keycode 97 = Control
Maintenant il faut dire au système de transformer le scan code e05f en ascii code 90:
# /usr/bin/setcodekeys e05f 90
(vérifier que le chemin de setkeycodes est le bon). Pour éviter de le refaire chaque fois, on peut inserrer cette ligne dans un script de démarrage, par exemple rc.local.

1.3. Modifier inittab

Ajouter une ligne dans /etc/inittab:
bzz::kbrequest:/sbin/apm -s
Ici bzz est pris au hasard. Il peut être n'importe quelle chaîne de moins de 4 caractères non utilisée dans inittab. man inittab pour plus de détail. Il n'y a plus qu'à taper
# telinit q
pour prendre en compte la modification de /etc/inittab. Si tout se passe bien, l'appuie sur la touche "veille" provoque la mise en veille du système.

2. Sous X11: XBindKeys

Ce programme permet d'associer une action à n'importe quelle combinaison de touches (y compris les extra-touches) sous X11. Je vous encourage à consulter d'abord la documentation fournie par l'auteur pour l'installation et la configuration.

2.1 Installation

Télécharger ce programme de Philippe Brochard sur http://hocwp.free.fr/xbindkeys/xbindkeys.fr.html. Ensuite:
    $ tar xvfz xbindkeys-1.5.5.tar.gz
    $ cd xbindkeys-1.5.5
    $ ./configure && make && su -c 'make install'
Des packages .deb et rpm sont également disponibles sur le site.

2.2. Configuration

Une fois les binaires et manuels installés:
    $ xbindkeys --defaults > ~/.xbindkeysrc 
pour créer un embryon de fichier de configuration. Éditer ce fichier pour voir si les raccourcis par défault vous conviennent. Personnellement, j'ai commenté (supprimé) le raccourci Ctrl-f:
    # set directly keycode (here control + f with my keyboard)
    # "xterm &"
    #  c:41 + m:0x4
car il m'empêche d'utiliser normalement mon emacs ! C'est-à-dire que sous emacs, Ctrl-f ouvre un xterm au lieu de me proposer d'ouvrir un fichier. Pour créer vos propres raccourcis, rien de plus simple:
 
    $ xbindkeys -k
    Press combination of keys or/and click under the window.
    You can use one of the two lines after "NoCommand"
    in $HOME/.xbindkeysrc to bind a key.
    "NoCommand"
        m:0x10 + c:236
        Mod2 + NoSymbol
(j'ai appuyé sur la touche "Courrier" de mon clavier Internet Explorer Pro). Le cas échéant, il faut amener le focus de la souris dans la petite fenêtre [XBindKeys] pour que la frappe des touches prennent effet. Maintenant, il suffit d'ajouter les lignes
    "emacs -f rmail &" 
       m:0x10 + c:236
dans ~/.xbindkeys. Quand le daemon xbindkeys sera en action (voir ci-dessous), l'appuie de la touche "Courrier" lancera emacs avec l'option -f rmail (pour les ignares :), c'est le lecteur de courriels sous emacs). La touche "Calcul" donne
   "NoCommand"
        m:0x10 + c:161
        Mod2 + NoSymbol
On peut lui associer par exemple
    "xcalc &" 
       m:0x10 + c:161
Si vous voulez créer des raccourcis pour plusieurs touches (ou combinaisons de touches), utilisez xbindkeys -mk au lieu de xbindkeys -k.

2.3. Utilisation

Pour que les raccourcis configurés dans ~/.xbindkeysrc soient utilisables, il faut lancer le daemon xbindkeys. On peut mettre la commande dans ~/.xinitrc si X démarre par startx ou dans ~/.xsession si X démarre en xdm (login graphique). Il est déconseillé de lancer xbindkeys en tant que root pour des questions de sécurité éventuelles. Noter que si l'on modifie ~/.xbindkeysrc en cours de route, la commande
    $ killall -1 xbindkeys
permet de faire prendre en compte les modifications.

ATTENTION: À mon avis, il vaut mieux éviter d'utiliser trop de raccourcis par XBindKeys. En effet, ces raccoucis priment sur ceux de vos applications et cela pourraient provoquer des confusions si on n'y prête pas suffisamment attention (cf. le coup de Ctrl-f/emacs ci-dessus).

3. Sous X11: Lineak

Lineak pour LInux Easy Access Keyboard. Il a les mêmes vocations que XBindKeys. Je n'ai pas testé ce programme car je n'ai plus de clavier à touches spéciales. Consulter le site du programme.

Remerciements

Je remercie Stéphane Écolivet qui m'a indiqué les démarches à suivre pour la programmation des touches en console, Frédéric Loiret pour m'avoir signalé l'existence du programme xbindkeys, et Pierre Jarillon pour ses commentaires sur ce texte.