解决了 xchat 同 fcitx 在 gtk+-2.6.* 中的冲突
这个问题已经让人无法忍受了,不过现在,已经找到问题的所在和解决办法了。
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 中解决。

