J'aimerais savoir si quelqu'un a déjà joué avec keysymdef.h, histoire
de pouvoir ajouter de manière simple quelques caractères mathématiques
en accès direct sur mon clavier via xmodmap.
Par exemple j'ai ça dans mon .Xmodmap :
keycode 65 = space nobreakspace emspace
et ça :
keycode 83 = KP_Left KP_4 Greek_pi Greek_PI
Ça me permet de taper l'espace insécable avec shift-espace ou pi avec
altgr-keypad5.
J'ai regardé keysymdef.h et je trouve ceci :
#define XK_emspace 0xaa1
et ceci :
#define XK_Greek_pi 0x7f0
OK, j'ai compris, il suffit de rentrer un nom pas trop idiot après
#define et un code hexadécimal ensuite.
Mais voilà, ces codes ne correspondent pas ici aux codes unicodes donnés
par gucharmap :
U+2003 EM SPACE
Généralités
Catégorie : séparateur, espace
Autres représentations
UTF-8 : 0xE2 0x80 0x83
et :
U+03C0 GREEK SMALL LETTER PI
Généralités
Catégorie : lettre, minuscule
Autres représentations
UTF-8 : 0xCF 0x80
Les questions sont :
* J'ai réinstallé Sarge et je n'ai plus keysymdef.h et tous ses potes
dans /usr/X11R6/include/X11/, qui les a remplacé ?
* Je les copiés de ma précédente installation où il faut, comment
activer les changements sans redémarrer X ? xmodmap le fait ?
* Quel est le rapport entre l'hexadécimal de keysymdef.h et celui de
l'unicode ?
En espérant ne pas avoir trop barbé... et en espérant un lien (gogole
n'est pas très causant) ou une réponse.
nicolas patrois : pts noir asocial
--
GLOU-GLOU
P : Ouerk ! C'est dégueulasse, j'ai bu la tasse !
M : Panique pas... La mer est pleine de microbes, mais tellement dilués qu'ils sont inoffensifs...
P : C'est ça... La mer, c'est de la merde homéopathique !
Ça, c'est du xmodmap. C'est considéré comme obsolète. La méthode moderne est XKB, qui permet de faire des choses bien plus puissantes. Petit bémol : la meilleure documentation disponible pour XKB est un fichier Yacc perdu dans les sources de X11.
Tiens, ça fait une chose de plus que je devra rédiger quand j'aurai remis à jour ma page web...
OK, j'ai compris, il suffit de rentrer un nom pas trop idiot après #define et un code hexadécimal ensuite.
Non. Ce fichier ne définit pas les symboles utiliser par xmodmap, mais uniquement des constantes symboliques à utiliser dans des programmes C (par exemple pour écrire « if(keysym == XK_Left) x--; »). Les noms utilisés par xmodmap sont en deux endroits :
- codés en dur dans libX11.so (berk) ;
- dans ~X11/lib/X11/XKeysymDB (~X11 est le répertoire racine de X11, qui est souvent /usr/X11R6, mais peut aussi bien être /opt/XFree86-4.3.0/X11R6 ou /usr/openwin).
Ajouter de nouveaux symboles fonctionnerait peut-être pour définir des fonctions spéciales (comme les XF86AudioPlay et compagnie qui correspondent aux touches en haut de certains claviers) qui pourraient être récupérées au niveau du window manager. En revanche, je doute fortement qu'il soit possible de leur donner la valeur d'un caractère.
* J'ai réinstallé Sarge et je n'ai plus keysymdef.h et tous ses potes dans /usr/X11R6/include/X11/, qui les a remplacé ?
Ils sont toujours là. Peut-être as-tu oublié le package x-dev (tiens, aurait-il changé de nom récemment ?).
* Je les copiés de ma précédente installation où il faut, comment activer les changements sans redémarrer X ? xmodmap le fait ?
Ça ne marche pas comme ça.
* Quel est le rapport entre l'hexadécimal de keysymdef.h et celui de l'unicode ?
Essentiellement : aucun. Les keysyms de X11 sont un codage maison, qui étend latin-1 (donc coïncide avec Unicode sur [0,255]), mais pas au delà. C'est bien normal : ces valeurs sont des valeurs de touches de clavier, pas des caractères. Unicode n'a pas exemple pas de caractère CapsLock !
J'avais cherché ça il y a un an et demie : dans XFree86, la correspondance entre keysym et caractère se fait ultimement dans la fonction KeySymToUcs4, qu'on trouve dans xc/lib/X11/imKStoUCS.c (UCS-4 est un nom donné parfois, par abus de langage, à Unicode, alors qu'il désigne une représentation d'Unicode sous forme de suite d'octets). Si on regarde, on constate avec horreur qu'il s'agit d'une table codée en dur. Donc pas de solution de ce côté là.
Sauf...
if ((keysym & 0xff000000) == 0x01000000) return (keysym & 0x00ffffff);
Et là on est sauvé : le keysym de numéro 0x01abcdef correspond au caractère Unicode U+abcdef, donc tous les caractères Unicode peuvent être désignés comme keysym. Ainsi « keycode 78 = 0x1009C3B » (ou son équivalent en XKB) définit la touche 78 (ScrollLock sur un clavier de PC) comme un caractère qui rappellera des souvenirs aux amateurs de _Friends_.
En outre, l'examen de la fonction XStringToKeysym (dans xc/lib/X11/StrKeysym.c), ou bien de la sortie de xmodmap -pk après l'opération précédente, montre que ces keysyms peuvent être désignés sous le nom symbolique Uabcdef (ou seulement Ucdef si ab = 00). Donc la commande peut s'écrire :
keyscode 78 = U9C3B
Il doit être possible de rajouter des noms symboliques dans XKeysymDB, mais comme ce fichier est sous contrôle du gestionnaire de packages, c'est une mauvaise idée. Cependant, comme il ne s'agirait que de simplifier un petit peu l'écriture du fichier xmodmap ou XKB, c'est d'une utilité très limitée.
Hum, j'ai l'impression que c'était un peu hors-charte...
nicolas wrote in message
<pan.2004.06.05.19.54.56.27618@online.nospam.fr>:
Ça, c'est du xmodmap. C'est considéré comme obsolète. La méthode moderne
est XKB, qui permet de faire des choses bien plus puissantes. Petit
bémol : la meilleure documentation disponible pour XKB est un fichier
Yacc perdu dans les sources de X11.
Tiens, ça fait une chose de plus que je devra rédiger quand j'aurai
remis à jour ma page web...
OK, j'ai compris, il suffit de rentrer un nom pas trop idiot après
#define et un code hexadécimal ensuite.
Non. Ce fichier ne définit pas les symboles utiliser par xmodmap, mais
uniquement des constantes symboliques à utiliser dans des programmes C
(par exemple pour écrire « if(keysym == XK_Left) x--; »). Les noms
utilisés par xmodmap sont en deux endroits :
- codés en dur dans libX11.so (berk) ;
- dans ~X11/lib/X11/XKeysymDB (~X11 est le répertoire racine de X11, qui
est souvent /usr/X11R6, mais peut aussi bien être
/opt/XFree86-4.3.0/X11R6 ou /usr/openwin).
Ajouter de nouveaux symboles fonctionnerait peut-être pour définir des
fonctions spéciales (comme les XF86AudioPlay et compagnie qui
correspondent aux touches en haut de certains claviers) qui pourraient
être récupérées au niveau du window manager. En revanche, je doute
fortement qu'il soit possible de leur donner la valeur d'un caractère.
* J'ai réinstallé Sarge et je n'ai plus keysymdef.h et tous ses potes
dans /usr/X11R6/include/X11/, qui les a remplacé ?
Ils sont toujours là. Peut-être as-tu oublié le package x-dev (tiens,
aurait-il changé de nom récemment ?).
* Je les copiés de ma précédente installation où il faut, comment
activer les changements sans redémarrer X ? xmodmap le fait ?
Ça ne marche pas comme ça.
* Quel est le rapport entre l'hexadécimal de keysymdef.h et celui de
l'unicode ?
Essentiellement : aucun. Les keysyms de X11 sont un codage maison, qui
étend latin-1 (donc coïncide avec Unicode sur [0,255]), mais pas au
delà. C'est bien normal : ces valeurs sont des valeurs de touches de
clavier, pas des caractères. Unicode n'a pas exemple pas de caractère
CapsLock !
J'avais cherché ça il y a un an et demie : dans XFree86, la
correspondance entre keysym et caractère se fait ultimement dans la
fonction KeySymToUcs4, qu'on trouve dans xc/lib/X11/imKStoUCS.c (UCS-4
est un nom donné parfois, par abus de langage, à Unicode, alors qu'il
désigne une représentation d'Unicode sous forme de suite d'octets). Si
on regarde, on constate avec horreur qu'il s'agit d'une table codée en
dur. Donc pas de solution de ce côté là.
Sauf...
if ((keysym & 0xff000000) == 0x01000000)
return (keysym & 0x00ffffff);
Et là on est sauvé : le keysym de numéro 0x01abcdef correspond au
caractère Unicode U+abcdef, donc tous les caractères Unicode peuvent
être désignés comme keysym. Ainsi « keycode 78 = 0x1009C3B » (ou son
équivalent en XKB) définit la touche 78 (ScrollLock sur un clavier de
PC) comme un caractère qui rappellera des souvenirs aux amateurs de
_Friends_.
En outre, l'examen de la fonction XStringToKeysym (dans
xc/lib/X11/StrKeysym.c), ou bien de la sortie de xmodmap -pk après
l'opération précédente, montre que ces keysyms peuvent être désignés
sous le nom symbolique Uabcdef (ou seulement Ucdef si ab = 00). Donc la
commande peut s'écrire :
keyscode 78 = U9C3B
Il doit être possible de rajouter des noms symboliques dans XKeysymDB,
mais comme ce fichier est sous contrôle du gestionnaire de packages,
c'est une mauvaise idée. Cependant, comme il ne s'agirait que de
simplifier un petit peu l'écriture du fichier xmodmap ou XKB, c'est
d'une utilité très limitée.
Hum, j'ai l'impression que c'était un peu hors-charte...
Ça, c'est du xmodmap. C'est considéré comme obsolète. La méthode moderne est XKB, qui permet de faire des choses bien plus puissantes. Petit bémol : la meilleure documentation disponible pour XKB est un fichier Yacc perdu dans les sources de X11.
Tiens, ça fait une chose de plus que je devra rédiger quand j'aurai remis à jour ma page web...
OK, j'ai compris, il suffit de rentrer un nom pas trop idiot après #define et un code hexadécimal ensuite.
Non. Ce fichier ne définit pas les symboles utiliser par xmodmap, mais uniquement des constantes symboliques à utiliser dans des programmes C (par exemple pour écrire « if(keysym == XK_Left) x--; »). Les noms utilisés par xmodmap sont en deux endroits :
- codés en dur dans libX11.so (berk) ;
- dans ~X11/lib/X11/XKeysymDB (~X11 est le répertoire racine de X11, qui est souvent /usr/X11R6, mais peut aussi bien être /opt/XFree86-4.3.0/X11R6 ou /usr/openwin).
Ajouter de nouveaux symboles fonctionnerait peut-être pour définir des fonctions spéciales (comme les XF86AudioPlay et compagnie qui correspondent aux touches en haut de certains claviers) qui pourraient être récupérées au niveau du window manager. En revanche, je doute fortement qu'il soit possible de leur donner la valeur d'un caractère.
* J'ai réinstallé Sarge et je n'ai plus keysymdef.h et tous ses potes dans /usr/X11R6/include/X11/, qui les a remplacé ?
Ils sont toujours là. Peut-être as-tu oublié le package x-dev (tiens, aurait-il changé de nom récemment ?).
* Je les copiés de ma précédente installation où il faut, comment activer les changements sans redémarrer X ? xmodmap le fait ?
Ça ne marche pas comme ça.
* Quel est le rapport entre l'hexadécimal de keysymdef.h et celui de l'unicode ?
Essentiellement : aucun. Les keysyms de X11 sont un codage maison, qui étend latin-1 (donc coïncide avec Unicode sur [0,255]), mais pas au delà. C'est bien normal : ces valeurs sont des valeurs de touches de clavier, pas des caractères. Unicode n'a pas exemple pas de caractère CapsLock !
J'avais cherché ça il y a un an et demie : dans XFree86, la correspondance entre keysym et caractère se fait ultimement dans la fonction KeySymToUcs4, qu'on trouve dans xc/lib/X11/imKStoUCS.c (UCS-4 est un nom donné parfois, par abus de langage, à Unicode, alors qu'il désigne une représentation d'Unicode sous forme de suite d'octets). Si on regarde, on constate avec horreur qu'il s'agit d'une table codée en dur. Donc pas de solution de ce côté là.
Sauf...
if ((keysym & 0xff000000) == 0x01000000) return (keysym & 0x00ffffff);
Et là on est sauvé : le keysym de numéro 0x01abcdef correspond au caractère Unicode U+abcdef, donc tous les caractères Unicode peuvent être désignés comme keysym. Ainsi « keycode 78 = 0x1009C3B » (ou son équivalent en XKB) définit la touche 78 (ScrollLock sur un clavier de PC) comme un caractère qui rappellera des souvenirs aux amateurs de _Friends_.
En outre, l'examen de la fonction XStringToKeysym (dans xc/lib/X11/StrKeysym.c), ou bien de la sortie de xmodmap -pk après l'opération précédente, montre que ces keysyms peuvent être désignés sous le nom symbolique Uabcdef (ou seulement Ucdef si ab = 00). Donc la commande peut s'écrire :
keyscode 78 = U9C3B
Il doit être possible de rajouter des noms symboliques dans XKeysymDB, mais comme ce fichier est sous contrôle du gestionnaire de packages, c'est une mauvaise idée. Cependant, comme il ne s'agirait que de simplifier un petit peu l'écriture du fichier xmodmap ou XKB, c'est d'une utilité très limitée.
Hum, j'ai l'impression que c'était un peu hors-charte...
nicolas
On Sat, 05 Jun 2004 20:33:41 +0000, Nicolas George wrote:
nicolas wrote in message
Ils sont toujours là. Peut-être as-tu oublié le package x-dev
Oui, c'est ça.
keyscode 78 = U9C3B
Ça marche !
keycode 84 = KP_Begin KP_5 U2200
me donne le symbole « pour tout ». Youpi !
Hum, j'ai l'impression que c'était un peu hors-charte...
Non, non... du tout, c'est de la configuration ça, de la vraie.
nicolas patrois : pts noir asocial -- GLOU-GLOU
P : Ouerk ! C'est dégueulasse, j'ai bu la tasse ! M : Panique pas... La mer est pleine de microbes, mais tellement dilués qu'ils sont inoffensifs... P : C'est ça... La mer, c'est de la merde homéopathique !
On Sat, 05 Jun 2004 20:33:41 +0000, Nicolas George wrote:
nicolas wrote in message
Ils sont toujours là. Peut-être as-tu oublié le package x-dev
Oui, c'est ça.
keyscode 78 = U9C3B
Ça marche !
keycode 84 = KP_Begin KP_5 U2200
me donne le symbole « pour tout ». Youpi !
Hum, j'ai l'impression que c'était un peu hors-charte...
Non, non... du tout, c'est de la configuration ça, de la vraie.
nicolas patrois : pts noir asocial
--
GLOU-GLOU
P : Ouerk ! C'est dégueulasse, j'ai bu la tasse !
M : Panique pas... La mer est pleine de microbes, mais tellement dilués qu'ils sont inoffensifs...
P : C'est ça... La mer, c'est de la merde homéopathique !
On Sat, 05 Jun 2004 20:33:41 +0000, Nicolas George wrote:
nicolas wrote in message
Ils sont toujours là. Peut-être as-tu oublié le package x-dev
Oui, c'est ça.
keyscode 78 = U9C3B
Ça marche !
keycode 84 = KP_Begin KP_5 U2200
me donne le symbole « pour tout ». Youpi !
Hum, j'ai l'impression que c'était un peu hors-charte...
Non, non... du tout, c'est de la configuration ça, de la vraie.
nicolas patrois : pts noir asocial -- GLOU-GLOU
P : Ouerk ! C'est dégueulasse, j'ai bu la tasse ! M : Panique pas... La mer est pleine de microbes, mais tellement dilués qu'ils sont inoffensifs... P : C'est ça... La mer, c'est de la merde homéopathique !