Cestina v novem rxvt? (dlouhe)

Radim Halir halir na utia.cas.cz
Úterý Únor 23 10:22:58 CET 1999


Zdravim,
zkousel jsem prelozit posledni verzi emulatoru terminalu rxvt, tj.
2.6.PRE2 stazenou z http://babayaga.math.fu-berlin.de/~rxvt/
Prestoze jsem pri konfiguraci pouzil --enable-xim a prestoze se
v changes.txt pise o zmenach ve vecech kolem XIM (X Input Method),
nechodi cestina korektne. Primo namapovane akcentovane znaky
(tj. horni "ciselna rada" pocinaje e s hackem a konce e s carkou)
funguji, jak maji, problem je vsak s kompozicemi. Napr. stisk carky
a pismene a neda a s carkou, ale carku a pak a.

Koukal jsem do zdrojaku a nasel misto, kde je pravdepodobne problem.
Vzhledem k tomu, ze se vsak ve vecech kolem input metod moc nevyznam,
prosil bych mistni "lokalizacni odborniky" (Zdenku Kabelaci?) o jejich
nazor driv, nez to poslu jako bug-report.

Temer vsechny ukony kolem input metod (krome setlocale, ktere je volano
korektne) se deji ve funkci IMInstantiateCallback() definovane v souboru
src/command.c. Autori tvrdi, ze tento kod povetsinou prevzali ze zdrojaku
xtermu, podobne je tomu i u editoru xjed. Takze jsem si pustil dva
debuggery, jeden na rxvt, druhy na xjed (kde cestina (po mem 
funguje jak z praku :-) a zacal jsem porovnavat, co se deje. Problem je
IMHO v tom, ze v rxvt, kdyz neni pozadovana zadna specialni input metoda
(tj. kdyz rs[Rs_inputMethod] == NULL), vola se (na radku 3459)
XSetLocaleModifiers(""), ktery neuspeje. V xjedu se misto toho vola
XSetLocaleModifiers("@im=none"), ktery uspeje. V obou pripadech se jeste
pote, pokud toto volani neuspeje, vola XSetLocaleModifiers("") a teprve kdyz
ani toto volani neuspeje, vraci se chyba. Takze to je prvni rozdil...

Druhy rozdil spociva v tom, ze rxvt pouziva jako defaultni preedit_type
"OverTheSpot" (radek 3504) a xjed "Root". Tomu "OverTheSpot" odpovida
input styl (XIMPreeditPosition | XIMStatusNothing) (radek 3521) a ten
(na rozdil od stylu (XIMPreeditNothing | XIMStatusNothing) odpovidajiciho
"Root") neni obsazen mezi podporovanymi styly. For cyklus na radcich
3527-3532 tedy neuspeje, found zustane 0 a vse jde do kyticek (hlaseni
"input method doesn't support my preedit type" na radku 3538). Samozrejme
je mozne zadat pozadovany styl pomoci resources, ale proc nezmenit ten
default, navic kdyz IMHO "Root" je mnohem jednodussi nez "OverTheSpot"
ci "OffTheSpot"? Mj. nevite nekdo, co tyhle tri moznosti vlastne
nabizeji a kdy je dobre pouzivat neco jineho nez "Root"?

Co tedy navrhuji a co bych prosil posoudit:
ve funkci IMInstantiateCallback definovane v src/command.c:
1) radek 3459: if ((p = XSetLocaleModifiers("")) != NULL && *p)
   zmenit na: if ((p = XSetLocaleModifiers("@im=none")) != NULL && *p)
2) radek 3504: strcpy(tmp, (rs[Rs_preeditType] ? rs[Rs_preeditType] : "OverTheSpot"));
   zmenit na: strcpy(tmp, (rs[Rs_preeditType] ? rs[Rs_preeditType] : "Root"));
Po techto upravach funguje cestina vcetne kompozic k me plne spokojenosti.

Tesim se na vase nazory,
Radim

PS: Kdyz uz mluvim o tom rxvt. Jsem od prirody minimalista a tak jsem se
    snazil vygenerovat jakousi minimalni verzi rxvt, ktera funguje jako
    prosty emulator terminalu a tedy nepodporuje zadne vymozenosti jako
    16 barev (prepinani pomoci atributu BOLD a BLINK je IMHO velmi
    nestastne), grafiku, menatka, pixmapy na pozadi a podobne. Resources
    (v ~/.Xdefaults) a logovani do utmp/wtmp je zachovano. Vysledny
    kod ma velikost 65028+912+9492=75432 bytu (text+data+bss). Kdyby o to
    mel nekdo zajem, dejte vedet.


Další informace o konferenci Linux