Lokalizačný patch pre XFree 3.3 =============================== Verzia 0.01 Problém ======= Česká a slovenská a slovenská klávesnica sa nezaobíde bez mŕtvych kláves. Riešenie tejto problematiky bolo až do verzie X11R5 záležitosťou X serveru. Výsledkom bolo, že buď bol vstup znakov prostredníctvom mŕtvych kláves pre aplikáciu transparentný, alebo ho server neumožňoval vôbec. S príchodom X11R6 sa situácia zmenila. Prišiel štandart v podobe XKB extension a vstupných metód, ale aplikácia musí lokalizáciu explicitne podporovať. Nie je to zložité, ale málokto to robí. Pokiaľ ide o XFree86, ešte do verzie 3.2 ešte ako-tak koexistovali obe metódy. Verzia 3.3 žiaľ znamenala koniec podpory mŕtvych kláves neštandartnými metódami (či je to bug alebo feature, netuším). Vstupné metódy ============== Aplikácia musí pre úspešné použitie vstupných metód urobiť zhruba nasledovné: - nainicializovať svoje locale (setlocale, XSetLocaleModifiers) - otvoriť vstupnú metódu (XOpenIM) - spýtať sa vstupnej metódy, aké modely vstupu podporuje (XGetIMValues) - overiť si, či je medzi nimi aj metóda podporujúca compose model (XIMPreeditNothing | XIMStatusNoting) - vytvoriť vstupný kontext a oznámiť mu, ktoré okno obsluhuje a ktorý model má použiť (XCreateIC) - zabezpečiť, aby sa vstupný kontext dozvedel o udalostiach, ktoré potrebuje (XFilterEvent) - a konečne namiesto pôvodného XLookupString volať pre prevod keysym-u na reťazec v danom kódovaní XmbLookupString Patch ===== Väčšina aplikácií žiaľ tento postup s prehľadom ignoruje. Keďže zdrojový kód nemusí byť vždy dostupný a nie každý má záujem stráviť mladosť nad úpravami existujúceho software, spomenul som si na staré "Keď nejde hora k Mohamedovi, musí ísť Mohamed k hore" a upravil som Xlib približne nasledovne: - interná štruktúra popisujúca X Display obsahuje navyše informáciu o použitej vstupnej metóde a kontexte - od štartu aplikácie až po prvú spracovanú KeyPress udalosť sa čaká, do akej miery sa klient o input metódy a kontexty staral - pokiaľ aplikácia nevytvorila žiadny vstupný kontext, prípadne ho vytvorila iný, ako požadujeme, vytvorí sa a ako identifikácia okna sa použije "None" - takémuto filtru sa pošlú všetky udalosti, ktoré by sa inak poslali filtru s korektne špecifikovaným oknom - na všetky udalosti sa explicitne zavolá aj XFilterEvent - pokiaľ aplikácia zavolá XLookupString, zavolá sa miesto neho XmbLookupString a návratové hodnoty sa patrične upravia Inštalácia a použitie ===================== - nainštalujte si XKB podporu klávesnice, dostupnú (aspoň keď som ju downloadoval ja) na: ftp://ftp.fi.muni.cz/pub/localization/linux/cs-tools/ testing/XKB-cz-X11R6.3.tar.gz - opustite X window - nakopírujte libX11.so.6.99 do adresára /usr/X11R6/lib - spustite ldconfig -v - v .login,.cshrc a.p. nastavte environment premenné setenv LC_CTYPE sk (resp. cz) setenv XLIB_FORCE_I18N - a môžete skúšať Kompatibilita ============= Ide o značne surovú záplatu, ktorá predpokladá určité typické správanie sa aplikácie a je veľmi pravdepodobné, že so všeličím nebude fungovať. Pokiaľ ide o aplikáciu, o ktorej sa dá predpokladať, že sa ohľadne lokalizácie snaží niečo robiť, skúste patch vyradiť z činnosti (unsetenv XLIB_FORCE_I18N, resp. setenv XLIB_FORCE_I18N 0). Existuje ešte možnosť mierne zmenšiť "agresivitu" patchu nastavením XLIB_FORCE_I18N na 1 (pokiaľ hodnota nie je zadaná, default je 2). Je možné, že pokiaľ hneď prvý napísaný znak obsahuje diakritiku, bude ignorovaný - vyplýva to z princípu práce patchu, ktorý až do prvej klávesovej udalosti čaká, či aplikácia náhodou nemieni niečo s lokalizáciou robiť vo vlastnej réžii. Pri mojich testoch fungovali: rxvt, xterm, color-xterm, nxterm, xvile, xfinans, gimp, staroffice, rôzne štandartné widgety v Xaw, Xaw3d a Motif aplikáciách a.p. Zaujímavo sa správa netscape - diakritiku začne akceptovať až po prvom výbere z menu. Čím to je, je pre mňa záhadou - pravdepodobne existuje ešte nejaká možnosť spracovania udalostí, ktorá ma nenapadla. Nefungujú: Wingz a tgif - XLookupString znak korektne vráti, ale aplikácia ho z neznámeho dôvodu ignoruje. Ďalej nefunguje lyx (ktorý má ale vlastné mapovanie). Obávam sa ale, že s XForms aplikáciami budú problémy. Samozrejme nebudú fungovať ani aplikácie, ktoré majú Xlib linkovanú staticky. Záverečné poznámky ================== Tento patch je (C) Stanislav Meduna 1997. Použite ho ako chcete a na čo chcete s jedinou výnimkou - nezarábajte jeho distribúciou peniaze. Samozrejme je nutné dodržať podmienky copyrightov tvorcov X11 a XFree86. Za následky použitia nepreberám ŽIADNU záruku. Nemám čas na poskytovanie akejkoľvek podpory; napriek tomu však budem rád, ak mi úspechy (a hlavne neúspechy) oznámite na nižšie uvedenú adresu. V bug-reporte prosím uveďte presnú verziu programu, ako aj dynamicky linkovaných knižníc. Pokiaľ sa vám chce, nadefinujte premennú XLIB_FORCE_I18N_DEBUG na hodnotu 2 a pošlite mi výstup s popisom, po ktorej akcii nasledovali konkrétne riadky výpisu. Bratislava, 9. 8. 1997 Stanislav Meduna stano@eunet.sk