Zobrazují se příspěvky se štítkemtomboy. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkemtomboy. Zobrazit všechny příspěvky

pátek 15. května 2009

Nefunguje kontrola pravopisu v Pidgin, Tomboy - knihovna GtkSpell

V článku GtkSpell a čeština - fungovalo to vůbec někdy? jsem popisoval chybu, která se týkala kontroly pravopisu při použití knihoven GtkSpell. Chyba spočívala v nesprávném ošetření chybného zadání identifikace jazyka do proměnné LANG. Dne 18.2.2009 došlo k opravě této chyby ve zdrojovém kódu gtkspell.c ve verzi 1.30. Oprava byla identifikovaná textem: "Fix Bug #2431005 In some cases is default language for spelling is set to EN (Blondak)" Opravená část zdrojového kódu vypadá následovně:

if (lang == NULL) {
    lang = g_getenv("LANG");
    if (lang) {
        if ((g_strcmp0(lang, "C") == 0) || (g_strcmp0(lang, "c") == 0))
            lang = NULL;
        else if (lang[0] == 0)
            lang = NULL;
    }
}

Bohužel dodnes nebyla oprava zanesena do aktualizačních balíčků knihovny GtkSpell v distribuci Fedora 10 (Cambridge). Nejspíš si budeme muset počkat do vydání nové distribuce Fedora 11 (Leonidas), která naštěstí vyjde za necelých 14 dnů - 26.5.2009.


Na konci minulého článku, který popisoval tuto chybu, jsem navrhl dočasné nouzové řešení. To spočívalo v přímém zásahu do binárního kódu knihovny. Místo opravy jsem určil trochu nešťastně hexadecimální adresou, která však byla platná pouze pro verzi knihovny k příslušnému datu. Od té doby došlo k aktualizaci knihovny a tím pádem i ke změně adresy. Navíc adresa byla platná pouze pro balíčky distribuce Fedora. Ve vláknu "Nefunguje kontrola pravopisu v Pidgin, Tomboy" fóra k distribuci Ubuntu bylo místo opravy specifikováno precizněji a to slovy: musí to být řetězec "C" a musí mu bezprostředně předcházet řetězec "LANG".

Je vidět, že chybou nebyla postižena jenom distribuce Fedora, ale i Ubuntu a všechny ostatní, které používají knihovnu GtkSpell.

Trochu mne v této souvislosti zaráží doba potřebná pro opravu této malé chyby. Já sám jsem chybu ohlásil e-mailem jednomu z autorů této knihovny dne 29.11.2008. Asi to nebylo to nejsprávnější řešení, protože e-mail nejspíš někde zapadl. Dne 15.12.2008 však byla tato chyba zahrnuta mezi bugy uživatelem "blondak" včetně patche pro její opravu a až dne 18.2.2009 došlo k aplikaci patche. Nicméně dodnes se tato oprava neobjevila mezi aktualizacemi v příslušných distribucích.

sobota 29. listopadu 2008

GtkSpell a čeština - fungovalo to vůbec někdy?

S novou linuxovou distribucí Fedora 10 (Cambridge), která vyšla 25.11.2008, jsem chtěl vyzkoušet některé novinky. Do oka mi také padl program Tomboy, který se spustí hned na začátku sezení a jeho žlutá ikona na nás svítí z panelu. Slouží pro psaní poznámek. Taková obdoba žlutých lepicích lístečků. V minulé distribuci jsem jej zavrhl a odinstaloval hned na začátku. Nefungovala kontrola pravopisu a jazyk pro kontrolu  se nedal vůbec nikde nastavit. Jakákoliv zapsaná poznámka se potom většinou skládala z červeně podtržených slov. Jediný přepínač v nastavení programu Tomboy umožňoval pouze kontrolu pravopisu úplně vypnout. V nové distribuci však ke zlepšení chování programu v tomto směru nedošlo.

Začal jsem pátrat po příčinách této chyby. Zjistil jsem, že stejným způsobem se chová i program Pidgin (dříve Gaim). Tady existuje možnost, jak kontrolu pravopisu uschopnit. Jde to pomocí zásuvného modulu (pluginu) switch spell, který je pro distribuci Fedora obsažen v rpm balíčku purple-plugin_pack-pidgin. Tento plugin je primárně určený pro přepínání jazyka kontroly pravopisu při komunikaci v jiném jazyku než je nastaven v systému.

Oba tyto programy, Tomboy i Pidgin, využívají pro kontrolu pravopisu knihovnu GtkSpell. Tato knihovna umožňuje provádět kontrolu pravopisu v GtkTextView widgetu. Ve zdroji gtkspell.c v poslední revizi 1.26 jsem našel část (řádky 496-504) týkající se rozpoznání jazyka podle environment proměnné LANG. Příkaz na řádku 499 způsobí, že nedojde ke správnému rozpoznání všech jazyků začínajících písmenem 'c' nebo 'C'. Mezi nimi je i cs_CZ - čeština. Uvedený příkaz byl původně zamýšlen jako pojistka proti špatně zadané hodnotě proměnné LANG a její následné změně v GTK-knihovnách na implicitní hodnotu 'C' (viz. hlášení při chybné hodnotě proměnné LANG: Gtk-WARNING **: Locale not supported by C library. Using the fallback 'C' locale.). Bohužel takovýto chybný zápis způsobí nesprávnou identifikaci všech jazyků začínajících písmenem 'c' a nastavení jazyka pro kontrolu pravopisu na angličtinu.

if (lang == NULL) {
    lang = g_getenv("LANG");
    if (lang) {
        if (g_strncasecmp(lang, "C", 1) == 0)
            lang = NULL;
        else if (lang[0] == 0)
            lang = NULL;
    }
}

Kontrolou ostatních revizí zdrojového kódu gtkspell.c jsem zjistil, že toto chybné rozpoznání jazyka se táhne všemi revizemi od počátku uvedení kódu. Znamená to tedy, že se při použití knihovny GtkSpell nikdy správně nerozpoznala čeština. Pokud tedy někdy diakritika v programech Tomboy nebo Pidgin, či ostatních programech založených na Gtk a kontrole pravopisu pomocí knihovny GtKSpell, fungovala, muselo to být tím, že pro kontrolu pravopisu byl použitý jiný způsob než knihovna GtkSpell.

Oprava tohoto problému je možná úpravou zdrojového kódu gtkspell.c a následným přeložením knihovny GtkSpell. Vzhledem k závislosti na balíčcích GTK+ 2 a Enchant jsem se rozhodl pro jednoduchou opravu přímého patche knihovny /usr/lib/libgtkspell.so.0.0.0 v jejím binárním formátu. Nahradil jsem znak 'C' na adrese 0x3c68 (lepší identifikaci místa najdete v článku Nefunguje kontrola pravopisu v Pidgin, Tomboy - knihovna GtkSpell) znakem 'X' pomocí vynikajícího binárního editoru Bless.

Update - 15.5.2009: Oprava již existuje od 18.2.2009, ale dosud se neprojevila mezi aktualizacemi.