gedit 2.5.91得奇怪问题
打开gedit,然后向里面拷贝一些文字,然后存盘。在弹出的对话框的文件名文本框内单击,就会出现一个特殊的符号,然后清除这个符号,输入任何的文件名,都不能正确的存盘。如果你在文件名编辑框中不断的按delete,gedit就崩溃了。如果你在gedit拷贝的文本中敲入任何内容,哪怕是一个空格,上面不能存盘的问题就没有了。但是按住delete依然崩溃。
不知道大家有没有遇到这个问题?可以试一下看看。 不能重现
我 gedit 2.5.91,按存盘后出现对话框中默认文件名为 “未命名 1”,点击或者删除并未出现异常情况
倒是在下面 Save in folder 中,一选“文件系统”,就崩溃了,大家有没有遇到? 在 gdb 中运行时,我获得如下 bt:
(gdb) bt
#00x035cef7e in gtk_file_chooser_dialog_new_with_backend ()
from /usr/lib/libgtk-x11-2.0.so.0
#10x035cf11e in gtk_file_chooser_dialog_new_with_backend ()
from /usr/lib/libgtk-x11-2.0.so.0
#20x035cf193 in gtk_file_chooser_dialog_new_with_backend ()
from /usr/lib/libgtk-x11-2.0.so.0
#30x035d4ee0 in gtk_file_chooser_dialog_new_with_backend ()
from /usr/lib/libgtk-x11-2.0.so.0
#40x035d5073 in gtk_file_chooser_dialog_new_with_backend ()
from /usr/lib/libgtk-x11-2.0.so.0
#50x00291ed2 in g_cclosure_marshal_VOID__VOID ()
from /usr/lib/libgobject-2.0.so.0
#60x0027ef12 in g_closure_invoke () from /usr/lib/libgobject-2.0.so.0
#70x002919ef in signal_emit_unlocked_R () from /usr/lib/libgobject-2.0.so.0
(gdb)
一下子看不出端倪。这到底算进了 libgnomeui 带的文件系统插件了没有?
我系统 locale 是zh_CN.GBK 不能重现
我 gedit 2.5.91,按存盘后出现对话框中默认文件名为 “未命名 1”,点击或者删除并未出现异常情况
倒是在下面 Save in folder 中,一选“文件系统”,就崩溃了,大家有没有遇到?
这个倒是出现过,不过后来升级了gtk2.3.6,而且里面好像永乐gentoo的一个补丁,这个问题就没有了。 Gedit-file.c:374
fname = g_filename_from_utf8 (tmpstr, -1, NULL, NULL, NULL);
这句代码似乎是错误的,不应该将utf8转换到locale编码。应该直接使用,因为在gtk_file_chooser_set_current_name需要的是utf8编码的字符串, 我相信 g_filename_from_utf8 并非简单地将 utf8 串转成 locale 编码。此函数的行为是受环境变量 G_BROKEN_FILENAMES 控制的 你的G_BROKEN_FILENAMES设置为1还是0
我相信 g_filename_from_utf8 并非简单地将 utf8 串转成 locale 编码。此函数的行为是受环境变量 G_BROKEN_FILENAMES 控制的 我没有设,你呢? 我的locale设置是
gentoo jcome $ locale
LANG=zh_CN.gbk
LC_CTYPE=zh_CN.gbk
LC_NUMERIC=en_US
LC_TIME=en_US
LC_COLLATE=en_US
LC_MONETARY=en_US
LC_MESSAGES=en_US
LC_PAPER=en_US
LC_NAME=en_US
LC_ADDRESS=en_US
LC_TELEPHONE=en_US
LC_MEASUREMENT=en_US
LC_IDENTIFICATION=en_US
LC_ALL=
gentoo jcome $ export
......................
G_BROKEN_FILENAMES="1"
........................
Here is the patch
it works for me.diff -uNrp gedit-2.5.91/gedit/gedit-file.c gedit-2.5.91.new/gedit/gedit-file.c
--- gedit-2.5.91/gedit/gedit-file.c 2004-03-05 23:19:46.000000000 +0800
+++ gedit-2.5.91.new/gedit/gedit-file.c 2004-03-16 20:32:59.543092960 +0800
@@ -370,12 +370,12 @@ gedit_file_save_as (GeditMDIChild *child
path = (gedit_default_path != NULL) ?
g_strdup (gedit_default_path) : NULL;
- tmpstr = gedit_document_get_uri (doc);
- fname = g_filename_from_utf8 (tmpstr, -1, NULL, NULL, NULL);
+ fname = gedit_document_get_uri (doc);
+ /*fname = g_filename_from_utf8 (tmpstr, -1, NULL, NULL, NULL);*/ if (!fname)
/* FIXME: should fname remain NULL in this case? - Paolo */
fname = g_strdup ("Untitled"); /* Use ASCII */
- g_free (tmpstr);
+ /*g_free (tmpstr);*/
}
else
{
Re: Here is the patch
it works for me.我还没有看代码,不过我有点不是很明白。你在这里取消了对 g_filename_from_utf8 的调用,准备在哪儿再调用它呢?总不能不调吧,否则 G_BROKEN_FILENAMES 环境变量就不起作用了 这个地方是不许要调用的, 因为他通过这个来取得document的文件名,而在一个新文件没有被存盘之前他的标识应该是untitled,所以它会使用缺省的Untitled加一个数字作为序列号,如果你用了locale,那么他就会取得一个utf8的字符串,中文下就是未命名,然后他用这个字符串来调用gtk_file_chooser_set_current_name(),而这个函数是需要一个utf8字符串的,当你在file-chooser里面设定了文件名,确定之后, gedit会重新将得到的新的文件名在此转换为local编码的,然后进行实际的存盘。
不知道是不是正确,至少对我的是这样的
我的G_BROKEN_FILENAMES=1
在我设置LANG=zh_CN.UTF8和LC_ALL=zh_CN.UTF8之后, 即使不用补丁也正常。但是打了补丁之后在gb2312下面也正常了。
Re: Here is the patch
it works for me.Where is the patch? Let's check if it has been fixed now. I've tried but still cannot reproduce it
页:
[1]