Personal tools
You are here: Home GNOME 新闻 解决了 xchat 同 fcitx 在 gtk+-2.6.* 中的冲突
Navigation
Log in


Forgot your password?
New user?
 

解决了 xchat 同 fcitx 在 gtk+-2.6.* 中的冲突

by yangh last modified Apr 04, 2006 10:15 AM

这个问题已经让人无法忍受了,不过现在,已经找到问题的所在和解决办法了。

xchat 同 fcitx 在 gtk+-2.6.* 中的冲突早在大家开始使用 gtk+-2.5/6.* 就开始了。 参见 bugzilla: #15

首先,这不是 fcitx 的问题。也不是 gtk+-2.6.* 的问题。而是 xchat 中的代码问题,xchat-2.4.2/src/fe-gtk/maingui.c:

   /* a channel has been focused */

   static void
   mg_focus (session *sess)
   {
           if (sess->gui->is_tab)
                   current_tab = sess;
           current_sess = sess;

           /* dirty trick to avoid auto-selection */
           GTK_ENTRY (sess->gui->input_box)->editable = 0;
           gtk_widget_grab_focus (sess->gui->input_box);
           GTK_ENTRY (sess->gui->input_box)->editable = 1;

在这里,在 gtk_widget_grab_focus 之前,输入框的 editable 属性被设置成了 0 (FALSE),这样,gtk_widget_grab_focus 时,输入控件不会发出相应的信息(gtk_im_context_reset) 以通知输入法程序自身状态的改变,控件自身也不就不会同 fcitx 交互,所以这时虽然光标在输入框里,还是输入不了中文,只会出来字母。

从代码中的注示来看,作者是为了避免在切换频道时,输入框内文本自动选中,再输入的话所有内容就被新输入替换掉了。当然,如其所说,切实有点 'dirty'。:)

由于原来的代码没有使用 GTK+ 中的公共接口来操作输入框的 editable 属性,而是使用直接对属性赋值的方法,导致输入框在获得焦点并设置为可编辑时,没有对输入法做相应的通知,所以导致了输入法失效。

正确的解决办法就是调用 GTK+ 中的公共接口 gtk_editable_set_editable (...) 来操作输入框的可编辑属性,这样,在输入框被设置为可编辑时,会自动通知输入法,使得输入法重新开始工作。:) 在"补丁":http://bugs.gnome-cn.org/bugzilla/attachment.cgi?id=12 里就是这样做的。

如果大家等不及了,就自己把补丁打上试吧。在 xchat 2.4.0/1/2 上都可以工作。

补丁已经提交到 xchat 的 sf bugzilla 上:xchat im conflict

更新:

2005-03-28
编写了更合理的补丁。
2005-04-01
此问题已经在 xchat 2.4.3 中解决。
Document Actions