Cette page est en cours de rédaction.
Apportez votre aide…

Ceci est une ancienne révision du document !



Page en élaboration

Comprendre la configuration du clavier

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>.

Il n'y a normalement pas lieu de toucher à ces fichiers. Signalons également que tous les constructeurs n'utilisent pas tous le même code pour une touche placée au même endroit, d'où le besoin d'un fichier de codes de touche 9) par type de clavier.

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 avez actuellement plusieurs agencements de clavier, et pour pouvoir faire les manipulations proposées ici, n'en conservez qu'un pour le moment. France Autre pour cet exemple. Supprimez les autres dans le dialogue des préférences de 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) 
⇧représente la touche majuscule et + indique que les deux ou trois touches doivent être pressées une par une et maintenues jusqu'à ce que la dernière soit frappée.

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.

La "carte du clavier", rangée dans le fichier carte_active, ne correspond à la table fr section "Autre" que si des réaffectations de touches n'ont pas été faite par des commandes en lignes.
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).

En réalité, les touches ne sont pas modificatrices par elles-même. C'est plutôt le symbole de touche qui leur est attaché qui l'est. Aussi ces touches peuvent-elles être changées pour d'autres. Nous verrons plus loin dans cette page également, que pour être modificateur, ces symboles doivent être mis en relation avec certaines variables qui font partie de l'état du clavier qui est transmis aux librairies chargées de la transformation des scan-codes en symboles de touche.

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+⇧

L'mage suivante illustre cet aspect des choses :

Groupes

Pour comprendre la notion de groupe, allez maintenant dans le dialogue de préférence de clavier et ajoutez dans cet ordre :

  1. le clavier anglais US,
  2. le clavier US International
  3. 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)

Notez au passage, que les niveaux 3 et 4 n'étant pas présent dans la table du clavier US, ces niveaux sont aussi omis dans la carte active. Ceci rend la lecture de cette carte un peu plus difficile.

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

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 :

  1. que le code de touche soit associé à un symbole bien précis,
  2. 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 :

ShiftLockControlMod1Mod2Mod3Mod4

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";
    };
On observera que dans les modificateurs apparaissent des noms qui ne font pas partie de la liste des modificateurs cités plus haut qui sont normalement transmis dans l'état du clavier. Ces modificateurs, à usage réservé de xkb, sont appelés modificateurs virtuels. xkb les utilise en réalité pour établir l'état du clavier dont justement les modificateurs standards encore appelés : modificateurs réels. Cet aspect sera détaillé lorsque sera abordé la définition même des touches.

La définition proprement dite des touches

À compléter
À compléter

Règles de fusion / imbrication des fichiers

À compléter

Syntaxe structurelle des fichiers

À compléter
À compléter
Texte à replacer à ignorer pour le moment Si vous regardez la fin de la variante «France» du fichier fr dans le dossier /usr/share/X11/xkb/symbols, vous y verrez la ligne suivante :
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


1)
keysymbol
2)
keysymbols
3)
keycodes
4)
keysymbols
5)
keyboard layout
6)
sur un clavier typematrix
7)
Du moins pour ce qui est des caractères imprimables, c'est à dire en excluant les lignes qui ne comprennent que des caractères de contrôle.
8)
keycodes
9)
association des nunéros de code aux noms symboliques
10)
Ce qui veut dire ici sans combinaison avec d'autres table par inclusion par exemple.
11)
keymap en anglais.
12)
compte tenu de la note ci-dessus
13)
modifier keys
14)
Au démarrage du système il s'agit de ⇧+ Ver Maj. Si vous souhaitez changer cette combinaison, reportez-vous à la section Passer rapidement d'un agencement à l'autre de la page « Configurer le clavier ».
15)
touche majuscule de gauche
16)
touche majuscule de droite
17)
il s'agit de la liste des modificateurs qui sont repris dans la définition du type.
18)
C'est la combinaison de modificateurs qui va valider le niveau dont le nom est donné à droite du signe égal.
19)
Les noms reconnus par le programme xmodmap sont Level1, Level2…,Level8. Au delà il faut utiliser une valeur numérique, mais il y a peu de chances que vous en ayez besoin.
20)
Bien que xkb ne fasse aucun usage de ces noms symboliques. ils sont néanmoins requis. Ils servent dans l'affichage des agencements.
21)
Reportez vous aux documentations citées en référence pour des éclaircissement sur cette instruction dont la compréhension est difficile aux non programmeurs, et n'est pas indispensable ici.
  • tutoriel/comprendre_la_configuration_du_clavier.1313851948.txt.gz
  • Dernière modification: Le 15/12/2011, 15:21
  • (modification externe)