Jak cist narodni znaky v Xlibu ?
Mirek Fidler
cxl na centrum.cz
Čtvrtek Srpen 29 21:35:47 CEST 2002
> > Nevite nekdo, jak se spravne realizuje vstup narodnich znaku v core
Xlibu ?
> >
> > Zkousel jsem to pomoci IM/IC, jenze problem je ze uz volani samotneho
> > XOpenIM se nezdari, pritom zbytek aplikace jinak bez problemu jede, v
jinych
> > aplikacich (KDE, OpenOffice) zase chodi vstup cestiny.
>
> Tak to delate neco spatne, protoze se to ma delat -- a dela -- pres IM.
> Dokonce i pro takovy "trivialni pripad" jako jsou mrtve klavesy.
> Viz kousek vystupu z ltrace xterm:
>
> XCreateWindow(0x08076ac8, 0x0380000e, 0, 0, 499) = 0x03800015
> XSetLocaleModifiers(0x08066227, 0x08080bd0, 0, 0x08080c48, 0x08080c48) =
> 0x08088390
> XOpenIM(0x08076ac8, 0, 0, 0, 0x08080bd0) = 0x080883a0
> XGetIMValues(0x080883a0, 0x08066252, 0xbfffe724, 0, 0x08080bd0) = 0
> strchr("Root", ',') = NULL
> strncmp("Root", "OverTheSpot", 4) = 3
> strncmp("Root", "OffTheSpot", 4) = 3
> strncmp("Root", "Root", 4) = 0
> XFree(0x08088958, 0x08080bd0, 0, 0x08080c48, 4) = 1
> XCreateIC(0x080883a0, 0x0806634d, 1032, 0x08066340, 0x03800015) =
> 0x080aaa60
> Tak to delate neco spatne, protoze se to ma delat -- a dela -- pres IM.
> Dokonce i pro takovy "trivialni pripad" jako jsou mrtve klavesy.
> Viz kousek vystupu z ltrace xterm:
>
> XCreateWindow(0x08076ac8, 0x0380000e, 0, 0, 499) = 0x03800015
> XSetLocaleModifiers(0x08066227, 0x08080bd0, 0, 0x08080c48, 0x08080c48) =
> 0x08088390
> XOpenIM(0x08076ac8, 0, 0, 0, 0x08080bd0) = 0x080883a0
> XGetIMValues(0x080883a0, 0x08066252, 0xbfffe724, 0, 0x08080bd0) = 0
> strchr("Root", ',') = NULL
> strncmp("Root", "OverTheSpot", 4) = 3
> strncmp("Root", "OffTheSpot", 4) = 3
> strncmp("Root", "Root", 4) = 0
> XFree(0x08088958, 0x08080bd0, 0, 0x08080c48, 4) = 1
> XCreateIC(0x080883a0, 0x0806634d, 1032, 0x08066340, 0x03800015) =
> 0x080aaa60
Hm, ja zkousim asi tak tohle:
int main(int argc, char **argv)
{
XDisplay *dpy;
XIM im;
char *program_name = argv[0];
if (setlocale(LC_ALL, "") == NULL) {
(void) fprintf(stderr, "%s: cannot set locale.",program_name);
exit(1);
}
if ((dpy = XOpenDisplay(NULL)) == NULL) {
(void) fprintf(stderr, "%s: cannot open Display.", program_name);
exit(1);
}
if (!XSupportsLocale()) {
(void) fprintf(stderr, "%s: X does not support locale %s.",
program_name, setlocale(LC_ALL, NULL));
exit(1);
}
if (XSetLocaleModifiers("") == NULL) {
(void) fprintf(stderr, "%s: Warning: cannot set locale modifiers.",
program_name);
}
if ((im = XOpenIM(dpy, NULL, NULL, NULL)) == NULL) {
(void)fprintf(stderr, "%s: Couldn't open input method",
program_name);
exit(1);
}
return 0;
}
a na tom XOpenIM to skonci. Nicmene zacina tusit, ze problem je mozna kolem
XSetLocaleModifiers, ktery za ten retezec pridava XMODIFIERS z enviromentu,
ve kterem je v mem pripade zapsano "@im=none" (mam to naistalovany v us
locale).
Nicmene to porad nevysvetluje proc xterm to umi otevrit spravne - snad si
tam dosadi neco rozumejsiho sam (myslim misto to @im=none).
Na druhe strane v Qt jsem prokazatelne identifikoval kod, ktery v pripade ze
IM nejede tak pouziva pro vstup prevod keysymu do unicode. Pravda, deadkeye
jsem tam nevidel, ale tech zdrojaku je tolik... :)
No, prozatim jsem zvolil variantu 2 hodiny a udelal to pres keysymy. Az budu
mit na to vic casu pripadne ziskam vic inforamci, muzu tento kod pouzit v
pripade, ze IM ma problem nebo chybi :)))
Mirek
Další informace o konferenci Linux