Journal Déplacer les touches contrôle avec TM2030

Posté par . Licence CC by-sa
4
10
jan.
2015

Cher journal,

Dans Emacs, bash, ou n'importe quel logiciel, j'utilise intensivement les touches contrôles. En tant qu'utilisateur de clavier TypMatrix, j'ai senti que les touches contrôles étaient bien trop inaccessibles sous l'auriculaire. J'ai donc cherché à les déplacer sous le pouces, très exactement sur la touche CycleWindow (dite shuffle) et la touche Desktop.

Sur TypeMatrix 2030, on peut remapper les touches de raccourcis lorsqu'on est en mode 106. Après une tentative fructueuse avec xmodmap, je me suis dis laissé allé à faire le code pour XKB, son successeur.

J'ai donc créé deux options XKB : ctrl:none et ctrl:tm2030_thumb. La première option désactive les touches contrôles. Autant dire qu'elle est très dangeureuse. La seconde définie les touches shuffle et bureau comme touches contrôles. En fait, ctrl:none sert à se forcer à utiliser le pouce pour les raccourcis. En une heure de code, l'habitude est prise ;)

Seul soucis que j'ai, je suis obligé de patché /usr/share/X11/xkb/rules/evdev car xkb n'utilise qu'un seul fichier de règles :/ Pas de ~/.config/xkb :(

Le script :

set -ex

XKBDIR=${XKBDIR:-/usr/share/X11/xkb}

# Définir les règles dans un fichier custom
cat > ${XKBDIR}/symbols/custom <<EOF
partial modifier_keys
xkb_symbols "tm2030_thumb" {
    modifier_map Control { <MUHE>, <HENK> };
};

partial modifier_keys
xkb_symbols "noctrl" {
    key <LCTL> { [ VoidSymbol ] };
    key <RCTL> { [ VoidSymbol ] };
};
EOF

# Déclarer les options dans le fichier evdev, après ctrl:ralt_rctrl
sed -i "/custom(/d" ${XKBDIR}/rules/evdev;
sed -i.bak '/ralt_rctrl/r /dev/stdin' ${XKBDIR}/rules/evdev <<EOF
  ctrl:tm2030_thumb     =       +custom(tm2030_thumb)
  ctrl:none             =       +custom(noctrl)
EOF

L'idée de ce script est que je peux le relancer avec une màj du paquet debian :)

Ensuite reste plus qu'à ajouter les options ctrl:none,ctrl:tm2030_thumb dans /etc/default/keyboard ou dans dconf :

gsettings set org.gnome.desktop.input-sources xkb-options "['ctrl:tm2030_thumb', 'ctrl:none']"

Au final, je trouve qu'xkb est plus pratique que Xmodmap, car il permet d'activer / désactiver les options. De plus il est bien intégré aux environnement de bureau. Néanmoins, c'est dommage de ne pas pouvoir donner des règles personnelles dans /etc/X11/xkb/ ou autre.

Le changement est radical. Je sens beaucoup moins de tensions dans l'auriculaires. Après, ça n'empêche pas

Grâce à ce script, vous deviendrez un vrai gourou de l'informatique, un légende : celui qui a remappé ses touches contrôles ! ;-)

  • # Gestion du ç

    Posté par . Évalué à 4. Dernière modification le 10/01/15 à 22:29.

    Ave,

    Une màj du script, j'ai ajouté un patch de BÉPO pour le mode 106, qui ajoute le ç sous le M, comme en mode normal.

    cat > ${XKBDIR}/symbols/custom <<EOF
    partial alphanumeric_keys
    xkb_symbols "bepo_tm2030_106" {
        include "fr(bepo)"
        key <AB11> { [ ccedilla, Ccedilla, dead_cedilla, dead_belowcomma ] };
    };
    
    partial modifier_keys
    xkb_symbols "tm2030_thumb" {
        modifier_map Control { <MUHE>, <HENK> };
    };
    
    partial modifier_keys
    xkb_symbols "noctrl" {
        key <LCTL> { [ VoidSymbol ] };
        key <RCTL> { [ VoidSymbol ] };
    };
    EOF
    
    sed -i "/custom(/d" ${XKBDIR}/rules/evdev;
    
    sed -i.bak '/ralt_rctrl/r /dev/stdin' ${XKBDIR}/rules/evdev <<EOF
      ctrl:tm2030_thumb     =       +custom(tm2030_thumb)
      ctrl:none             =       +custom(noctrl)
    EOF
    
    sed -i '/model\s*layout\s*variant\s*=\s*symbols$/r /dev/stdin' ${XKBDIR}/rules/evdev <<EOF
      tm2030USB-106 fr bepo = pc+custom(bepo_tm2030_106)
    EOF

    Il faut ensuite configurer son clavier pour utiliser lo modèle tm2030USB-106 (existant par défaut), le layout fr et la variante bepo.

    • [^] # Re: Gestion du ç

      Posté par . Évalué à 2.

      Exemple de /etc/default/keyboard :

      XKBMODEL="tm2030USB-106"
      XKBLAYOUT="fr"
      XKBVARIANT="bepo"
      XKBOPTIONS="ctrl:tm2030_thumb,ctrl:none"
  • # Faut utiliser la paume

    Posté par . Évalué à 2.

    C'est moins high-tech, mais la touche ctrl droite tombe pile poil sous le bord droit de la paume quand tu mets tes doigts sur la rangée de repos.

  • # xmodmap ?

    Posté par . Évalué à 2.

    Pourquoi xmodmap fonctionnerait pas ? Sur mon clavier logitech, pour inverser contrôle droit et la touche windows, c’est deux lignes :

    keycode 105 = Super_R
    keycode 134 = Control_R

    • [^] # Re: xmodmap ?

      Posté par . Évalué à 3.

      Comme dit dans le journal, xmodmap fonction sauf que dans GNOME si tu débranche ou rebranche un périphérique, tu dois relancer xmodmap à la main.

      Xmodmap a été abandonné car il ne pouvait pas supporter certains niveau d'accès aux touches. Il faudrait creuser plus pour savoir les motivations. Personnellement, je m'en fout de savoir si c'était mieux avant ou pas. Je fais confiance aux dev de Xorg.

      Après avoir utilisé Xmodmap, je me suis donc dit que a serait bien d'avoir la solution qui passe par les outils intégrés de mon système. En l'occurrence, XKB.

    • [^] # Re: xmodmap ?

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

      J'ai fait un truc similaire avec mon clavier précédent, ça marchait partout sauf… sous Firefox et Thunderbird (oui, le bug est rapporté depuis des années). Un peu frustrant ; je ne sais pas si le bug est aussi présent avec la méthode xkb.

  • # Configuration utilisateur

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

    Les commandes comme setxkbmap, xkbcomp, ckbcomp gèrent l'option -Idir. Pas certain que ça soit accessible via /etc/default/keyboard & friends, mais tu dois pouvoir scripter assez facilement un appel setxkbmap avec les bonnes options plutôt que continuer à patcher des fichiers système contrôlés par dpkg.

    Debian Consultant @ DEBAMAX

    • [^] # Re: Configuration utilisateur

      Posté par . Évalué à 3.

      Oui, je sais bien. J'ai pas mal cherché :/

      https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=586371

    • [^] # Re: Configuration utilisateur

      Posté par . Évalué à 2.

      Je confirme, pas la peine de patcher les fichiers systèmes.

      Personnellement, j'ai tuné ma configuration xkb pour échanger "Caps-Lock" (qui ne sert presque jamais, il faut le dire) et "²" (qui ne sert plutôt jamais non plus, mais au moins qu'on peut remapper super facilement, par exemple pour faire de la complétion de mots dans vim ou bien pour faire du menu-complete dans zsh).

      Première étape, récupérez la configuration xkb en cours :

      $ setxkbmap -print > myxkbconfig
      

      Modifiez cette configuration pour ajouter nos nouveaux bindings:

      xkb_keymap {
              xkb_keycodes  { include "evdev+aliases(azerty)" };
              xkb_types     { include "complete"      };
              xkb_compat    { include "complete"      };
              xkb_symbols   { include "pc+fr(oss)+inet(evdev)"
      +
      +    // ² is caps-lock
      +    key <TLDE> { [ Caps_Lock ] };
      +
      +    // caps is ² (for completion)
      +    key <CAPS> { [ twosuperior ] };
      +
          };
              xkb_geometry  { include "pc(pc104)"     };
      };
      

      Et maintenant, on peut recharger proprement cette nouvelle configuration pour qu'elle soit appliquer:

      xkbcomp  -w 0 -R/usr/share/X11/xkb/ myxkbconfig ${DISPLAY}
      

      Le fichier de configuration peut tout à fait être sauvé dans ton repository dotfiles (et donc même être réutilisé sur différentes machines), et la commande xkbcomp pour charger la configuration peut être mise dans un script qui est lancé par kde ou gnome au démarrage de la session graphique.

      • [^] # Re: Configuration utilisateur

        Posté par . Évalué à 2.

        Et donc s’il y a des modifications dans les fichiers systèmes suite à une mise à jour, elles ne seront pas répercutées chez toi.

        Ça va finir comme systemd cette histoire :)

        • [^] # Re: Configuration utilisateur

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

          C'est sûr que ça serait dommage d'échapper aux blagues comme l'introduction de Ctrl vs. Primary, ou encore le changement de comportement de Right Ctrl

          Sinon, pour avoir maintenu xkeyboard-config pendant quelques temps, tu as surtout envie de récupérer les modifications quand tu es affecté par un bogue concercant ta keymap/tes options, auquel cas tu es au courant et/ou tu as déjà le patch localement. :)

          Debian Consultant @ DEBAMAX

        • [^] # Re: Configuration utilisateur

          Posté par . Évalué à 0.

          Il me semble que si, car le fichier que tu récupères via setxkbmap -print ne contient que des includes de fichiers systèmes.

          Et plus tard, quand tu charges le fichier de configuration avec xkbcomp, tu lui donnes le chemin vers ces fichiers systèmes (qui peuvent donc tout à fait être mis à jour, indépendamment des quelques bindings que tu as redéfini).

      • [^] # Re: Configuration utilisateur

        Posté par . Évalué à 2.

        Comment fais-tu pour que ta config soit chargée automatiquement par xorg ?

        • [^] # Re: Configuration utilisateur

          Posté par . Évalué à 1.

          un autostart.sh lancé au démarrage de la session ?
          (en tout cas, ça se passe comme ça chez moi; donc c'est ma meilleure hypothèse)

          • [^] # Re: Configuration utilisateur

            Posté par . Évalué à 1.

            Oui, comme je l'indiquais dans mon premier message, dans mon cas l'appel à la commande xkbcomp est situé dans un script qui est lancé par l'autostart de KDE.

          • [^] # Re: Configuration utilisateur

            Posté par . Évalué à 2. Dernière modification le 12/01/15 à 10:37.

            Ok, donc c'est bien ce que je disais au début. Ce que je cherche, ce sont des options appelable depuis GNOME, cf la commande gsettings. Si je passe par un script, je suis certain que GNOME ne le rappellera pas lorsque je branche un clavier Azerty par exemple (en binômage, etc.).

            • [^] # Re: Configuration utilisateur

              Posté par . Évalué à 0.

              xkbcomp avec la configuration appropriée te permet de basculer entre plusieurs dispositions de clavier avec un raccourci clavier de ton choix. Il me semble que l'assistant de config clavier GNOME te permet de faire plus ou moins la même chose (GNOME 2 proposait une GUI qui offrait les mêmes options que xkbcomp, je ne sais pas si ça a évolué).

              (je ne vois pas le bénéfice de manips en fonction du clavier physique que tu branches, et je doute que ce soit intégré à la suite GNOME)

    • [^] # Re: Configuration utilisateur

      Posté par . Évalué à 2.

      Comme l'indique Étienne, xkb et consort sont méga buggés et difficilement utilisable avec des options. Perso, j'avais déjà tellement passé de temps à les faire marcher que je n'ai pas eu le courage de rapporter les bugs. L'ensemble est si complexe et incompréhensible que je ne sais pas quelle serait la « bonne » solution (… passer te voir ?…)

      Mon fichier de symboles est ici : http://dolka.fr/code/gitweb/?p=dotfiles.git;a=blob;f=.xkb/symbols/tmtweaks;hb=refs/heads/work
      Le reste de mon .xkb contient le nécessaire pour que ça fonctionne.
      J'ai un petit script pour le charger mais uniquement pour un clavier TypeMatrix : http://dolka.fr/code/gitweb/?p=dotfiles.git;a=blob;f=bin/load_my_tm.sh;hb=refs/heads/work
      Mais c'est du bidouillage. En passant, ce script montre que l'option -i (pour charger le keymap pour un clavier particulier, quand on en a plusieurs) ne fonctionne également pas. Quand un soft est buggé à ce point, je n'ai pas le courage de le corriger.

  • # Désactiver la valeur par défaut des touches

    Posté par . Évalué à 2.

    J'ai fait un correctif pour que CycleWindow et Desktop n'envoie plus les symboles japonais. Ça donne :

    #!/bin/bash
    
    set -ex
    
    XKBDIR=${XKBDIR:-/usr/share/X11/xkb}
    
    cat > ${XKBDIR}/symbols/custom <<EOF
    partial alphanumeric_keys
    xkb_symbols "bepo_tm2030_106" {
        include "fr(bepo)"
        key <AB11> { [ ccedilla, Ccedilla, dead_cedilla, dead_belowcomma ] };
    };
    
    partial modifier_keys
    xkb_symbols "tm2030_thumb" {
        key <MUHE> { [ Control_L, Control_L ] };
        key <HENK> { [ Control_R, Control_R ] };
        modifier_map Control { <MUHE>, <HENK> };
    };
    
    partial modifier_keys
    xkb_symbols "noctrl" {
        key <LCTL> { [ VoidSymbol ] };
        key <RCTL> { [ VoidSymbol ] };
    };
    EOF
    
    sed -i "/custom(/d" ${XKBDIR}/rules/evdev;
    
    sed -i.bak '/ralt_rctrl/r /dev/stdin' ${XKBDIR}/rules/evdev <<EOF
      ctrl:tm2030_thumb     =       +custom(tm2030_thumb)
      ctrl:none             =       +custom(noctrl)
    EOF
    
    sed -i '/model\s*layout\s*variant\s*=\s*symbols$/r /dev/stdin' ${XKBDIR}/rules/evdev <<EOF
      tm2030USB-106 fr bepo = pc+custom(bepo_tm2030_106)
    EOF
  • # Une autre solution, full XKB

    Posté par . Évalué à 1.

    Je vois que je ne suis pas le seul à avoir des problèmes avec la touche CTRL gauche de ce fameux Typematrix 2030.

    De mon côté, je swap CTRL gauche et ALT gauche. Résultat, ça marche bien ! Et de même avec un clavier dit standard (ce qui ne doit pas être le cas avec la touche shuffle du TM2030).

    Voici le « sublayout » que j'ai salement déposer à la fin de mon layout perso :

    partial modifier_keys
    xkb_symbols "swap-ctrl-alt" {
      include "fr-colemak"                             // ici j'importe mon layout, donc pas générique
      replace key <LCTL> { [ Alt_L,     Alt_L     ] }; // ici, c'est interessant
      replace key <LALT> { [ Control_L, Control_L ] }; // là aussi
    };
    

    En une simple commande, je load mon layout ainsi que le swap-ctrl-alt qui m'est aujourd'hui indispensable.

Suivre le flux des commentaires

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