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