Apportez votre aide…
Ceci est une ancienne révision du document !
Comprendre la configuration du clavier
Le clavier et sa relation avec le système
Rappelons que les informations transmises par une touche du clavier au système (pilote clavier, noyau Linux et serveur X) ne sont pas directement liées au symbole graphique ou à l'évènement attaché à cette touche. Par exemple, l'appui sur la touche A de votre clavier ne signifie pas que ce clavier adresse à l'ordinateur quelque code que ce soit représentant le caractère A.
Ce qui est envoyé à l'ordinateur est en réalité une suite de valeur hexadécimales appelées « scan-codes » qui représentent la position physique de la touche sur le clavier et des informations précisant s'il s'agit de l'actionnement ou du relâchement de la touche. C'est le système d'exploitation qui va interpréter ces codes plus ou moins directement et transmettre aux applications un symbole de touche 1).
Ces symboles de touche 2) envoyés aux applications représentent :
- soit des caractères directement affichables, parmi lesquels les lettres et les chiffres ou divers symboles graphiques,
- soit des codes d'évènement ou de fonction que chacune des applications doit interpréter à sa manière.
Dans le détail, les « scan-codes » sont d'abord transformés en codes de touches 3) puis en symboles de touches 4) .
La deuxième étape de l'interprétation fait appel à une table de correspondance entre les codes de touches (qui sont invariants) et les symboles de touches. Cette table de correspondance qui représente la disposition des caractères sur les touches est appelée « agencement de clavier5) » .
Ainsi, si l'agencement choisi est US, la touche marquée A sur votre clavier sera interprétée comme un Q ; si l'agencement choisi est FR la touche sera interprétée comme un A.
Codes de touches (keycodes)
Il existe dans Ubuntu une table (visible ici) qui associe les codes de touche à des noms symboliques censés aider à repérer la touche sur le clavier.
Une ligne de ce fichier sera de la forme :
<AE01> = 10;
Ici cela signifie que la touche alphanumérique marquée du chiffre 1 6) est en première position (01) de la ligne E (les lignes sont numérotées de A à E en partant du coté de l'utilisateur et en allant vers l'écran 7) ) et a le code 10.
Une autre ligne de la forme :
<LFSH> = 50;
signifie que la touche majuscule de gauche a le code 50 (LF pour left = gauche et SH pour Shift =Maj) .
Pour faciliter l'utilisation des codes de touche 8) il existe également une table de correspondance (visible ici) qui associe au nom symbolique des touches un nom plus intelligible.
Voici un court extrait de la section "qwerty" de ce fichier:
xkb_keycodes "qwerty" { alias <LatQ> = <AD01>; alias <LatW> = <AD02>;
Pour autant que la section "qwerty" de ce fichier soit expressément spécifiée dans la configuration, la touche <AD01> pourra être désignée également par <LatQ>.
Conversion codes de touche -> symboles de touche
Il existe dans le dossier /usr/share/X11/xkb/symbols, des fichiers qui définissent des tables de correspondance entre les codes de touches et les symboles de touches pour les différentes langues, et dont les sections traitent des différentes variantes de clavier connues, comme par exemple le fichier /usr/share/X11/xkb/symbols/fr pour la langue française.
Ces tables, découpées en sections, se combinent selon des règles d'inclusion et d'ajout bien précises afin que le système puisse ainsi faire face à une combinatoire importante entre types de clavier, langues, variantes.
Pour le cas précis de la redéfinition d'une table de correspondance pour un clavier donné, une table linéaire 10) reprenant l'ensemble des touches sera suffisante.
Par ailleurs, parmi les différentes tables évoquées ci-dessus, celles sélectionnées par l'utilisateur, dans le dialogue des préférences clavier, se combinent au démarrage du système pour former ure table plus vaste dénommée carte du clavier 11).
Si vous n'avez sélectionné qu'une seule table, c'est à dire un seul agencement de clavier, la carte du clavier lui correspondra strictement bien entendu.
Lire la carte du clavier
Si vous voulez, voir la carte du clavier active correspondant à votre seul 12) agencement actuel, saisissez dans un terminal et entrez la commande suivante :
xmodmap -pke | less
Faites défilez les pages avec les flèches de changement de page.
Si vous désirez pouvoir examiner dans le détail cette carte, sauvegardez-là dans un fichier.
Par exemple, si vous souhaitez en disposer sur votre Bureau avec pour nom carte_active vous entrerez la commande :
xmodmap -pke > ~/Bureau/carte_active
.
Touches modificatrices (modifier keys)
Considérez la ligne suivante de la carte du clavier.
keycode 24 = a A æ Æ
Mettez en regard la ligne correspondante issue de la table de correspondance correspondant à votre agencement actuel.
Par exemple pour le clavier français, il s'agira du fichier /usr/share/X11/xkb/symbols/fr dans lequel vous observerez à la section "Autre" :
key <AD01> { [ a, A, æ, Æ ] }; // a A æÆ
Elle sont très cohérentes entre elles et cela paraît normal.
Maintenant, dans un éditeur de texte saisissez au clavier la combinaison de touches suivante, en vous basant sur la marquage du clavier, avec les espaces mais sans les parenthèses :
(A) (⇧+A) (Alt Gr+A) (Alt Gr+⇧+A)
Vous obtenez le résultat suivant :
a A æ Æ
Ceci correspond bien à la ligne de définition pour la lettre A du fichier fr et à celle de la carte de clavier active.
Notez que cette façon de réaffecter les touches par des commandes en ligne est perturbante dans la mesure où elle désynchronise la perception que vous avez de votre agencement par les outils graphiques et la réalité.
Nous observons donc par cet exemple, et c'est vrai pour d' autres touches, qu'un même code de touche peut être associé à plusieurs (ici quatre) symboles de touches et que ces symboles de touches sont obtenus en accompagnant l'appui sur la touche par maintien préalable d'autres touches, telles que ⇧, Alt Gr ou la combinaison des deux.
Les touches ⇧ et Alt Gr, qui ne produisent pas d'effet en elles-mêmes mais qui modifient le symbole de touche envoyé par la touche qui les accompagne, sont appelées touches modificatrices 13).
Ceci introduit la notion de niveau de touches avec ici :
- symbole de niveau 1 : a → accessible sans touche modificatrice
- symbole de niveau 2 : A → accessible avec la touche modificatrice ⇧
- symbole de niveau 3 : æ → accessible avec la touche modificatrice Alt Gr
- symbole de niveau 4 : Æ → accessible avec les touches modificatrice Alt Gr+⇧
Groupes
Pour comprendre la notion de groupe, allez maintenant dans le dialogue de préférence de clavier et ajoutez dans cet ordre :
- le clavier anglais US,
- le clavier US International
- le clavier Allemagne Macintosh.
L'indicateur de clavier s'affiche alors dans l'applet de notification général pour vous indiquer le clavier en usage et pour vous permettre d'en changer.
Fermez tous les fichiers précédemment ouvert (notamment le fichier /usr/share/X11/xkb/symbols/fr et votre fichier sauvegarde de carte de clavier ~/Bureau/carte_active ) puis dans un terminal saisissez de nouveau la commande :
xmodmap -pke > ~/Bureau/carte_active
Ouvrez cette sauvegarde de la nouvelle carte active et sélectionnez la ligne correspondant au keycode 24 pour visualiser ceci:
keycode 24 = a A q Q ae AE q Q adiaeresis Adiaeresis q Q guillemotleft guillemotright
Ce qui en clair correspond à :
keycode 24 | a | A | q | Q | æ | Æ | q | Q | ä | Ä | q | Q | « | » |
---|
Le principe de passage des tables de correspondance des différents agencements à la carte active dans le système est imagé ci-après:
Dans la terminologie du serveur X et de son extension XKB, un groupe correspond à l'ensemble des symboles d'un agencement, que l'on obtient par sélection avec l'indicateur de clavier ou une séquence de touche modificatrices. 14)
Mis à part, la particularité signalée dans la note ci-dessus, et en notant GiNj, i étant la valeur du Groupe et j celle du Niveau, la carte présente les données dans cette ordre:
G1N1 | G1N2 | G2N1 | G2N2 | G1N3 | G1N4 | G2N3 | G2N4 | G3N1 | G3N2 | G4N1 | G4N2 | G3N3 | G3N4 | G4N3 | G4N4 |
Principe de gestion du clavier par XKB
Schéma simplifié
Le schéma simplifié de la gestion du clavier par le serveur X avec son module XKB est donné par la figure suivante :
Sur ce schéma, vous remarquerez que :
- Le serveur X n'adresse pas lui même les symboles de touche aux applications. Ce sont Xlib et les toolkits qui le font en utilisant la carte du clavier vue précédemment et en se basant sur les "scancodes" et l'état du clavier contenus dans l'évènement transmis par le serveur X.
- Le serveur X gère une variable appelée état du clavier et communique cette information aux librairies. En pratique, pour gérer cet état du clavier, il utilise le code de touche qui, rappelons le, ne représente pas que des caractères, mais aussi des fonctions à exécuter.
État du clavier : modificateurs et numéro de groupe
Modificateurs
Nous avons vu plus haut que certaines touches du clavier étaient à l'origine du choix du symbole parmi ceux associés à un code de touche particulier. Pour que cela puisse se produire, il faut en réalité que deux conditions soient remplies :
- que le code de touche soit associé à un symbole bien précis,
- que ce symbole de touche soit mis en relation directe avec une des variables binaires de l'état du clavier.
Ainsi, par exemple, pour que la touche Alt gr provoque la sélection du symbole de touche de niveau 3, il faut que soient écrites dans les tables de symboles les lignes suivantes :
key <RALT> { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift ] }; modifier_map Mod5 {ISO_Level3_Shift };
Le symbole de touche ISO_Level3_Shift est le symbole associé au niveau 3.
La variable Mod5 est une des variables qui font partie de l'état du clavier et qui sont prises en compte dans l'interprétation du niveau par les liibrairies xlib. Ces variables sont appelées «Modificateurs».
Voir les modificateurs
Les modificateurs présents dans l'état du clavier transmis aux librairies sont les suivants :
Shift | Lock | Control | Mod1 | Mod2 | Mod3 | Mod4 |
Si vous voulez savoir à quelle fonction de modification sont associés ces modificateurs, saisissez dans un terminal la commande suivante:
xmodmap -pm
Le résultat devraient ressembler à ceci :
xmodmap: up to 4 keys per modifier, (keycodes in parentheses): shift Shift_L (0x32), Shift_R (0x3e) lock Caps_Lock (0x42) control Control_L (0x25), Control_R (0x69) mod1 Alt_L (0x85), Meta_L (0xcd) mod2 Num_Lock (0x4d) mod3 mod4 Super_L (0x40), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf) mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
On peut voir ici entre autres, que le modificateur shift est associé aux touches qui sont elles mêmes associées aux symboles Shift_L 15) et Shift_R 16) et que le passage en niveau 3 se fait par la touche que est associée au symbole ISO_Level3_Shift.
Numéro de groupe
Nous avons vu plus haut, que la table de clavier est divisée en groupes et que dans chacun des groupes, les modificateurs permettent de sélectionner le bon niveau. Il faut donc, et c'est le cas, que l'état du clavier comprenne une information sur le numéro de groupe.
Définition des touches
Types de touche
Fondamentalement, un type de touche précise la manière dont sont pris en compte les modificateurs pour sélectionner le symbole de touche parmi tous ceux qui, classés par niveaux, font partie de sa définition. Les fichiers définissant les différents types de touche, sont placés dans le dossier /usr/share/X11/xkb/types.
Voici, pour illustrer un exemple de définition de type :
type "ALPHABETIC" { modifiers = Shift+Lock; map[Shift] = Level2; map[Lock] = Level2; level_name[Level1] = "Base"; level_name[Level2] = "Caps"; };
D'une façon plus générique, la définition la plus riche d'un type de touche a la forme suivante :
'type 'NomDeType '{' Instructions '}; et on peut rencontrer les instructions suivantes :
modifiers = liste de modicateurs;17)
map[combinaison de modificateurs 18)] = nom du niveau;19)
level_name[nom normalisé] = nom symbolique libre; 20)
preserve[…] = …; 21)
Voici pour terminer un type couramment rencontré :
type "FOUR_LEVEL_ALPHABETIC" { modifiers = Shift+Lock+LevelThree; map[None] = Level1; map[Shift] = Level2; map[Lock] = Level2; map[LevelThree] = Level3; map[Shift+LevelThree] = Level4; map[Lock+LevelThree] = Level4; map[Lock+Shift+LevelThree] = Level3; level_name[Level1] = "Base"; level_name[Level2] = "Shift"; level_name[Level3] = "Alt Base"; level_name[Level4] = "Shift Alt"; };
La définition proprement dite des touches
Règles d'écriture des fichiers de configuration
Règles de fusion / imbrication des fichiers
Syntaxe structurelle des fichiers
Démarche d'écriture de son agencement personnalisé
include "level3(ralt_switch)"
Celle-ci renvoie à la section ralt_switch du fichier level3 du même dossier, dont voici le contenu.
default partial modifier_keys xkb_symbols "ralt_switch" { key <RALT> { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift ] }; modifier_map Mod5 { ISO_Level3_Shift }; };
Contributeurs: jaaf64