[devel] Re: [sisyphus] I gtk+-1.2.9

Sergey Vlasov =?iso-8859-1?q?vsu_=CE=C1_mivlgu=2Emurom=2Eru?=
Пн Мар 12 20:31:06 MSK 2001


On Sun, 11 Mar 2001 23:37:05 +0200
Alexander Bokovoy <ab на avilink.net> wrote:

> В XFree86 используется 16-битные последовательности для символов, но при
> этом происходит конверсия (xc/lib/X11/lcUTF8.c):
> /* Part I: Conversion routines CompoundText/CharSet <--> Unicode/UTF-8.
>  *
>  * Note that this code works in any locale. We store Unicode values in
>  * `ucs4_t' variables, but don't pass them to the user.
>  *
>  * This code has to support all character sets that are used for CompoundText,
>  * nothing more, nothing less. See the table in lcCT.c.
>  * Since the conversion _to_ CompoundText is likely to need the tables for all
>  * character sets at once, we don't use dynamic loading (of tables or shared
>  * libraries through iconv()). Use a fixed set of tables instead.
>  *
>  * We use statically computed tables, not dynamically allocated arrays,
>  * because it's more memory efficient: Different processes using the same
>  * libX11 shared library share the "text" and read-only "data" sections.
> */
> typedef unsigned int ucs4_t;

Все, глюк пойман. xc/lib/X11/lcUTF8.c в 3.3.6 отсутствует, но не в этом дело. В xc/lib/X11/lcGenConv.c и lcGeneric.c в структуре XLCdGenericPart есть такое интересное поле - use_stdc_env. Если там стоит True - используются функции из libc (из семейства mbtowc), False - собственная кодировка.

А поле устанавливается по содержимому /usr/X11R6/lib/X11/locale/koi8-r/XLC_LOCALE (или другого, в зависимости от LC_CTYPE). Так вот, в XFree 4.0.2 в этом файле стоит строка:

use_stdc_env		True

А в 3.3.6 ее нет, поэтому используется wc_encoding_mask, wc_shift_bits и другие странные способы кодирования (честно говоря, я в них не разбирался, но достаточно того, что не юникод).

Сейчас попробовал на 3.3.6 запустить testgtk из 1.2.9 - GtkEntry не работает, как я и писал, выводит вместо русских букв младший байт юникода. Добавил в /usr/X11R6/lib/X11/locale/koi8-r/XLC_LOCALE строчку "use_stdc_env True" - русские буквы появились.

Вывод - для перехода на gtk-1.2.9 требуется одно из двух:

1) Отказаться от --with-native-locale (в этом случае gdk_mbstowcs будет использовать XmbTextListToTextProperty и XwcTextPropertyToTextList, и результат этого в любом случае будет пригоден для XwcDrawString).

2) Патчить XFree 3.3.6 на предмет внесения во все файлы XLC_LOCALE строки "use_stdc_env True" по образцу XFree 4. К каким глюкам это может привести - неизвестно.

Понятно, что вариант "выбросить XFree 3.3.6 вообще" не пройдет - в XFree 4.0.2 есть не все драйверы.

Я так понимаю, что у всех тестирующих уже стоит XFree 4.0.2, вот этого фокуса никто и не замечал. Или в Sisyphus 3.3.6 все-таки уже попатчен таким образом?




Подробная информация о списке рассылки Sisyphus