Dimanche 26 décembre 2021
Traduction de X keyboard extension du Wiki de archlinux. J'ai utilisé l'excellent DeepL comme outil d'aide à la traduction.
L'extension du clavier de XWindow X keyboard extension ou XKB, définit la manière dont les codes de clavier sont traités dans X et fournit l'accès aux tables de traduction internes. Il s'agit du mécanisme de base qui permet d'utiliser plusieurs dispositions.
Cet article décrit comment créer et modifier des dispositions de clavier. Si vous cherchez plutôt comment configurer votre clavier, voyez X keyboard configuration(en).
Pendant que vous travaillez avec XKB, il est possible que votre serveur X se bloque ou se plante, ou que votre clavier devienne inutilisable, ce qui ne peut être rétabli qu'en terminant votre session actuelle. Avant d'effectuer des changements, veuillez suivre les «Précautions et préparations» pour vous assurer que vous pouvez récupérer.
Pour vous préparer à l'éventualité d'un plantage de votre serveur X ou d'une mise hors service de votre clavier :
Pour rendre le débogage plus facile, arrêtez des applications telles que xxkb qui changent de disposition de clavier ou qui modifient l'état de XKB.
Jetez un œil sur les fichiers *.lst
dans /usr/share/xkb/rules
ou à XKB Homepage pour avoir une idée sur comment configurer les règles. Votre propre configuration peut être placée dans /etc/X11/xorg.conf.d/
.
Par exemple, on peut vouloir réaffecter la touche de verrouillage des majuscules @Caps Lock) à la touche d'échappement (Échap) :
90-custom-kbd.conf
Section "InputClass"
Identifier "keyboard defaults"
MatchIsKeyboard "on"
Option "XKbOptions" "caps:escape"
EndSection
Utilisez xkbcomp (paquet xorg-xkbcom) pour manipuler les donnés de XKB. Pour obtenir la configuration courante, faites :
$ xkbcomp $DISPLAY output.xkb
Pour recharger les données vers le serveur X, faites :
$ xkbcomp input.xkb $DISPLAY
Obervez que sans $DISPLAY
comme second paramètre, xkbcomp va essayer de compiler le fichier .xkb (rarement utile) en un fichier .xkm sans rien envoyer au serveur. Il va cependant analyser la syntaxe et renvoyer les erreurs éventuelles.
Lorsque la disposition de clavier est prête, enregistrez-la sous ~/.Xkeymap
faites la charger par ~/.xinitrc
au démarrage :
~/.xinitrc
...
test -f ~/.Xkeymap && xkbcomp ~/.Xkeymap $DISPLAY*
Le nom du fichier .Xkeymap
n'a pas d'importance, on peut en choisir un autre. Notez que contrairement à la configuration standard du système via xorg.conf, il s'agit d'un keymap propre à l'utilisateur. De plus on peut modifier la configuration pendant que X est en cours d'utilisation.
Le cœur du fonctionnement de XKB est assez simple, mais il est nécessaire d'avoir une idée de comment il marche avant de commencer à travailler avec les keymap.
Utilisez xev (paquet xorg-xev pour retrouver les keycodes et découvrir comment votre disposition de clavier fonctionne.
Simple extrait :
KeyPress event, serial 45, synthetic NO, window 0x2200001,
root 0xad, subw 0x0, time 183176240, (796,109), root:(867,413),
state 0x1, keycode 21 (keysym 0x2b, plus), same_screen YES,
XLookupString gives 1 bytes: (2b) "+"
XmbLookupString gives 1 bytes: (2b) "+"
XFilterEvent returns: False
Notez le keycode 21, l'état 0x1 et le keysym 0x2b alias plus. Le keycode 21 est ce que le périphérique d'entrée a fourni à X, typiquement un index de touche physique en quelque sorte. L'état représente les touches modificatrices, 0x01 correspond à Shift. Le code de la touche et la valeur de l'état sont ce que X envoie à l'application dans la structure XKeyEvent. Le Keysym et la chaîne correspondante sont ce que le client obtient en utilisant XLookupString et ses amis.
Les bits du champ d'état state ont des noms prédéfinis : Shift
, Lock
, Control
, Mod1
, Mod2
, Mod3
, Mod4
et Mod5
, en allant du plus bas au plus élevé. Ainsi Ctrl+Shift
correspond à 0x05, etc. Les applications clientes ne vérifient généralement que les bits qui les intéresse de sorte qu'une application avec une entrée clavier normale et des raccourcis clavier Ctrl+ ne fait généralement aucune distinction entre les états Control et Control+Mod3.
Les keysym sont aussi de type numérique. Beaucoup d'entre eux ont des noms, déclarés dans /usr/include/X11/keysymdef.h
avec comme préfixe KP_
Cependant, le nombre est ce que les clients reçoivent réellement. Les Keysyms ne sont importants que lorsqu'une application attend des valeurs particulières ; il s'agit généralement de touches comme les flèches, la touche Entrée, la touche Retour arrière, les touches de fonction et divers raccourcis. Pour le reste, la chaîne de caractères est utilisée.
XKB travaille principalement au stade de XLookupString
, transformant le code de touche en keysym en fonction des valeurs de group et de state :
(keycode, group, state) → keysym
group correspond à la disposition comme Anglais-US, Français(Azerty), Russe, Grec etc. Il ne peut y avoir que 4 groupes au plus.
En interne, la traduction comporte d'autres étapes :
(keycode [, group]) → type
(state, type) → level
(keycode, group, level) → S[keycode][group][level]
où S est la table de traduction (nommée xkb_symbols
, voir ci-dessous).
Les type servent à indiquer quels modificateurs affectent la touche; il s'agit essentiellement d'un moyen de réduire la troisième dimension de S. Par exemple une touche de caractère alphanumérique ne peut être affectée que par Shift, donc son type est défini par TOW_LEVEL
, et
(state, TWO_LEVEL) → level = ((state >> 0) & 0x01) = state & 0x01
qui est soit 0, soit 1. Donc c'est S[keycode][0..4][0..1]
au lieu de S[keycode][0..4][0..255].
En termes de X, a
et Ctrl+a
ont le même keysym et des state différents, alors que a
et A
ont des keysym disctincts.
Généralement c'est le rôle de XKB de fournir les keysym, et c'est à l'application de gérer les états state.
Aussi, les états state dans XKB ont en quelque sorte un effet différé, c'est pourquoi on doit définir l'état avant d'appuyer sur une touche.
Exemple : Ctrl+h
peut être configuré pour agir comme un Retour arrière ( ←) dans la configuration de rxvt. De cette manière rxvt recevra h
comme keysym avec le bit de Control
placé, ce qui est clairement différent du symbole Backspace
. Alternativement XKB peut générer à partir de Ctrl+h
un Backspace
avec le bit de Control
placé. Dans ce cas rxvt n'y verra aucune différence. Obtenir de XKB la génération d'un keysym Bacspace
sans bit de Control
est possible mais c'est plus difficile à implémenter.
Le keysym obtenu par la table ci-dessus peut aussi déclencher une action.
(keysym, state) → action
Pour XKB mettre ou verrouiller un bit modificateur est une action, de même que toute interaction avec le serveur, comme le changement de console, le déplacement du curseur, etc. Géneralement les actions n'affectent pas les keysym et la génération d'un keysym n'est pas une action.
Il n'y a qu'une action possible par paire (keysym, state).
Commencez par la configuration de votre serveur et dans la mesure du possible effectuez les changements progressivement tout en les testant.
Le fichier .xkb produit par xkbcomp est un simple fichier texte. Les commentaires utilisent le style C++ (// commentaire). Les sections comme dans xkb_keycodes peuvent être ignorées pour l'instant.
Définition des keycodes symboliques. Le reste du fichier n'utilise pas les keycodes numériques mais seulement ces codes symboliques.
C'est une bonne idée de ne laisser ici que les définitions des touches que le clavier possède réellement.
Ces étiquette sont arbitraires. Elles ne sont utilisées que dans la section xkb_symbols.
Cette section vient avant xkb_symbols, alors jetez-y un coup d'œil, mais essayez de ne pas encore faire de changements. Les types standards dépendent beaucoup des modificateurs virtuels, qui seront expliqués plus tard. Pour l'instant, trouvez simplement les types dont vous avez besoin. Commencez par les suivants : ONE_LEVEL, TWO_LEVEL, ALPHABETIC.
Les touches ONE_LEVEL ne sont pas affectées par les modificateurs ; il s'agit généralement des touches Enter, Space, Escape, F, Shift/Alt/Ctrl et ainsi de suite. Les touches TWO_LEVEL et ALPHABETIC produisent des keysyms différents selon l'état de Shift. Toutes les touches alphanumériques sont de ces types. ALPHABETIC respecte en outre le verrouillage des majuscules.
La description des types eux-mêmes est assez simple. La ligne
modifiers= Shift+NumLock+LevelThree;
signifie que les touches de ce type ne sont concernées que par Shift, NumLock et LevelThree.
Les lignes Map telle que :
map[Shift+LevelThree]= Level4;
définit que telle combinaison correspond à tel niveau (level). Xkbcomp utilise "LevelN" lors de l'extraction des données, mais on pourrait aussi bien les nommer simplement N.
Les lignes level_name peuvent être ignorées.
Définitions d'action (interpret
) et des leds du clavier (indicator
) parmi d'autres choses. Vous pouvez effacer les parties dont vous n'avez pas besoin comme les actions du pavé numérique, la simulation du contrôle de la souris, ou des modificateurs supplémentaires.
Notez que key+AnyOfOrNone(all)
est tout simplement équivalent à key
, qui est beaucoup plus simple.
Vérifier les commutations de groupes si vous en avez besoin. LockGroup(group=N)
peut être utile si vous avez quatre groupes, sinon ISO_Next_Group
ou ISO_Prev_Group
suffisent.
LatchGroup
peut être utile pour des configurations spécifiques.
La section principale qui définit ce que chaque touche fait. Syntaxe :
key <LABL> { [ G1L1, G1L2, G1L3, ... ], [ G2L1, G2L2, G2L3, ... ], ... }
<LABL
est le nom symbolique de la touche défini dans la section xkb_keycodes, GiLj
est le keysym pour le groupe i niveau j. Le nombre de keysym doit correspondre au nombre de niveaux (level) défini pour ce type (sinon xkbcomp vous préviendra).
Examiner /usr/include/X11/keysymdef.h
pour avoir la liste des keysyms possibles. En outre vous pouvez des symboles unicode de la forme Uxxxx
, e.g. ́́U0301
pour composer un accent aigu. Notez que a
et U0061
sont traités différemment, par exemple la plupart des applications attendent Ctrl+a
et non Ctrl+U0061
parce que leurs valeurs numériques diffèrent.
Le type des touches sont aussi spécifiés dans cette section par :
key.type = "T1";
key <...> { ... };
key <...> { ... };
key <...> { ... };
key.type = "T2";
key <...> { ... };
key <...> { ... };
ou individuellement
key <...> { type = "T", [ .... ], [ .... ] };
Le type de touche peut différer d'un groupe à l'autre. Ceci peut sembler contre intuitif, mais a en fait quelques applications utiles. Pour celà utilisez :
key <...> { type[1] = "T1", type[2] = "T2", [ ... ], [ ... ] };
Vous pouvez utiliser des étiquettes pour les groupes comme suit :
name[1] = "EN"; // group 1
name[2] = "RU"; // group 2
name[3] = "UA"; // group 3
C'est ce que xxkb affichera si les étiquettes sont définies ici.
La section comprend aussi des lignes modifier_map
. Laissez-les de côté pour l'instant ou examinez Virutal Modifiers plus bas.
Cette section est destinée à l'impression de la disposition du clavier avec l'application xkbprint
. Elle peut être ignorée ici et même supprimée complètement.
Activation de touches supplémentaires (multimédia) :
xkb_keycodes {
<VOL-> = 122; // check with xev
<VOL+> = 123;
}
xkb_symbols {
key.type = "ONE_LEVEL";
key <VOL-> { [ XF86AudioLowerVolume ] };
key <VOL+> { [ XF86AudioRaiseVolume ] };
}
Échap en ⇑, essentiellement pour les utilisateurs de Vim :
key.type = "ONE_LEVEL";
key <CAPS> { [ Escape ] };
Échange de Ins et impécr parfois inversées sur les portables Dell
key.type = "ONE_LEVEL";
key <INS> { [ Print ] };
key <PRSC> { [ Insert ] };
Ça ne marche pas sur certains HP. À la place, les keycodes eux-même doivent être rredéfinis :
partial xkb_keycodes "insert" {
alias <I118> = <IN?>;
<INS> = 218;
<I218> = 118;
};
Modifier Shift en touche collante :
remplacer
key <LFSH> { [ Shift_L ] };
par
key <LFSH> { [ ISO_Level2_Latch ] };
Vous devez alors ajouter à /usr/share/X11/xkb/compat/basic
ceci :
interpret ISO_Level2_Latch+AnyOf(all) {
useModMapMods=level1;
action= LatchMods(modifiers=Shift,clearLocks,latchToLock);
};
interpret ISO_Level2_Latch+AnyOfOrNone(all) {
action= LatchMods(modifiers=Shift,clearLocks,latchToLock);
};
Pour les touches alphanumériques ordinaires, ajoutez juste une deuxième, troisième, quatrième section à la définition de la clé.
key.type = "ALPHABETIC";
key <AD01> { [ q, Q ], [ a, A ] }; // QWERTY-AZERTY
key <AC02> { [ s, S ], // two cyrillic layouts
[ U044B, U042B ],
[ U0456, U0406 ] };
La commutation entre les dispositions est obtenue en activant l'action LockGroup :
interpret ISO_Next_Group { action = LockGroup(group=+1); };
interpret ISO_Prev_Group { action = LockGroup(group=-1); };
Ça veut dire qu'on place ISO_Next_Group et ISO_Prev_Group dans le bon group/level. Notez que les groupes cyclent, ainsi si vous avez deux groupes et que vous tapez deux foix ISO_Next_Group vous revenez au premier groupe.
Cycler entre deux groupes ou plus se fait avec une touche dédiée par :
key.type = "ONE_LEVEL";
key <RWIN> { [ ISO_Next_Group ] }
Si vous avez plus de deux dispositions de clavier et des touches à perdre, une bonne idée serait de dédier une touche à chaque groupe :
key.type = "ONE_LEVEL";
key <RCTL> { [ ISO_Next_Group ], // g1: switch to g2
[ ISO_Prev_Group ], // g2: switch back to g1
[ ISO_Prev_Group ] }; // g3: switch to g2
key <MENU> { [ ISO_Prev_Group ], // g1: switch to g3
[ ISO_Next_Group ], // g2: switch to g3
[ ISO_Next_Group ] }; // g3: switch back to g1
Avec quatre groupes, vous avez peut-être intérêt à utiliser ISO_Next_Group et ISO_Prev_Group.
La même idée peut s'implémenter avec une seule touche en utilisant le type TWO_LEVEL :
key.type = "TWO_LEVEL";
key <MENU> { [ ISO_Next_Group, ISO_Prev_Group ],
[ ISO_Prev_Group, ISO_Next_Group ],
[ ISO_Prev_Group, ISO_Next_Group ] };
De cette façon on a Menu pour le groupe 2 et Shift-Menu pour le groupe 3. Pour utiliser Ctrl ou Alt à la place de Shift, remplacez TWO_LEVEL respectivment par PC_CONTROL_LEVEL2 ou PC_ALT_LEVEL2.
Basculer en utilisant deux touches de modificateurs (Shif+Shift, Ctrl+Shift, etc.)peut s'obtenir en utilisant quelque chose d'autre que ONE_ELVEL pour ces touches, exemple de Shift+Shift :
key.type = "TWO_LEVEL";
key <LFSH> { [ Shift_L, ISO_Prev_Group ] };
key <RTSH> { [ Shift_R, ISO_Next_Group ] };e
Une touche collante peut s'obtenir avec l'action LatchGroup liée à symbole de touche ISO_Group_Latch :
key <RCTL> { [ ISO_Group_Latch ] }
Ajustez la définition de ISO_Group_Latch dans xkb_compatibility pour utiliser le bon groupe :
interpret ISO_Group_Latch { action = LatchGroup(group=3); };
Examinez /usr/share/X11/xkb/symbols/group pour avoir davantage d'exemples classiques.
Creating keymappings that clear modifiers from the keypress is necessary if the target key is to be used in keyboard shortcuts. For instance, highlighting text from the main keyboard (Shift+Left), or changing chats in most messengers (Alt+Down) will not work if there is an additional Caps modifier sent. However, an additional modifier must be sent if a user rebinds a letter key by simply putting the keysym in the symbols section. Rebinding as follows permits functionality like AHK's blind command.
The types section (which defines layer mapping) must contain an entry such that:
Add this to the bottom of your types section:
xkb_types "complete" {
...
type "CUST_CAPSLOCK" {
modifiers= Shift+Lock;
map[Shift] = Level2; //maps shift and no Lock. Shift+Alt goes here, too, because Alt isn't in modifiers.
map[Lock] = Level3;
map[Shift+Lock] = Level3; //maps shift and Lock. Shift+Lock+Alt goes here, too.
level_name[Level1]= "Base";
level_name[Level2]= "Shift";
level_name[Level3]= "Lock";
};
};
Now change caps from a lock (toggle) to a set (press) by modifying the already existing definition in compatability from LockMods to SetMods:
(Note that this means you cannot use capslock like normal)
xkb_compatibility "complete" {
...
interpret Caps_Lock+AnyOfOrNone(all) {
action= SetMods(modifiers=Lock);
};
...
};
Finally, modify your symbols file as follows.
xkb_symbols "pc_us_inet(evdev)" {
...
key <AC06> {
type= "CUST_CAPSLOCK",
symbols[Group1]= [ h, H, Left],
actions[Group1]= [ NoAction(), NoAction(), RedirectKey(keycode=<LEFT>, clearmods=Lock) ]
};
Taper plus avec les mêmes touches.
Facile à configurer et extrèmement utile pour saisir les caractères Unicode usuels.
key <RALT> { [ Multi_key ] };
L'idée est similaire à Alt ou AltGr dans leur sens originel : les touches alphanumériques ont des caractères supplémentaires, obtenues en appuyant sur certaines touches modificatrices.
Pour commencer mettons en place le modificateur.
xkb_symbols {
key <LWIN> { [ISO_Level3_Shift ] };
modifier_map Mod5 { ISO_Level3_Shift };
}
En outre, ce qui suit devrait déjà être déjà défini dans les sections concernées, mais au cas où ce ne serait pas le cas :
xkb_compatibility {
interpret ISO_Level3_Shift { action= SetMods(modifiers=Mod5); };
}
xkb_types {
type "THREE_LEVEL" {
modifiers= Shift+Mod5;
map[Shift]= Level2;
map[Mod5]= Level3;
map[Shift+Mod5]= Level3;
level_name[Level1]= "Base";
level_name[Level2]= "Shift";
level_name[Level3]= "Level3";
};
type "FOUR_LEVEL" {
modifiers= Shift+LevelThree;
map[Shift]= Level2;
map[LevelThree]= Level3;
map[Shift+LevelThree]= Level4;
level_name[Level1]= "Base";
level_name[Level2]= "Shift";
level_name[Level3]= "Alt Base";
level_name[Level4]= "Shift Alt";
};
}
Notez que les définitions standard ont LevelThree au lieu de Mod5 dans xkb_compatibility et xkb_types. Tant que modifier_map ci-dessus utilise Mod5, il n'y a pas de différence pratique, vous finirez par utiliser le bit de Mod5 de toute façon.
Maintenant, les touches elles-mêmes, les curseurs de style vi dans ce cas :
key.type = "THREE_LEVEL";
key <AC06> { [ h, H, Left ] };
key <AC07> { [ j, J, Down ] };
key <AC08> { [ k, K, Up ] };
key <AC09> { [ l, L, Right ] };
Comme vous pourrez le découvrir en utilisant xev
, ceci produit Mod5+Left au lieu de juste Left. Mais c'est bon car la majorité des applications ignorent les états de bits qu'elles n'utilisent pas. Pour une solution alternative, voyez Overlay plus bas.
Certaines applications (notamment Emacs) permettent un usage significatif d'états de bits supérieurs. On suppose qu'il existe sur le clavier des tpuches appelées Meta, Super, et Hyper en plus des touches Shift, Ctrl et Alt standard, qui contrôlent ces bits. Du point de vue du XKB, cela signifie qu'il faut définir les bits modificateurs Mod2, Mod3, Mod4 et Mod5. Comme vous n'avez besoin que des bits eux-mêmes, il n'est pas nécessaire d'éditer les types comme dans l'exemple Level3 ci-dessus.
xkb_compatibility {
interpret Super_L { action = SetMods(modifiers=Mod3); };
}
xkb_symbols {
key <LWIN> { [ Super_L ] };
modifier_map Mod3 { Super_L };
}
Les définitions standard utilisent le modificateur Super au lieu de Mod3 dans xkb_compatibility. Vous pouvez le garder, assurez-vous simplement que la ligne modifier_map est en place.
Gardez à l'esprit qu'il n'y a pas de correspondance stricte entre ModN et les modificateurs nommés comme Super, Hyper ou même Alt. Mod1 est le seul qui est largement utilisé ; certaines applications l'appellent Meta, d'autres Alt. Pour les autres, vérifiez comment l'application particulière traite les bits d'état, et/ou vérifiez les modificateurs virtuels ci-dessous.
Au moins une application (openbox) est connue pour suivre les événements KeyPress/KeyRelease pour les keysyms Meta_[LR], Super_[LR] et Hyper_[LR] au lieu de se fier aux bits d'état. Dans ce cas
xkb_symbols {
key <LWIN> { [ Super_L ] };
}
est suffisant et vous pouvez omettre les lignes interpret
et modifier_map
.
Parlant d'Openbox, notez qu'effectivement il permet deux méthodes : "S-h" suit les évènements Super_[LR] tandis que "Mod3-h" vérifie les bits d'état pertinents.
XKB est souvent configuré en spécifiant XkbTypes/XkbCompat/XkbSymbols, ou XkbModel/XkbLayout (+XkbVariant/XkbOptions), ou XkbKeymap, généralement dans /etc/X11/xorg.conf ou /etc/X11/xorg.conf.d/*.conf, comme ceci :
Option "XkbModel" "thinkpad60" (en anglais)
Option "XkbLayout" "us,sk,de"
Option "XkbVariant" "altgr-intl,qwerty,"
Option "XkbOptions" "grp:menu_toggle,grp_led:caps"
Ces valeurs définissent la carte XKB complète (celle qui peut être vidée par xkbcomp en combinant plusieurs fichiers de /usr/share/X11/xkb
. En fait, le fichier .xkb équivalent pour xkbcomp peut être obtenu en utilisant Msetxkbmap -print
:
$ setxkbmap -model thinkpad60 -layout us,sk,de -variant altgr-intl,qwerty \
-option -option grp:menu_toggle -option grp_led:caps -print
Notez les déclarations d'inclusion dans la sortie. Les fichiers de chaque section sont récupérés dans les sous-répertoires appropriés sous /usr/share/X11/xkb
, c'est-à-dire
xkb_types { include "complete" } ;
signifie que xkbcomp cherchera /usr/share/X11/xkb/types/complete
. Les signes plus signifient une concaténation, donc
xkb_keycodes { include "evdev+aliases(qwerty)" } ;
signifie
xkb_keycodes {
inclure "evdev" ;
inclure "alias(qwerty)" ;
} ;
Les parenthèses sélectionnent la section nommée dans le fichier. Voyez /usr/share/X11/xkb/keycodes/aliases
et notez
xkb_keycodes "qwerty" { ... } ;
c'est la partie à laquelle alias(qwerty)
fait référence. Enfin, les deux-points permettent de déplacer des parties de la présentation vers un autre groupe.
Contrairement aux valeurs XkbTypes/XkbCompat/XkbSymbols/XkbGeometry, qui définissent directement les sections correspondantes du fichier .xkb, XkbModel, XkbLayout et XkbRules font référence à des fichiers non-xkb supplémentaires qui se trouvent dans /usr/share/X11/xkb/rules/
et qui associent les valeurs de modèle et de disposition à des symboles et à une géométrie spécifiques. XkbKeymap fait référence à des cartes de touches complètes. Consultez la page de Ivan Pascal pour une description détaillée.
Tout comme avec l'approche xkbcomp(1), ce type de configuration peut être fait à la volée : utilisez setxkbmap
sans l'option -print.
Les fichiers de /usr/share/X11/xkb
sont une bonne source d'exemples, spécialement lorsqu'il s'agit de fonctionnalités de clavier standard avec une implémentation XKB non triviale (par exemple, la gestion du clavier/NumLock). De plus, ce sont les fichiers que vous devez éditer pour pousser vos changements en amont. Vérifiez cependant les règles de configuration du clavier X avant de le faire.
Vous pouvez configurer une disposition de clavier depuis un fichier local avec la commande suivante
$ xkbcomp keymap.xkb $DISPLAY
où keymap.xkb
doit avoir la structure suivante :
keymap.xkb
xkb_keymap {
xkb_keycodes { ... };
xkb_types { ... };
xkb_compat { ... };
xkb_symbols { ... };
// Geometry is completely optional.
// xkb_geometry { include "pc(pc104)" };
};
Vous pouvez faire des inclusions depuis ce fichier, lesquelles se réfèrent à un dossier local, au lieu de /usr/share/X11/xkb/
. Pour ce faire vous devez utiliser une directive -I/chemin/
pour xkbcomp. Exemple :
$ xkbcomp -I$HOME/.xkb $HOME/.keymap.xkb $DISPLAY
$HOME/.keymap.xkb
xkb_keymap {
xkb_keycodes { include "evdev+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compat { include "complete" };
xkb_symbols { include "pc+custom+inet(evdev)" };
};
Le fichier symbol doit avoir le même nom que celui spécifié dans xkb_symbols
juste au dessus.
$HOME/.xkb/symbols/custom
partial alphanumeric_keys xkb_symbols "custom" { ... };