14 Июнь 2002 14:20, Вы написали:
> On Fri, 14 Jun 2002, Сукиязов Сергей Александрович wrote:
>
> Hi,
>
> > 14 Июнь 2002 13:02, Вы написали:
> > > В Чтв, 13.06.2002, в 21:52, Сукиязов Сергей Александрович написал:
> > > > 13 Июнь 2002 21:25, Вы написали:
> > > > > В Чтв, 13.06.2002, в 17:29, Serge Pavlovsky написал:
> > > > > > а савфиш вообще хотят выкинуть в угоду метасити.
> > > > > > типа некому им заниматься... если бы лицемер хп силы тратил на
> > > > > > савфиш, а не на метасити...
> > > > >
> > > > > Ну так потратьте силы на савфиш Вы. А то говорить у нас все
> > > > > горазды, а где русский вклад в Гном?
> > > >
> > > > Могу предложить вариант патча который частично решает проблемы с
> > > > русским. Полностью решить мне не удалось :-((( , там всё намного
> > > > серьёзнее. Всё равно потребуется глубокая переработка sawfish :-(
> > >
> > > Очень хорошо, в багзиллу его или в какой-нибудь из листов. А ещё лучше
> > > как раз савфиш глубоко переработать. Или бросить силы на metacity :)
> >
> > У меня нет времени этим заниматься. Мои патчи только демострируют суть
> > проблемы. В результате - с русским (и с др. языками) проблем нет, но
> > добавляется memory-leak :-((.
> >
> > Я могу кинуть сюда, может кто-нибудь до ума доведет ?
>
Блин залепил не тот файл. Сейчас найду правильный.
> Сходу заметил это:
> sgtk_rep_to_string (repv obj)
> {
> - return rep_STRINGP (obj) ? rep_STR (obj) : (u_char *)"";
> +/* return rep_STRINGP (obj) ? rep_STR (obj) : (u_char *)""; */
> + static u_char *result = 0;
> + u_char *string;
> +
> + if(!result) g_free(result);
>
> В последней строке должно быть
>
> if(result) g_free(result);
>
> Может это и было место лика?
>
Нет лик возникает не в этом месте. Эту строку можно даже стереть. Основная идея - ели строки
передаются в GTK2 то они должны быть в UTF-8, если в X-сы то в локали. Тогда sawfish2 работает
с языками нормально. В последнем варианте эта функции выглядели:
--------------
char *
sgtk_rep_to_string (repv obj)
{
if (rep_STRINGP (obj))
{
gchar *tmpbuf = rep_STR (obj);
gsize tmplen = strlen(tmpbuf);
if (tmplen!=0)
{
GError *error = NULL;
gsize convlen = 0;
gchar *convbuf;
if (g_utf8_validate (tmpbuf,tmplen,0)) return g_strdup(tmpbuf);
convbuf = g_locale_to_utf8 (tmpbuf, tmplen, NULL, &convlen, &error);
if (!error)
return convbuf;
else
{
g_warning ("Error converting string to UTF-8: %s\n", error->message);
g_error_free (error);
}
}
}
return g_strdup("");
}
repv
sgtk_string_to_rep (char *x)
{
repv obj;
if (x == 0)
return Qnil;
if (g_utf8_validate (x,-1,0))
{
u_char *tmp = g_locale_from_utf8 (x, -1, 0, 0, 0);
g_free(x);
x = tmp;
}
obj = rep_string_dup (x);
g_free (x);
return obj;
}
repv
sgtk_static_string_to_rep (const char *x)
{
repv obj;
if (x == 0)
return Qnil;
if (g_utf8_validate (x,-1,0))
{
u_char *tmp = g_locale_from_utf8 (x, -1, 0, 0, 0);
obj = rep_string_dup (tmp);
g_free (tmp);
}
else
obj = rep_string_dup (x);
return obj;
}
--------------
Лик возникает из-за вызова изменённой функции sgtk_rep_to_string (repv obj). Преобразование к
UTF-8 приводит к динамическому выделению памяти под строку, и везде после вызова
sgtk_rep_to_string нужно освобождать память. Если изменить только эти функции то лик будет
проявляться, но появятся русские буквы :-)))
Все вызовы sgtk_rep_to_string в файле gtk-glue.c (там около 1000 вызовов), но этот файл генерится
при помощи lisp-скрипта, и патч оказывается бесполезным :-((
Если кто разберётся с этими скриптами - тогда можно будет сразу генерить gtk-glue.c, такой
какой нужно. Файл я прицеплю, это исправленный вариант - лики в нем не возникают. Но...
Он каждый раз генериться с пом скрипта build-gtk.jl (и связанных с ним).
--
С Уважением
Сукиязов СергейAttachment:
gtk-glue.c.bz2
Description: BZip2 compressed data