C 如何在gtk+中从输入法接收字符;2.

C 如何在gtk+中从输入法接收字符;2.,c,linux,gtk,gtk2,fcitx,C,Linux,Gtk,Gtk2,Fcitx,我正在使用C>k+2和自定义文本输入创建一个应用程序,pango将字符绘制到GtkDrawingArea,一切正常,直到用户告诉我他不能在我的应用程序中输入汉字,他使用fcitx输入法 目前我正在使用simplekey\u press\u event&key\u release\u eventGSignals来实现字符输入,但我认为它对输入法不起作用,我找到了一个api,但不确定如何使用它 所以,我的问题是,如何在gtk+2中从fcitx/ibus输入法接收字符?最终我自己找到了方法 首先,

我正在使用C>k+2和自定义文本输入创建一个应用程序,pango将字符绘制到
GtkDrawingArea
,一切正常,直到用户告诉我他不能在我的应用程序中输入汉字,他使用fcitx输入法

目前我正在使用simple
key\u press\u event
&
key\u release\u event
GSignals来实现字符输入,但我认为它对输入法不起作用,我找到了一个api,但不确定如何使用它


所以,我的问题是,如何在gtk+2中从fcitx/ibus输入法接收字符?

最终我自己找到了方法

首先,我有一个
GtkWindow*

GtkWidget *window;
为了支持输入法,我必须初始化
GtkIMContext
并设置客户端窗口,
gtk\u im\u context\u set\u client\u窗口
使用
GdkWindow*
作为其第二个参数

GtkIMContext *im_context = gtk_im_multicontext_new();
GdkWindow *gdk_window = gtk_widget_get_window(GTK_WIDGET(window));
gtk_im_context_set_client_window(im_context, gdk_window);
最后一步,将焦点设置为此
im\u上下文

gtk_im_context_focus_in(im_context);
现在输入法可用了!在此之后,您可以监听
GtkIMContext
的信号来处理输入

g_signal_connect(im_context, "commit",
      G_CALLBACK(commit_callback), NULL);
g_signal_connect(im_context, "preedit-changed",
      G_CALLBACK(preedit_changed_callback), NULL);
g_signal_connect(im_context, "retrieve-surrounding",
      G_CALLBACK(retrieve_surrounding_callback), NULL);
g_signal_connect(im_context, "delete-surrounding",
      G_CALLBACK(delete_surrounding_callback), NULL);
为了在
commit
signal的回调中接收英文字符,您必须监听
按键事件
信号并使用
gtk\u im\u context\u filter\u keypress
函数

static gboolean key_callback(GtkWidget *widget,
                             GdkEventKey *event,
                             GtkIMContext *im_context) {
  return gtk_im_context_filter_keypress(im_context, event);
}

g_signal_connect(window, "key-press-event",
      G_CALLBACK(key_callback), im_context);
参考文献: