{{tag>tutoriel clavier BROUILLON}} ---- ====== 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|noyau Linux]] et [[:xorg|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 valeurs 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** (( //keysymbol// )). Ces symboles de touche (( //keysymbols// )) 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** (( //keycodes// )) puis en **symboles de touches** ((// keysymbols// )) .\\ 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 clavier**((//keyboard layout//)) » .\\ 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 qui associe les codes de touche à des **noms symboliques** censés aider à repérer la touche sur le clavier. Un exemple de ce type de table de correspondance est [[:tutoriel:comment_modifier_un_fichier|visible dans le fichier]] [[file:///usr/share/X11/xkb/keycodes/evdev|/usr/share/X11/xkb/keycodes/evdev]] et dans lequel vous verrez différentes lignes de la forme : = 10; Ici cela signifie que la touche **A**lphanumérique marquée du chiffre //1// ((sur la rangée de chiffres au dessus des lettres sur un clavier [[http://bepo.fr/wiki/TypeMatrix|Typematrix]].)) 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 ((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.)) ) et a le code **10**.\\ Une autre ligne de la forme : = 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 de certains codes de touche (( //keycodes// )), il existe également un fichier [[file:///usr/share/X11/xkb/keycodes/aliases|/usr/share/X11/xkb/keycodes/aliases]] qui associe au nom symbolique des touches un nom plus intelligible appelé **alias**.\\ Voici par exemple un court extrait de la section "qwerty" : xkb_keycodes "qwerty" { alias = ; alias = ; Pour autant que la section "qwerty" de ce fichier soit expressément spécifiée dans la configuration, la touche pourra être désignée également par . Il n'y a normalement pas lieu de toucher aux fichiers contenus dans le dossier **/usr/share/X11/xkb/keycodes**. En effet, les codes émis par les touches ne sont pas modifiables. S'il existe de nombreux fichiers associant ces numéros de code aux noms symboliques' c'est parce que les constructeurs n'utilisent pas tous le même code pour une touche placée au même endroit. Il y a donc besoin d'un tel fichier pour chacun des types 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 [[file:///usr/share/X11/xkb/symbols/fr|/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 ((C'est à dire ici sans combinaison avec d'autres table par inclusion par exemple.)) reprenant l'ensemble des touches peut suffire. 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 une table plus vaste dénommée **carte du clavier** ((keymap en anglais.)). Si vous n'avez sélectionné qu'une seule table, c'est à dire un seul [[:tutoriel:configurer_le_clavier|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 ((compte tenu de la note ci-dessus)) agencement actuel, saisissez dans un [[:terminal]] la [[:commande_shell|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 trouverez, à la section "Autre", la ligne suivante : key { [ a, A, æ, Æ ] }; // a A æÆ Elles 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é faites par des commandes en ligne.\\ 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é. Vous observerez 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 touche et que ces symboles de touche 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** (( //modifier keys// )). 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. Vous verrez plus loin dans cette page, que pour être modificateur, ces symboles doivent être mis en relation avec certaines variables faisant 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'image suivante illustre cet aspect des choses : {{ :tutoriel:niveaux_de_touche.jpg?200 |}} === Groupes === Pour comprendre la notion de groupe, allez maintenant dans le dialogue des préférences 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 ouverts (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_shell|commande]] : xmodmap -pke > ~/Bureau/carte_active [[:tutoriel:comment_modifier_un_fichier|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: {{ :tutoriel:groupes_et_niveaux.jpg?400 |}} Dans la terminologie du [[:xorg|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. (( 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 << [[:tutoriel:configurer_le_clavier#passer_rapidement_d_un_agencement_a_l_autre|Configurer le clavier]] >>. )) 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 **G**roupe et **j** celle du **N**iveau, la carte présente les données dans cet 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 [[:xorg|serveur X]] avec son module XKB est donné par la figure suivante : {{ :tutoriel:serveurx-clavier2.jpg?400 |}} 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 === Vous avez vu précédemment 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 { 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 librairies 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|Mod5 Si vous voulez savoir à quelle fonction de modification sont associés ces modificateurs, saisissez dans un [[:terminal]] la [[:commande_shell|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) Vous pouvez voir ici entre autres, que le modificateur shift est associé aux touches qui sont elles mêmes associées aux symboles Shift_L ((touche majuscule de gauche)) et Shift_R ((touche majuscule de droite)) et que le passage en niveau 3 se fait par la touche qui est associée au symbole ISO_Level3_Shift. Pour que les modificateurs Mod1 à Mod5 aient un effet déterminé sur le choix du symbole de touche, il faut qu'ils soient mis en correspondance avec un symbole de touche modificateur, par une instruction du type : modifier_map Mod2 { Num_Lock }; ou d'une façon plus générique : modifier_map nomModficateur { NomSymbole }; Des exemples de symboles de touche possédant une fonction modificatrice sont : ISO_Level3_Shift, Num_Lock, ISO_Level5_Shift, Caps_Lock…\\ Le fichier [[file:///usr/include/X11/keysymdef.h|/usr/include/X11/keysymdef.h]] présente tous les symboles de touche utilisés dans le système ; les symboles de touche à fonction modificatrice y apparaissent dans des sections repérées par le titre «modifiers». === Numéro de groupe === La table de clavier étant divisée en [[#groupes]], il faut donc que l'état du clavier comprenne une information sur le numéro de groupe pour le sélectionner. Cette information est bien présente dans l'état du clavier, à coté des [[#modificateurs]] qui, pour leur part, permettent de sélectionner le bon niveau. ====Définition des touches==== === Types de touche === Le 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 différents types de touches sont définis dans les fichiers placés dans le dossier **/usr/share/X11/xkb/types** et sont de la forme type 'NomDeType '{' Instructions '};. Parmi les instructions, on peut rencontrer les instructions suivantes : * modifiers = : il s'agit de la liste des modificateurs qui sont repris dans la définition du type. * map[] = : c'est la combinaison de modificateurs correspondant au nom du niveau indiqué. \\ Les noms reconnus par le programme xmodmap vont de Level1 à Level8. Au delà il faut utiliser une valeur numérique, mais il y a peu de chances que vous en ayez besoin. * level_name[] = : xkb ne fait aucun usage de ces noms symboliques, mais ils sont néanmoins requis. Ils servent dans l'affichage des agencements. * preserve[...] = ... : Reportez vous aux documentations citées en référence (( Voir en bas de page)) pour des éclaircissements sur cette instruction dont la compréhension est difficile aux non programmeurs, et n'est pas indispensable ici.\\ Voici 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"; }; S'agissant ici de touches purement alphabétiques, il n'y a besoin que de la définition des symboles de touche affectés aux différents niveaux standards, soit deux niveaux seulement. Et 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 (comme LevelThree) 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, en particulier l'état des modificateurs qui en font partie. Ces modificateurs standards sont aussi appelés : **modificateurs réels**. Cet aspect sera détaillé lorsque sera abordée la définition même des touches. xkb attache aux touches, les types par défaut suivants : * ONE_LEVEL ((1 niveau )) : pour les touches qui ne possèdent qu'un seul symbole et qui est indépendant des modificateurs. Par exemple Enter, Escape, Space, etc... * TWO_LEVEL ((2 niveaux)) : pour les touches à deux niveaux non alphabétiques. Le deuxième niveau est choisi par le modificateur //Shift// mais ne fait pas intervenir le modificateur //Lock//. Des exemples de telles touches sont sur un clavier AZERTY standard: //1/€€//, * ALPHABETIC : pour les touches alphabétiques. Elles possèdent deux niveaux également mais sont dépendantes de //Shift// **et** de //Lock//. * "KEYPAD" (( littéralement : pavé de touches, encore appelé «pavé numérique»)): Il s'agit de touches supplémentaires, sur certains claviers, regroupées en carré comprenant le plus souvent les touches numériques et les touches de direction. Elles ont deux niveaux aussi, mais dépendent de //Shift// **et** de //NumLock//. //NumLock// est un symbole de touche qui, lorsqu'il est attaché à un des modificateurs standards Mod1 à Mod5, lui confère une fonction de verrouillage de la fonction numérique des touches du pavé. ===La définition proprement dite des touches=== Chacun des fichiers contenus dans le dossier **/usr/share/X11/xkb/symbols** a le contenu suivant key codeDeTouche {description}; où //codeDeTouche// est le code de la touche tel qu'[[#Codes de touches (keycodes) |expliqué plus haut]], de la forme **** et où la partie entre accolades comprend la définition proprement dite. Cette définition peut porter sur de nombreux paramètres qu'il est difficile de présenter tous ici sans entrer dans des considérations complexes qui dépassent le besoin de ce tutoriel.\\ Pour une présentation exhaustive reportez-vous aux documents cités en référence en fin de page. [[:tutoriel:comment_modifier_un_fichier|Ouvrez]] par exemple le fichier **/usr/share/X11/xkb/symbols/latin** pour y trouver des définitions de touches sous la forme suivante : key { [ q, Q, at, Greek_OMEGA ] }; key { [ w, W, lstroke, Lstroke ] }; key { [ e, E, e, E ] }; key { [ r, R, paragraph, registered ] }; key { [ t, T, tslash, Tslash ] }; key { [ y, Y, leftarrow, yen ] }; Il s'agit ici de la déclaration de simples touches alphabétiques pour laquelle sont indiqués les symboles de touche des quatre niveaux qu'elle prévoit. Vous pourrez également trouver dans certains fichiers des lignes attribuant à la touche un [[#type]] qui aura été renseigné dans un des fichiers du dossier **/usr/share/X11/xkb/types** et qui auront la forme type = ..., or type[numéroGroupe] = ... par exemple type[Group1]="ONE_LEVEL",type[Group2]="TWO_LEVEL", Si vous souhaitez inclure un type personnel dans une configuration particulière du clavier, prenez exemple sur les types décrits dans les fichiers du dossier **/usr/share/X11/xkb/types**. Vous noterez par ailleurs que les fichiers de symboles ne comprennent en général qu'un seul groupe et que les différents groupes de la carte du clavier sont formés à partir de chacun de ces fichiers lors de la sélection des agencements dans l'interface graphique. Néanmoins, plusieurs groupes peuvent être compris dans un seul fichier. Il existe également des lignes qui attribuent les symboles de touche aux différents niveaux des différents groupes symbols[...] = ... par exemple : symbols[Group1] = [ ISO_Level3_Shift, ISO_Next_Group ], La remarque faite précédemment à propos des groupes vaut également dans ce cas. Lorsque la description ne comprend que des symboles de touche, il est possible de se contenter simplement de la partie entre crochets, par exemple : key { [ 2, quotedbl, at, oneeighth ] }; Lorsque le type de paramètre décrit est le dernier dans la description de la touche, la virgule finale est supprimée. =====Règles d'écriture des fichiers de configuration===== ====Syntaxe structurelle des fichiers==== D'une façon assez générale, les fichiers de configuration se présentent comme une suite de sections de la forme suivante : [ [[#Drapeaux]] ] [[#TypeDeFichier]] [ [[#NomDeSection]] ] '{' [ [[#Instructions]] ] '};: === Drapeaux === Un seul de ces drapeaux est utilisé par xkb : **default**. La section marquée //default// est celle qui est prise en compte lorsqu'une référence au fichier est faite sans mentionner le nom de la section. Les autres noms sont à destination de l'utilisateur pour l'aider à se repérer. Ces noms sont assez évocateurs pour qu'on ne s'attarde pas sur leur explication. === TypeDeFichier === Il représente le type du fichier parmi ceux énumérés ci-après : ^ Type de fichier ^ Définition ^ |**xkb_keycodes**| Fichiers établissant la correspondance entre le code de chacune des touches et un nom symbolique de ce code. Les fichiers de ce type sont placés dans le dossier **/usr/share/X11/xkb/keycodes**| |**xkb_types**| Fichiers décrivant les types de touche, en particulier leur nombre de niveaux et la relation entre ces niveaux et les modificateurs. Les fichiers de ce type sont placés dans le dossier ** /usr/share/X11/xkb/types**| |**xkb_symbols**|Fichiers décrivant, entre autres, le type et les symboles de touche de cette touche. Les fichiers de ce type sont placés dans le dossier **/usr/share/X11/xkb/symbols**| |**xkb_compat**|Fichiers décrivant le comportement des modificateurs. Ceci renvoie à des notions complexes qui ne sont pas strictement nécessaires pour la compréhension de ce tutoriel. Pour une présentation exhaustive reportez-vous aux documents cités en référence en fin de page. Les fichiers de ce type sont placés dans le dossier **/usr/share/X11/xkb/compat**| |**xkb_geometry**|Fichiers décrivant le placement physique des touches sur le clavier. Les fichiers de ce type sont placés dans le dossier **/usr/share/X11/xkb/geometry**| Notez que toutes les sections d'un même fichier doivent être du même type. === NomDeSection === Il attribue un nom à la section. Pour les instructions d'inclusion de fichier, ou de partie de fichier, une référence à une section particulière pourra être faite en utilisant ce nom. === Instructions === Les instructions dépendent du type de fichier et sont expliqués dans les différentes sections traitant de ces fichiers. Par exemple, dans un fichier du dossier //symbols//, on peut trouver une instruction de définition des symboles attachés aux différents de cette touche telle que : key { [ q, Q, adiaeresis, Adiaeresis ] }; // q Q ä Ä ==== Règles de fusion / imbrication des fichiers ==== D'une façon générale, les fichiers de configuration n'ont pas une présentation où ceux-ci seraient indépendants les uns des autres. Au contraire, ils sont en général très imbriqués, faisant appel, par des instructions //include//, à des parties d'autres fichier de même type. Ceci rend d'ailleurs la lecture d'une configuration donnée assez difficile. === L'instruction include === Les programmeurs n'ont pas besoin d'explication sur cette instruction présente dans nombre de langages de programmation. Pour les autres disons qu'elle permet d'inclure, à l'endroit où elle est placée, le contenu textuel de ce à quoi elle fait référence, comme si ce texte avait été placé directement à cet endroit. === Modes de fusion === Le fait de procéder par inclusions, parfois en cascade, conduit à une possibilité accrue de voir un élément, tel qu'une définition de touche par exemple, décrit ou défini plusieurs fois. Ceci conduit à se poser la question de ce qui se passe quand ces déclarations multiples sont en conflit. C'est à ce stade que les modes de fusion interviennent.\\ Avant de voir comment faire appel à eux, en voici une courte description : ^ Mode ^ Description ^ |**augment**|Quand ce mode de fusion est utilisé et qu'une nouvelle déclaration entre en conflit avec une précédente déclaration, la déclaration précédente est conservée. | |**override**|Quand ce mode de fusion est utilisé et qu'une nouvelle déclaration entre en conflit avec une précédente déclaration, la nouvelle déclaration est conservée| |**replace**|En général, ce mode est équivalent au mode //override//.Cependant, l'interprétation en est plus nuancée dans les fichiers de symboles de touches. Comme la description d'une touche comporte une suite de symboles à associer aux différents niveaux, il se peut que plusieurs descriptions d'une même touche, intéressent chacune une partie seulement de l'ensemble des symboles. Dans un tel cas, si le mode est //override//, les symboles des **niveaux décrits** de la nouvelle déclaration écrasent ceux de l'ancienne; par contre, si le mode est replace, **tous les niveaux sont écrasés**, ce qui signifie que les symboles absents de la nouvelle déclaration seront sans symbole affecté.| |**alternate**|Ce mode n'est utilisé que pour les codes de touche. La nouvelle définition est considérée comme un alias.| === Mise en œuvre des modes de fusion === * Sans autre déclaration qui le contredise à l'intérieur de l'élément inclus, lors de l'inclusion d'un élément , le mode //override// est appliqué par défaut. * Si l'inclusion porte sur une suite d'éléments reliés par le signe +, les éléments ajoutés sont fusionnés entre eux avec le mode //override//. Les déclarations internes peuvent néanmoins contredire ce principe. * Si l'inclusion porte sur une suite d'éléments reliés par le signe |, les éléments ajoutés sont fusionnés entre eux avec le mode //augment//. Les déclarations internes peuvent néanmoins contredire ce principe. * Le mode de fusion par défaut, override, peut être contredit en remplaçant le terme include par le nom d'un mode d'insertion. Par exemple, dans un fichier de symboles : replace «fr(oss_nodeadkeys)" signifie que les déclarations du fichier fr doivent être incluse en appliquant le mode //replace// et non pas le mode par défaut //override//. Les déclarations internes peuvent néanmoins contredire ce principe. * Pour finir, un appel interne à un mode de fusion, l'emporte sur une déclaration antérieure, par exemple : replace key { vmods = NumLock, symbols[Group1] = [ NoSymbol ], actions[Group1] = [ SetMods(modifiers=NumLock) ] }; signifie que cette nouvelle définition de la touche annule et remplace toutes les définitions précédentes de cette touche. =====Démarche d'écriture de son agencement personnalisé===== Les pages [[tutoriel:creer_et_utiliser_un_agencement_de_clavier_personnalise|Créer et utiliser un agencement de clavier personnalisé]] et [[tutoriel:exemple_de_creation_d_un_agencement_clavier_personnalise|Exemple de création d'un agencement de clavier personnalisé]] décrivent, dans les grandes lignes pour la première et, très en détails pour la seconde, la démarche d'écriture d'un agencement personnalisé. ===== Références bibliographiques ===== Les bases théoriques de cette page sont accessibles sur le site de [[http://pascal.tsu.ru/en/xkb/| Ivan Pascal]], qui traite d'une manière exhaustive tout ce qui n'a pu être qu'effleuré ici. Ce texte, bien écrit, requiert néanmoins une attention soutenue, en particulier, à qui n'est pas un programmeur. ---- //Contributeurs: [[:utilisateurs:jaaf64]] // ---- **Notes**