[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