| Les deux révisions précédentesRévision précédente | |
| tutoriel:exemple_de_creation_d_un_agencement_clavier_personnalise [Le 19/09/2026, 17:55] – [Connaître les fichiers de configuration actifs] geole | tutoriel:exemple_de_creation_d_un_agencement_clavier_personnalise [Le 20/09/2026, 10:50] (Version actuelle) – Mise en forme (https://forum.ubuntu-fr.org/viewtopic.php?pid=22907948#p22907948) nany |
|---|
| Cette page illustre par un exemple concret et complet, la mise en place d'un agencement personnalisé disponible ensuite dans l'interface graphique au même titre que ceux fournis avec la distribution. | Cette page illustre par un exemple concret et complet, la mise en place d'un agencement personnalisé disponible ensuite dans l'interface graphique au même titre que ceux fournis avec la distribution. |
| |
| Il s'agit avant tout de la description **détaillée** des raisonnements suivis et de l'utilisation des outils disponibles pour faciliter ce travail. Néanmoins, pour faciliter la vision d'ensemble, les grandes lignes de la méthode sont présentées sur la page « ** [[tutoriel:creer_et_utiliser_un_agencement_de_clavier_personnalise|Créer et utiliser un agencement de clavier personnalisé]]** ». | Il s'agit avant tout de la description **détaillée** des raisonnements suivis et de l'utilisation des outils disponibles pour faciliter ce travail. Néanmoins, pour faciliter la vision d'ensemble, les grandes lignes de la méthode sont présentées sur la page « **[[tutoriel:creer_et_utiliser_un_agencement_de_clavier_personnalise|Créer et utiliser un agencement de clavier personnalisé]]** ». |
| |
| <note>S'agissant ici d'un exemple pour lequel aucune latitude n'est laissée au lecteur qui doit rester relativement passif en s'attachant simplement à comprendre ce qui se passe et en le reproduisant éventuellement, la deuxième personne du pluriel qui prévaut en général dans les tutoriels est ici volontairement remplacée par une première personne du pluriel.\\ | <note>S'agissant ici d'un exemple pour lequel aucune latitude n'est laissée au lecteur qui doit rester relativement passif en s'attachant simplement à comprendre ce qui se passe et en le reproduisant éventuellement, la deuxième personne du pluriel qui prévaut en général dans les tutoriels est ici volontairement remplacée par une première personne du pluriel.\\ |
| En bref, écoutez et comprenez ce que** nous faisons**. Vous aurez ensuite tout le loisir de l'adapter à vos fins.</note> | En bref, écoutez et comprenez ce que **nous faisons**. Vous aurez ensuite tout le loisir de l'adapter à vos fins.</note> |
| |
| La lecture de cette page suppose compris les concepts généraux présentés sur la page « **[[tutoriel:comprendre_la_configuration_du_clavier|Comprendre la configuration du clavier]]** ». | La lecture de cette page suppose compris les concepts généraux présentés sur la page « **[[tutoriel:comprendre_la_configuration_du_clavier|Comprendre la configuration du clavier]]** ». |
| Frappons sur une touche (k par exemple). Dans la fenêtre du terminal, un grand nombre d'informations sur les différents évènements générés s'affichent. Nous y trouvons en particulier les lignes suivantes : | Frappons sur une touche (k par exemple). Dans la fenêtre du terminal, un grand nombre d'informations sur les différents évènements générés s'affichent. Nous y trouvons en particulier les lignes suivantes : |
| |
| >KeyRelease event, serial 37, synthetic NO, window 0x4c00001, | <code> |
| > root 0x15a, subw 0x0, time 50238474, (229,1101), root:(230,1128), | KeyRelease event, serial 37, synthetic NO, window 0x4c00001, |
| > state 0x10, **keycode 56 (keysym 0x6b, k)**, same_screen YES, | root 0x15a, subw 0x0, time 50238474, (229,1101), root:(230,1128), |
| > XLookupString gives 1 bytes: (6b) "k" | state 0x10, keycode 56 (keysym 0x6b, k), same_screen YES, |
| > XFilterEvent returns: False | XLookupString gives 1 bytes: (6b) "k" |
| | XFilterEvent returns: False |
| | </code> |
| |
| La partie qui nous intéresse ici est en gras. Elle devrait confirmer les informations de l'image précédente, à savoir que le code de la touche marquée «k» est 56 et que le symbole de touche associé est k ((à condition de ne pas appuyer sur ⇧en même temps. )) | La partie qui nous intéresse ici est en gras. Elle devrait confirmer les informations de l'image précédente, à savoir que le code de la touche marquée «k» est 56 et que le symbole de touche associé est k ((à condition de ne pas appuyer sur ⇧en même temps. )) |
| Si nous explorons le dossier **/usr/share/X11/xkb/symbols** où sont censés se trouver les fichiers de définitions des symboles associés aux touches, nous y trouvons le fichier //terminate// dont le contenu est le suivant : | Si nous explorons le dossier **/usr/share/X11/xkb/symbols** où sont censés se trouver les fichiers de définitions des symboles associés aux touches, nous y trouvons le fichier //terminate// dont le contenu est le suivant : |
| |
| >partial default modifier_keys | <file> |
| >xkb_symbols "ctrl_alt_bksp" { | partial default modifier_keys |
| > key <BKSP> { | xkb_symbols "ctrl_alt_bksp" { |
| > type="CTRL+ALT", | key <BKSP> { |
| > symbols[Group1] = [ NoSymbol, Terminate_Server ] | type="CTRL+ALT", |
| > }; | symbols[Group1] = [ NoSymbol, Terminate_Server ] |
| >}; | }; |
| | }; |
| | </file> |
| |
| Nous voyons que le symbole de terminaison du serveur, //Terminate_Server//, en gras ici, est associé à la touche <BKSP> qui possède deux niveaux et dont l'accès au deuxième niveau est donné par la combinaison de touches //Ctrl + Alt// comme le décrit l'extrait suivant du fichier **/usr/share/X11/xkb/types/pc** : | Nous voyons que le symbole de terminaison du serveur, //Terminate_Server//, en gras ici, est associé à la touche <BKSP> qui possède deux niveaux et dont l'accès au deuxième niveau est donné par la combinaison de touches //Ctrl + Alt// comme le décrit l'extrait suivant du fichier **/usr/share/X11/xkb/types/pc** : |
| |
| > ** type "CTRL+ALT"** { | <file> |
| > modifiers = Control+Alt; | type "CTRL+ALT" { |
| > map[Control+Alt] = Level2; | modifiers = Control+Alt; |
| > level_name[Level1] = "Base"; | map[Control+Alt] = Level2; |
| > **level_name[Level2] = "Ctrl+Alt";** | level_name[Level1] = "Base"; |
| > }; | level_name[Level2] = "Ctrl+Alt"; |
| | }; |
| | </file> |
| |
| Nous notons au passage que l'option, introduite par un signe **+**, s'ajoute ((selon les règles de fusion citées à la section **Mise en œuvre des modes de fusion** de la page << [[tutoriel:comprendre_la_configuration_du_clavier|Comprendre la configuration du clavier]] >>)) en mode //**override**//, c'est à dire qu'elle prend l'avantage sur toute déclaration antérieure. | Nous notons au passage que l'option, introduite par un signe **+**, s'ajoute ((selon les règles de fusion citées à la section **Mise en œuvre des modes de fusion** de la page << [[tutoriel:comprendre_la_configuration_du_clavier|Comprendre la configuration du clavier]] >>)) en mode //**override**//, c'est à dire qu'elle prend l'avantage sur toute déclaration antérieure. |
| incluses, jusqu'à la fin. | incluses, jusqu'à la fin. |
| |
| Transformons également la ligne: | Transformons également la ligne : |
| <file>name[Group1]= "France - Bepo, ergonomic, Dvorak way";</file> | <file>name[Group1]= "France - Bepo, ergonomic, Dvorak way";</file> |
| en : | en : |
| ==== Introduction des niveaux supérieurs à quatre ==== | ==== Introduction des niveaux supérieurs à quatre ==== |
| |
| Nous allons maintenant avoir besoin d'un type de touche à plus de quatre niveaux. Nous devons explorer les fichiers du dossier **/usr/share/X11/xkb/types** pour savoir si un tel type n'existe pas déjà. Le fichier level5 ((niveau5)) devrait logiquement faire l'affaire. Bingo ! Il existe bien dans ce fichier le type suivant : | Nous allons maintenant avoir besoin d'un type de touche à plus de quatre niveaux. Nous devons explorer les fichiers du dossier **/usr/share/X11/xkb/types** pour savoir si un tel type n'existe pas déjà. Le fichier level5 (niveau5) devrait logiquement faire l'affaire. Bingo ! Il existe bien dans ce fichier le type suivant : |
| |
| <file> type "EIGHT_LEVEL_ALPHABETIC" { | <file> type "EIGHT_LEVEL_ALPHABETIC" { |
| modifiers = Shift+Lock+LevelThree+LevelFive; | modifiers = Shift+Lock+LevelThree+LevelFive; |
| map[None] = Level1; | map[None] = Level1; |
| map[Shift] = Level2; | map[Shift] = Level2; |
| map[Lock] = Level2; | map[Lock] = Level2; |
| map[LevelThree] = Level3; | map[LevelThree] = Level3; |
| map[Shift+LevelThree] = Level4; | map[Shift+LevelThree] = Level4; |
| map[Lock+LevelThree] = Level4; | map[Lock+LevelThree] = Level4; |
| map[Lock+Shift+LevelThree] = Level3; | map[Lock+Shift+LevelThree] = Level3; |
| map[LevelFive] = Level5; | map[LevelFive] = Level5; |
| map[Shift+LevelFive] = Level6; | map[Shift+LevelFive] = Level6; |
| map[Lock+LevelFive] = Level6; | map[Lock+LevelFive] = Level6; |
| map[LevelThree+LevelFive] = Level7; | map[LevelThree+LevelFive] = Level7; |
| map[Shift+LevelThree+LevelFive] = Level8; | map[Shift+LevelThree+LevelFive] = Level8; |
| map[Lock+LevelThree+LevelFive] = Level8; | map[Lock+LevelThree+LevelFive] = Level8; |
| map[Lock+Shift+LevelThree+LevelFive] = Level7; | map[Lock+Shift+LevelThree+LevelFive] = Level7; |
| |
| level_name[Level1] = "Base"; | level_name[Level1] = "Base"; |
| level_name[Level2] = "Shift"; | level_name[Level2] = "Shift"; |
| level_name[Level3] = "Alt Base"; | level_name[Level3] = "Alt Base"; |
| level_name[Level4] = "Shift Alt"; | level_name[Level4] = "Shift Alt"; |
| level_name[Level5] = "X"; | level_name[Level5] = "X"; |
| level_name[Level6] = "X Shift"; | level_name[Level6] = "X Shift"; |
| level_name[Level7] = "X Alt Base"; | level_name[Level7] = "X Alt Base"; |
| level_name[Level8] = "X Shift Alt"; | level_name[Level8] = "X Shift Alt"; |
| }; | }; |
| </file> | </file> |
| Celui-ci fait parfaitement notre affaire. Nous allons donc ajouter devant le signe **[** de chacune des lignes de touches alphabétiques de notre nouveau fichier **/usr/share/X11/xkb/symbols/mon_fr_bépo**, le texte suivant : | Celui-ci fait parfaitement notre affaire. Nous allons donc ajouter devant le signe **[** de chacune des lignes de touches alphabétiques de notre nouveau fichier **/usr/share/X11/xkb/symbols/mon_fr_bépo**, le texte suivant : |
| <file>key <AD01> { type[group1] = "EIGHT_LEVEL_ALPHABETIC", [ b, B, bar, brokenbar, noSymbol, noSymbol, noSymbol, noSymbol] }; // b B | ¦</file> | <file>key <AD01> { type[group1] = "EIGHT_LEVEL_ALPHABETIC", [ b, B, bar, brokenbar, noSymbol, noSymbol, noSymbol, noSymbol] }; // b B | ¦</file> |
| |
| <note important>On veillera à ne pas insérer d'espace entre le dernier symbole pré-existant et la première virgule du texte inséré. Par contre, on veillera à bien laisser une espace au moins juste avant le signe **[**. | <note important>On veillera à ne pas insérer d'espace entre le dernier symbole pré-existant et la première virgule du texte inséré. Par contre, on veillera à bien laisser une espace au moins juste avant le signe **[**. |
| </note> | </note> |
| <note>Si le fichier décrivant le type à huit niveaux n'avait pas été présent ( cas d'une distribution différente par exemple), il nous aurait alors fallu le créer.</note> | <note>Si le fichier décrivant le type à huit niveaux n'avait pas été présent (cas d'une distribution différente par exemple), il nous aurait alors fallu le créer.</note> |
| |
| ==== Ajout des nouveaux symboles ==== | ==== Ajout des nouveaux symboles ==== |
| |
| Aux emplacements des nouveaux niveaux, on remplacera les //noSymbol// par les symboles nouveaux dont nous souhaitons disposer. À titre d'exemple voici la ligne du **i** sur laquelle nous avons ajouté les symboles de la //roupie indienne// et du nouveau //sheqel// israélien. ((notre moyen mnémotechnique ici étant de placer les monnaies selon l'initiale du pays.)) | Aux emplacements des nouveaux niveaux, on remplacera les //noSymbol// par les symboles nouveaux dont nous souhaitons disposer. À titre d'exemple voici la ligne du **i** sur laquelle nous avons ajouté les symboles de la //roupie indienne// et du nouveau //sheqel// israélien. (Notre moyen mnémotechnique ici étant de placer les monnaies selon l'initiale du pays.) |
| <file>key <AC03> { type[group1] = "EIGHT_LEVEL_ALPHABETIC", [ i, I, dead_diaeresis, dead_abovedot, U20B9, U20AA, noSymbol, noSymbol ] }; // i I ̈ ˙ ₹ ₪</file> | <file>key <AC03> { type[group1] = "EIGHT_LEVEL_ALPHABETIC", [ i, I, dead_diaeresis, dead_abovedot, U20B9, U20AA, noSymbol, noSymbol ] }; // i I ̈ ˙ ₹ ₪</file> |
| <note>Les symboles de touche sont entrés sous forme UXXXX de l'Unicode. Attention : le U doit impérativement être en majuscule:</note> | <note>Les symboles de touche sont entrés sous forme UXXXX de l'Unicode. Attention : le U doit impérativement être en majuscule:</note> |
| |
| ==== Création de la touche d'accès au niveau 5 et supérieurs ==== | ==== Création de la touche d'accès au niveau 5 et supérieurs ==== |
| Rappelons que nous souhaitons permuter les rôles des touches //Alt//et //Logo// de gauche et faire de la touche //Alt// de gauche la touche d'accès au niveau 5. | Rappelons que nous souhaitons permuter les rôles des touches //Alt// et //Logo// de gauche et faire de la touche //Alt// de gauche la touche d'accès au niveau 5. |
| |
| Pour nous donner une idée sur la manière de procéder, dans le dialogue des préférences du clavier, ajoutons l'option //**Right Alt chose fifth level**//((La touche Alt de droite choisit le niveau 5)), dans la partie //**Keys to chose fifth level**//.((Touche pour choisir le niveau 5)) (FIXME : présente dans Natty mais quid des versions antérieures ?) | Pour nous donner une idée sur la manière de procéder, dans le dialogue des préférences du clavier, ajoutons l'option //**Right Alt chose fifth level**//((La touche Alt de droite choisit le niveau 5)), dans la partie //**Keys to chose fifth level**//.((Touche pour choisir le niveau 5)) (FIXME : présente dans Natty mais quid des versions antérieures ?) |
| |
| Le résultat est le suivant : | Le résultat est le suivant : |
| >xkb_symbols { include "pc+fr(bepo)+inet(evdev)+terminate(ctrl_alt_bksp)**+level5(ralt_switch_lock)"** }; | <code>xkb_symbols { include "pc+fr(bepo)+inet(evdev)+terminate(ctrl_alt_bksp)+level5(ralt_switch_lock)" };</code> |
| |
| Il nous montre que l'accès au niveau 5 est défini dans la section "ralt_switch_lock" du fichier **/usr/share/X11/xkb/symbols/level5**.\\ | Il nous montre que l'accès au niveau 5 est défini dans la section "ralt_switch_lock" du fichier **/usr/share/X11/xkb/symbols/level5**.\\ |
| type[Group1]="ONE_LEVEL", | type[Group1]="ONE_LEVEL", |
| symbols[Group1] = [ ISO_Level5_Shift ] | symbols[Group1] = [ ISO_Level5_Shift ] |
| }; | }; |
| modifier_map Mod3 { ISO_Level5_Shift }; | modifier_map Mod3 { ISO_Level5_Shift }; |
| };. | };. |
| |
| Le résultat est le suivant : | Le résultat est le suivant : |
| > xkb_symbols { include "pc+fr(bepo)+inet(evdev)**+altwin(swap_lalt_lwin)**+terminate(ctrl_alt_bksp)" }; | <code>xkb_symbols { include "pc+fr(bepo)+inet(evdev)+altwin(swap_lalt_lwin)+terminate(ctrl_alt_bksp)" };</code> |
| |
| Il nous montre que la permutation est définie dans la section **swap_lalt_lwin** du fichier **du dossier /usr/share/X11/xkb/symbols/altwin** dont voici le texte :\\ | Il nous montre que la permutation est définie dans la section **swap_lalt_lwin** du fichier **du dossier /usr/share/X11/xkb/symbols/altwin** dont voici le texte :\\ |
| }; | }; |
| </file> | </file> |
| Nous pouvons, en nous inspirant de ces deux extraits((**Texte option 1** et **Texte option 2**)), écrire notre option personnalisée comme suit : | Nous pouvons, en nous inspirant de ces deux extraits (**Texte option 1** et **Texte option 2**), écrire notre option personnalisée comme suit : |
| <file>partial modifier_keys | <file>partial modifier_keys |
| xkb_symbols "my_swap_lalt_lwin" { | xkb_symbols "my_swap_lalt_lwin" { |
| </file> | </file> |
| |
| Puis la placer dans un fichier //my_level5// du dossier ///usr/share/X11/xkb/symbols//.par exemple. | Puis la placer dans un fichier //my_level5// du dossier ///usr/share/X11/xkb/symbols//, par exemple. |
| |
| === Utiliser l'option === | === Utiliser l'option === |
| <file>include "level3(ralt_switch)" | <file>include "level3(ralt_switch)" |
| </file> | </file> |
| placons la ligne suivante | plaçons la ligne suivante |
| <file>include "my_level5(my_swap_lalt_lwin)" | <file>include "my_level5(my_swap_lalt_lwin)" |
| </file> | </file> |
| |Niveau 8| Alt gr + Alt + ⇧| | |Niveau 8| Alt gr + Alt + ⇧| |
| |
| <note>Pensons à [[:tutoriel:comment_sauver_et_restaurer_un_fichier|sauvegarder]] les fichiers **mon_fr_bepo** et **my_level5** dans un dossier personnel, car en cas de réinstallation, ils seraient irrémédiablement écrasés.</note> | <note>Pensons à [[:tutoriel:comment_sauver_et_restaurer_un_fichier|sauvegarder]] les fichiers **mon_fr_bepo** et **my_level5** dans un dossier personnel, car en cas de réinstallation, ils seraient irrémédiablement écrasés.</note> |
| |
| ===== Problème non résolus ===== | ===== Problème non résolus ===== |
| |
| <note>Au fur et à mesure, essayez d'abandonner progressivement l'utilisation du clavier style Windows sur Xubuntu. Au début, c'est un peu difficile mais au bout d'un mois, on s'y habitue :-D | <note>Au fur et à mesure, essayez d'abandonner progressivement l'utilisation du clavier style Windows sur Xubuntu. Au début, c'est un peu difficile mais au bout d'un mois, on s'y habitue :-D |
| Pour revenir à un clavier style Linux, re-cochez la case **Utiliser les paramètres par défaut**.</note> | Pour revenir à un clavier style Linux, re-cochez la case **Utiliser les paramètres par défaut**.</note> |
| |
| ==== Restauration des fichiers de sauvegarde (si besoin) ==== | ==== Restauration des fichiers de sauvegarde (si besoin) ==== |
| |
| ---- | ---- |
| //Contributeurs: [[:utilisateurs:jaaf64]], [[:utilisateurs:fabienCo]]// | //Contributeurs : [[:utilisateurs:jaaf64]], [[:utilisateurs:fabienCo]]// |