Journal Remplacer votre ~/.Xmodmap

Posté par (page perso) .
Tags : aucun
1
24
sept.
2006

Xmodmap, c'est bien mais ce n'est pas parfait. Si par exemple on tente de changer les touches Ctrl et Alt de placer avec Xmodmap, on a des problèmes pour revenir à une console linux avec Ctrl+Alt+Fn. Ou tout simplement car xmodmap est marqué deprecated.



La solution, se passer de xmodmap et utiliser xkbcomp avec les fichiers de description xkb.



Au début, je pensait qu'il n'était pas possible de modifier la configuration de xkb sans être root sur la machine, mais en fait, c'est possible ! Comment ? Tout simplement car le compilateur xkbcomp peut avoir comme source ou destination un display.



Par exemple,

xkbcomp config.xkb $DISPLAY
permet de remplacer la config xkb du serveur par sa propre config.



Après, comment faire une config xkb ? Ce n'est malhereusement pas aussi simple que xmodmap, mais on s'en sort (après quelques heures :). Pour cela, je conseille le "unreliable guide to XKB Configuration" [1] qui m'a beaucoup aidé.



En faisant simple, la configuration XKB se décompose en plusieurs parties. Les fichiers de configuration de chaque partie se trouvent généralement dans un dossier portant le nom de celle-ci mais pas obligatoirement. Dans mon cas, j'ai redéfini plusieurs parties, et tout les fichiers étaient dans le même dossier.



La configuration système se trouve (chez moi) dans le dossier

/usr/lib/X11/xkb
. Je vous conseille de vous inspirer des fichiers que vous trouverez là. Il est intéressant de noter que
xkbcomp
ira chercher dans ces dossiers les fichiers demandés par la commande
include
, on peut donc facilement inclure les fichiers du système.



Chaque fichier de configuration est composé de plusieurs "fonctions" ... je ne sais pas trop comment les appeler. Lors de l'inclusion, on peut choisir d'exécuter soit la "fonction" par défaut (en premier dans le fichier) ou une autre. Pour inclure une "fonction" spécifique, on utilise :

include "filename(fonction)"
. Pour une inclusion simple, on utilise
include "filename"
.

La syntaxe est : [modifiers] type "name" { code };
- Les
modifiers
sont définis à l'adresse [2].
- Le type dépend de la section que vous configurez, regardez les fichiers existants.
- Le code est très dépendant aussi, regarder le "Unreliable Guide to XKB Configuration" [1] pour plus de détails (chapitre 5)


Voyons maintenant cette configuration :



keycodes



La configuration des keycodes permet d'associer à un keycode (nombre donné directement par le clavier) à un nom de touche. Le nom de touche est entre < et > et en majuscule et fait moins de 4 lettres.
Pas grand chose à dire sauf que si vous pensez changer physiquement des touches du clavier, c'est par là que vous devez modifier des choses.



Comme toujours, il faut réutiliser l'existant, c'est mieux. Dans mon exemple, voila ce que j'ai fait :



default xkb_keycodes "basic" {


// On récupère les keycodes par défaut
include "xfree86(xfree86)"

// On réaffecte certains keyname.
// Cette affectation détruit toute assotiation entre le keyname qu'on
// affecte et toute assotiation du keycode avec un autre keyname.

// Note : enlevez les espaces entre < le keyname et >
< LCTL > = 64; // initially < LALT >
< LALT > = 37; // initially < LCTL >
< MENU > = 109; // initially < RCTL >
< RCTL > = 113; // initially < RALT >
< RALT > = 117; // initially < MENU >

// Le fichier s'appelle "mildred_keycodes". Cette instruction va inclure
// (donc exécuter) la "fonction" bksl_as_bksp définie juste un peu plus
// loin

//include "mildred_keycodes(bksl_as_bksp)"

};

hidden partial
xkb_keycodes "bksl_as_bksp" {

// Mon clavier à mis la touche */µ (appelée < BKSL >) juste à coté du
// backspace ce qui me pose le problème d'appuyer dessus parfois au
// lieu de backspace. Ici, je lui donne un autre nom (< BKS2 >,
// Backspace n° 2) afin d'avoir deux touches backspace.

// Note : enlevez les espaces entre < le keyname et >
< BKS2 > = 51;
};


symbols



Cette section vous permet d'associer à chaque touche (les touches définies dans la section keycodes) différents symboles. De la même manière que dans kmodmap, le premier symbole correspond à la touche sans modificateur, le 2e lorsqu'on appuie sur shift, le 3e lorsqu'on appuie sur AltGr (ou tout autre modificateur de groupe), le 4e lorsqu'on a à la fois AltGr et Shift, le 5e, lorsqu'on a activé le 3e groupe, ...



Pour voir les keynames existants, voir la table [3]



Ce n'est pas très compliqué, voir les fichiers d'exemple existants ... et toujours utiliser include pour réutiliser du code existant. Voici un extrait de ma configuration :



partial default alphanumeric_keys

xkb_symbols "basic" {

include "fr(latin9)"
include "mildred_symbols(mildred_modifications)"

};

partial hidden alphanumeric_keys
xkb_symbols "mildred_modifications" {

// Redéfinition de certaines touches

// Note : enlevez les espaces entre < le keyname et >
key < AD01 > { [ a, A, ae, AE ] };
key < AD09 > { [ o, O, oe, OE ] };
key < TLDE > { [ at, numbersign, leftdoublequotemark, rightdoublequotemark ] };

// Création de ma 2e touche backspace.

// Note : enlevez les espaces entre < le keyname et >
key < BKS2 > {
type="CTRL+ALT",
symbols[Group1]= [ BackSpace, Terminate_Server ]
};

};


types



Chaque touche (keyname) à un type. par défaut, il est affecté automatiquement mais on peut le changer manuellement. Le type permet de changer l'effet des modificateurs (shift, caps lock, ...) sur les touches en fonction de leur type.



Je ne pense pas que ce soit très utile de modifier cette partie, plus de détails dans le document [1].



compat



La configuration compat permet de définir les modificateurs utilisés par les applications. Les modificateurs peuvent directement correspondre à une touche ou être virtuels et se déclancher en fonction de plusieurs paramètres. Le tableau [4] liste les modificateurs existants gérés par X11 et que les applications regardent afin d'en déduire les raccourcis clavier.



Cette configuration permet aussi de déterminer quand les LEDs du clavier sont allumées ou non.



geometry



Ce module est presque inutile, il permet de dire à XKB où se situent les touches géographiqument sur le clavier, leur rondeur et plein d'autres choses. Cela permet de dessiner des images de votre clavier avec xkbprint.



rules



les rumles sont des (un) fichier(s) de configuration qui permet à XKB de déterminer quels symboles associer à vos touches en fonction du type de votre clavier ... c'est clairement un système de règles qui pour chaque couple de valeurs en entrée associe une table des symboles à utiliser.
Ce n'est pas utile pour une configuration personnalisée car c'est le système qui permet au système de trouver automatiquement la configuration de notre clavier



keymaps



Les keymaps sont la version statique des rules, C'est juste un petit fichier qui dit quels fichiers keycodes, types, compat, symbols et geometry utiliser. Ce système est déprécié en faveur des rules mais i lreste utile pour avoir une configuration personnelle statique. C'est très simple, voici ma configuration :



xkb_keymap {

xkb_keycodes { include "xfree86+aliases(azerty)+mildred_keycodes" };
xkb_types { include "complete" };
xkb_compat { include "mildred_compat" };
xkb_symbols { include "pc(pc105)+mildred_symbols" };
xkb_geometry { include "pc(pc105)" };
};


Vous remarquerez que les includes ont parfois des +. Cela permet simplement de dire d'include plusieurs fichiers à la suite (il me semble).



Pour avoir votre keymap courante, il faut taper la commande

setxkbmap -print
.


Je vous conseille de prendre le résultat de cette commande pour en faire votre keymap personnelle et ensuite de copier dans le même dossier que votre keymap les fichiers inclus que vous voulez changer et de les modifier. Si possible en incluant le fichier original.



Dans mon cas, le fichier mildred_symbols est une copie du fichier /usr/lib/X11/xkb/symbols/fr et je l'ai modifié pour qu'il inclue le plus possible le fichier fr.



Une fois que votre keymap est prête, vous pouvez l'installer avec la commande

xkbcomp ma_keymap $DISPLAY
. Je ne sais pas comment faire avec setxkbmap ...



En espérant que ce (long) journal soit utile.
Mildred



Notes



  1. http://www.charvolant.org/~doug/xkb/html/index.html


  2. http://www.charvolant.org/~doug/xkb/html/node5.html#SECTION0(...)


  3. table des symboles pour un clavier pc105
    // Source : http://gpl.insa-lyon.fr/Dvorak-Fr/CarteDuClavier
    
    // See Unicode U+2500
    // See xkb/keycodes/xfree86
    //
    // ┌────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐
    // │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
    // │ESC │ │FK01│FK02│FK03│FK04│ │FK05│FK06│FK07│FK08│ │FK09│FK10│FK11│FK12│
    // └────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘
    // ┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────╔════════╗
    // │ │ │ │ │ │ │ │ │ │ │ │ │ ║ ║
    // │TLDE│AE01│AE02│AE03│AE04│AE05│AE06│AE07│AE08│AE09│AE10│AE11│AE12║ BKSP ║
    // ╔════╧══╗─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─╚══╦═════╣
    // ║ ║ │ │ │ │ │ │ │ │ │ │ │ ║ ║
    // ║ TAB ║AD01│AD02│AD03│AD04│AD05│AD06│AD07│AD08│AD09│AD10│AD11│AD12║ RTRN║
    // ╠═══════╩╗───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───╚╗ ║
    // ║ ║ │ │ │ │ │ │ │ │ │ │ │ ║ ║
    // ║ CAPS ║AC01│AC02│AC03│AC04│AC05│AC06│AC07│AC08│AC09│AC10│AC11│BKSL║ ║
    // ╠══════╦═╝──┬─┴──┬─┴──┬─┴─══─┴──┬─┴──┬─┴─══─┴──┬─┴──┬─┴──┬─┴──╔═╧════╩════╣
    // ║ ║ │ │ │ │ │ │ │ │ │ │ ║ ║
    // ║ LFSH ║LSGT│AB01│AB02│AB03│AB04│AB05│AB06│AB07│AB08│AB09│AB10║ RTSH ║
    // ╠══════╩╦═══╧══╦═╧═══╦╧════╧════╧════╧════╧══╦═╧════╧╦═══╧══╦═╩════╦══════╣
    // ║ ║ ║ ║ ║ ║ ║ ║ ║
    // ║ LCTL ║ LWIN ║ LALT║ SPCE ║ RALT ║ RWIN ║ MENU ║ RCTL ║
    // ╚═══════╩══════╩═════╩═══════════════════════╩═══════╩══════╩══════╩══════╝
    //
    // ┌────┬────┬────┐
    // │PRSC│ │ │ ╭─╮ ╭─╮ ╭─╮ 1 : Caps Lock
    // │SYRQ│SCLK│PAUS│ ╰─╯ ╰─╯ ╰─╯ 2 : Num Lock
    // └────┴────┴────┘ 2 1 3 3 : Scroll Lock
    // ┌────┬────┬────┐ ┌────┬────┬────┬────┐
    // │ │ │ │ │ │ │ │ │
    // │INS │HOME│PGUP│ │NMLK│KPDV│KPMU│KPSU│
    // ├────┼────┼────┤ ├────┼────┼────┼────┤
    // │ │ │ │ │ │ │ │ │
    // │DELE│END │PGDN│ │KP7 │KP8 │KP9 │ │
    // └────┴────┴────┘ ├────┼────┼────┤ │
    // │ │ │ │ │
    // │KP4 │KP5 │KP6 │KPAD│
    // ┌────┐ ├────┼────┼────┼────┤
    // │ │ │ │ │ │ │
    // │ UP │ │KP1 │KP2 │KP3 │ │
    // ┌────┼────┼────┐ ├────┴────┼────┤ │
    // │ │ │ │ │ │ │ │
    // │LEFT│DOWN│RGHT│ │ KP0 │KPDL│KPEN│
    // └────┴────┴────┘ └─────────┴────┴────┘


  4. Touches de controle
    // X name   Key name
    
    // ------ --------
    // Shift Shift
    // Lock CapsLock
    // Control Control
    // Mod1 Alt
    // Mod2 NumLock
    // Mod3 Hyper
    // Mod4 Meta
    // Mod5 Super


    • # compiler sa keymap

      Posté par (page perso) . Évalué à 4.

      Si on voyage ailleurs par exemple (la keymap étant dépendante du système à cause des include) c'est possible. Cela peut aussi être utile si on veut enlever tous les warnings de la compilation (il y en a beaucoup chez moi).
      # compilation
      $ xkbcomp map.xkb map_compilee.xkm
      # installation
      $ xkbcomp map_compilee.xkm $DISPLAY
      
      le fichier map_compilee.xkm est suffisant en soi. Finalement setxkbmap ne sert plus à rien :)
    • # Merci pour ce journal

      Posté par . Évalué à 6.

      Je n'ai actuellement pas trop le temps de le lire en détail, donc je les mis dans mes marques-pages.
      Cependant, je suis content de voir ça, car j'ai plusieurs fois déjà essayé de créer des mappages personnalisés.
      Ce fut le cas pour le dvorak fr ou je voulais déplacer quelques touches, aussi pour rajouter de façon accessible le ŭ en esperanto et faire un mappage pour le dvorak esperanto qui existe déjà.
      Xmodmap est pratique pour des petits changements, mais pas évident pour des gros.

      Voilà donc merci pour le journal
      • [^] # Re: Merci pour ce journal

        Posté par . Évalué à 1.

        Bien que je sois satisfait de Xmodmap, je vais sûrement lire le truc. En tout cas, c'est cool d'avoir fait un truc aussi bien expliqué.

        Ça n'a pas grand chose à voir, mais à quoi ça sert l'esperanto ? (ceci est une question naïve)
    • # xdm

      Posté par . Évalué à 2.

      Reste le problème de xdm quand tu as un clavier très perso ...
    • # un site à partager

      Posté par (page perso) . Évalué à 3.

      Je n'ai pas encore regardé en détail mais j'ai l'impression que c'est LE manuel de référence : http://pascal.tsu.ru/en/xkb/

    Suivre le flux des commentaires

    Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.