OVH Cloud OVH Cloud

Emacs, X11 et fonctionnement du clavier

10 réponses
Avatar
Sébastien Kirche
Bonjour,

je viens de passer un moment à batailler avec xmodmap pour modifier mon
clavier sans comprendre totalement ce que j'ai fait.

Sur mon iBook, les touches de la dernière rangée se présentent comme
suit : [fn] [ctrl] [option (alt)] [command (pomme)] [espace]...

Avec la disposition de clavier par défaut (xkbmodel macintosh, xkblayout us,
xkbvariant us mais j'ai aussi essayé ibook) xev m'indique que alt
retourne Alt_L et la pomme Super_L.

Mon problème avec Emacs c'est qu'il utilise alt comme touche Meta et
qu'il ne veut rien faire avec Super pour laquelle il n'y a aucun
binding, or moi je préfère utiliser la touche a plus proche d'espace
(soit pomme) comme touche Meta.

J'ai essayé de réaffecter les touches en inversant les valeurs des
keysyms associées aux keycodes de alt et pomme comme me les donnait xev
mais je ne suis pas parvenu à un résultat entièrement satisfaisant. J'ai
bien le Meta pour Emacs sur pomme mais alt réagit de même. Et c'est sans
avoir utilisé la keysym Meta_L mais Super_L sur alt et Alt_L sur pomme.

Je suis pas sûr d'avoir entièrement compris comment fonctionne tout le
truc. Notamment le principe des mod1 à mod5 et les recherches que j'ai
faites m'ont mené soit sur des définitions de keymap, soit sur la page
de man de xmodmap. De plus j'ai eu l'impression que la redéfinition des
touches via xmodmap nécessite de relancer les applications pour que la
modif soit prise en compte (du moins pour Emacs).

Auriez-vous de pointeurs vers une explication du fonctionnement du
clavier et des ses modificateurs ?

--
Sébastien Kirche

10 réponses

Avatar
lhabert
Sébastien Kirche :

J'ai essayé de réaffecter les touches en inversant les valeurs des
keysyms associées aux keycodes de alt et pomme comme me les donnait xev
mais je ne suis pas parvenu à un résultat entièrement satisfaisant. J'ai
bien le Meta pour Emacs sur pomme mais alt réagit de même. Et c'est sans
avoir utilisé la keysym Meta_L mais Super_L sur alt et Alt_L sur pomme.


Mouarf. Il arrive des fois des phénomènes bizarres.

Je suis pas sûr d'avoir entièrement compris comment fonctionne tout le
truc. Notamment le principe des mod1 à mod5 et les recherches que j'ai
faites m'ont mené soit sur des définitions de keymap, soit sur la page
de man de xmodmap. De plus j'ai eu l'impression que la redéfinition des
touches via xmodmap nécessite de relancer les applications pour que la
modif soit prise en compte (du moins pour Emacs).


Bah je peux te dire ce que j'en connais. Déjà, sache que je ne comprends
rien à xkb qui rajoute un gros bazar par-dessus ce que je vais t'expliquer.

À la base, on a les keycodes, qui sont des nombres, et 8 modificateurs, qui
sont chacun des bits activables indépendament les uns des autres. Quand tu
appuyes ou relache une touche, les programmes reçoivent un keycode et l'état
des modificateurs juste avant l'appui/relachement. Chaque programme possède
une table qui lui permet d'interpréter l'évènement reçu. À chaque fois que
le mapping clavier est modifié, le serveur X envoie un évènement contenant
la nouvelle table à tous ses clients (donc si le programme est bien écrit,
il n'y a pas besoin de le relancer après modification du mapping).

Il y a aussi les keysyms, qui sont des symboles (caractères et autres). Un
mapping clavier comporte une table d'association qui a tout keycode associe
un keysym (en fait, plusieurs, lequel est choisi dépend des modificateurs
activés). Quand un client reçoit un évènement, il regarde dans sa table
d'association pour voir quel keysym il a reçu.

Enfin, les modificateurs. Il y en a trois nommés (Control, Shift, Lock), et
cinq anonymes (Mod1 .. Mod5). Un mapping clavier contient pour chaque
modificateur une liste de keysyms. Quand une touche est enfoncée/relachée,
le serveur X regarde si le keysym associé à la touche est dans les listes
de keysyms des modificateurs, et active/désactive les modificateurs
correspondants.

Voilà, c'est tout, il n'y a donc pas de modificateur Meta, Alt, Super, ...
Il y a deux manières de leur donner un sens :
- la méthode jmenfoutiste à la Gtk/Qt/Fvwm qui consiste à décréter que Meta
= Mod1, Alt = Mod2 ...
- la méthode historique de Xt qui consiste à dire que Meta = le Modi tel que
Meta_L ou Meta_R est dans la liste de keysyms de Modi (ne surtout pas se
demander ce qu'il se passe si ils sont dans les listes de keysyms de
plusieurs modificateurs).

Tu peux obtenir les listes de keysyms des modificateurs avec « xmodmap
-pm », et en définir une avec « xmodmap - <<EOF
clear Mod1
add Mod1 = Meta_L
EOF », par exemple. Pour ton cas, quelque chose comme :

clear Mod1
clear Mod2
clear Mod3
clear Mod4
clear Mod5

keycode keycodedealt = Alt_L
keycode keycodedeoption = Meta_L

add Mod1 = Meta_L
add Mod2 = Alt_L

, me parait tout indiqué. Si tu veux un altgr, il te faut en plus une
ligne :

add Mod3 = ISO_Level3_Shift

ou s/ISOmachin/Mode_switch/ suivant comment il est défini actuellement.

Ceci à un inconvénient : on contourne xkb, ce qui met la zone au niveau des
séquences de touches spéciales du serveur X à la ctrl alt F?. Si tu as de
la chance, il suffira d'appuyer sur alt à la place d'option ou vice-versa.

Avatar
Fabien LE LEZ
On Sun, 11 Jun 2006 18:00:04 +0000 (UTC), (Luc
Habert):

Il y a aussi les keysyms, qui sont des symboles (caractères et autres). Un
mapping clavier comporte une table d'association qui a tout keycode associe
un keysym (en fait, plusieurs, lequel est choisi dépend des modificateurs
activés).


Comment ça se passe pour le "ê" ?

Avatar
lhabert
Fabien LE LEZ :

Comment ça se passe pour le "ê" ?


Ça dépend comment tu le tapes.

Si tu tapes sur un dead_circumflex (classiquement le « ^ » juste à gauche
d'entrée sur les azerty) puis un « e », le client reçoit deux évènements :
- premièrement, l'appui du dead_circumflex, il met en mémoire qu'il vient de
recevoir une touche morte, et c'est tout
- deuxièmement un « e », et comme il s'est souvenu du dead_circumflex
d'avant, il considère que tu lui as entré un « ê » et non un « e »

Si tu tapes « compose ^ e », c'est de la même veine.

Si le keysym « ecircumflex » est associé à un keycode et que tu tapes ce
keycode, bein voilà...

Avatar
Sébastien Kirche
Le 11 June 2006 à 20:00, Luc Habert vraute :

Mouarf. Il arrive des fois des phénomènes bizarres.


Faut dire que je maîtrise pas trop le fonctionnement non plus...

À la base, on a les keycodes, qui sont des nombres, et 8
modificateurs, qui sont chacun des bits activables indépendament les
uns des autres. Quand tu appuyes ou relache une touche, les programmes
reçoivent un keycode et l'état des modificateurs juste avant
l'appui/relachement. Chaque programme possède une table qui lui permet
d'interpréter l'évènement reçu. À chaque fois que le mapping clavier
est modifié, le serveur X envoie un évènement contenant la nouvelle
table à tous ses clients (donc si le programme est bien écrit, il n'y
a pas besoin de le relancer après modification du mapping).


OK il m'avait semblé comprendre ça mais bizarrement avec Emacs
(snapshot) après chaque essai de modif xmodmap (changement de la ou des
keysyms associée à un keycode) je n'ai pas remarqué de changement dans
le comportement d'Emacs avant de le quitter et de le relancer.

Il y a aussi les keysyms, qui sont des symboles (caractères et
autres). Un mapping clavier comporte une table d'association qui a
tout keycode associe un keysym (en fait, plusieurs, lequel est choisi
dépend des modificateurs activés). Quand un client reçoit un
évènement, il regarde dans sa table d'association pour voir quel
keysym il a reçu.

Enfin, les modificateurs. Il y en a trois nommés (Control, Shift,
Lock), et cinq anonymes (Mod1 .. Mod5). Un mapping clavier contient
pour chaque modificateur une liste de keysyms. Quand une touche est
enfoncée/relachée, le serveur X regarde si le keysym associé à la
touche est dans les listes de keysyms des modificateurs, et
active/désactive les modificateurs correspondants.

Voilà, c'est tout, il n'y a donc pas de modificateur Meta, Alt, Super,
... Il y a deux manières de leur donner un sens :
- la méthode jmenfoutiste à la Gtk/Qt/Fvwm qui consiste à décréter que Meta
= Mod1, Alt = Mod2 ...
- la méthode historique de Xt qui consiste à dire que Meta = le Modi tel que
Meta_L ou Meta_R est dans la liste de keysyms de Modi (ne surtout pas se
demander ce qu'il se passe si ils sont dans les listes de keysyms de
plusieurs modificateurs).


Ce point est très intéressant et je comprend enfin la différence entre
Meta, Super, Hyper, les modificateurs et les keysyms finaux.

Je crois que le truc pas clair sur le fonctionnement en ce qui me
concerne doit se situer à ce niveau.

Tu peux obtenir les listes de keysyms des modificateurs avec « xmodmap
-pm », et en définir une avec « xmodmap - <<EOF
clear Mod1
add Mod1 = Meta_L
EOF », par exemple. Pour ton cas, quelque chose comme :

clear Mod1
clear Mod2
clear Mod3
clear Mod4
clear Mod5

keycode keycodedealt = Alt_L
keycode keycodedeoption = Meta_L

add Mod1 = Meta_L
add Mod2 = Alt_L

, me parait tout indiqué.


J'avais vu ce paramétrage mais en le survolant seulement et avec ce que
as dit précédemment je pense que je devrais pouvoir compléter les
keysyms associés à mes touches et surtout le réglage des mods.

Si tu veux un altgr, il te faut en plus une
ligne :

add Mod3 = ISO_Level3_Shift

ou s/ISOmachin/Mode_switch/ suivant comment il est défini
actuellement.


Oui, bof. Je n'ai pas d'AltGr mais ce n'est pas grave puisque sur les
claviers mac il n'y a pas de 3ème symbole sur les touches comme sur les
pécés et j'ai déjà reconverti kp_enter qui est à l'autre bout de la
touche espace en touche compose que je trouve incomparablement plus
pratique qu'AltGr.

En plus je suis sur un qwerty. latin-1-postfix roulaize ;)

Ceci à un inconvénient : on contourne xkb, ce qui met la zone au
niveau des séquences de touches spéciales du serveur X à la ctrl alt
F?. Si tu as de la chance, il suffira d'appuyer sur alt à la place
d'option ou vice-versa.


C'est pas la joie le paramétrage du clavier, en particulier sur ce portable :/
F11 et F12 sont pris pour l'émulation des boutons de souris 2 et 3 (le
trackpad mac n'a qu'un bouton) et je n'ai pas (encore) pu faire
fonctionner avec pbbuttonsd les touches media de réglage du son alors
que c'est ok pour l'écran et l'éjection du cd...

Quant à xkb, je crois que tout le monde est unanime pour dire que c'est
une terrible usine à gaz. Faudrait que je demande à Thomas Nemeth s'il a
du temps, je crois qu'il avait réussi à apprivoiser ce truc.

En tout cas merci pour tes explications.
--
Sébastien Kirche

Avatar
noone
Bonjour,

j'avoue avoir des problèmes assez similaires avec un MacBook...

Je n'arrive pas à trouver un .xmodmap bien fait pour ce clavier

Actuellement je me bat pour trouver les touches _ - @ ... !!!!

Je finis par me dire qu'utiliser un Mac sous Linux c'est bien emm...

Cordialement
Avatar
Sébastien Kirche
Je réponds un peu tard : je n'avais pas tellement de temps à consacrerà
ce problème ces temps-ci. D'ailleurs je m'absente quelque temps du
groupe et au retour il y a 500 messages dans la pile. Les affaires
reprennent :)

Le 11 June 2006 à 20:00, Luc Habert a dit :

Bah je peux te dire ce que j'en connais. Déjà, sache que je ne
comprends rien à xkb qui rajoute un gros bazar par-dessus ce que je
vais t'expliquer.
[...]


Alors tes explications m'ont parfaitement permis de régler mon problème
qui était d'avoir sur l'iBook dans Emacs la touche Meta sur Cmd et non
sur Opt.

J'ai donc défini ce qui suit :
,----[ .Xmodmap3 ]
| clear Mod1
| clear Mod2
| clear Mod3
| clear Mod4
| clear Mod5
| keycode 64 = Alt_L Super_L
| keycode 115 = Meta_L
| keycode 108 = Multi_key
| add Mod1 = Meta_L
| add Mod2 = Alt_L
`----
Qui donne option = alt, command = Meta et accessoirement enter compose. Impeccable.

Détail : maintenant dans Emacs l'appui sur opt/alt produit une séquence
A- que je n'avais jamais vue auparavant...

Merci pour ces précieuses informations sur le fonctionnement des
modifiers dans X11.

Followup-To: fr.comp.os.linux.configuration
--
Sébastien Kirche

Avatar
lhabert
Sébastien Kirche :

| keycode 64 = Alt_L Super_L


Mon dieu quelle horreur! Le Super_L sur shift alt, je ne veux surtout pas
comprendre les effets tordus que ça va donner (bon, tu n'as pas mis de
modificateur sur Super_L, donc ça simplifie quand même les choses).

Détail : maintenant dans Emacs l'appui sur opt/alt produit une séquence
A- que je n'avais jamais vue auparavant...


« A- » pour alt. Il y a aussi « S- » pour shift, « s- » pour super, et
« h- » pour hyper.

Avatar
Sébastien Kirche
Le 26 June 2006 à 21:30, Luc Habert a dit :

Sébastien Kirche :

keycode 64 = Alt_L Super_L



Mon dieu quelle horreur!


Ah ? O:S

Le Super_L sur shift alt, je ne veux surtout pas comprendre les effets
tordus que ça va donner (bon, tu n'as pas mis de modificateur sur
Super_L, donc ça simplifie quand même les choses).


Quel est la préconisation ? alt seul et super ailleurs ?

Détail : maintenant dans Emacs l'appui sur opt/alt produit une
séquence A- que je n'avais jamais vue auparavant...


« A- » pour alt. Il y a aussi « S- » pour shift, « s- » pour super, et
« h- » pour hyper.


J'avions ben compris, seulement la surprise c'est que précédemment (sur
autre chose que l'iBook) alt donnait Meta et les touches win suivant le
système activent des commandes du système ou du wm. Donc Alt logiquement
ne donnait pas A- ;)
--
Sébastien Kirche



Avatar
lhabert
Sébastien Kirche :

Quel est la préconisation ? alt seul et super ailleurs ?


En tout cas, c'est ce que je fais (et je n'utilise pas du tout super en
fait), parce que je n'ai jamais eu le courage de comprendre ce qui est censé
se passer avec les modificateurs shiftées... Maintenant, peut-être que ça va
très bien marcher pour toi comme c'est fait.

Avatar
Sébastien Kirche
Le 26 June 2006 à 23:43, Luc Habert s'est exprimé ainsi :

En tout cas, c'est ce que je fais (et je n'utilise pas du tout super
en fait), parce que je n'ai jamais eu le courage de comprendre ce qui
est censé se passer avec les modificateurs shiftées... Maintenant,
peut-être que ça va très bien marcher pour toi comme c'est fait.


Si je comprends bien, d'une certaine façon, je fais progresser la Science :P
--
Sébastien Kirche