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