C 如何在gtk+中从输入法接收字符;2.
我正在使用C>k+2和自定义文本输入创建一个应用程序,pango将字符绘制到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输入法接收字符?最终我自己找到了方法 首先,
GtkDrawingArea
,一切正常,直到用户告诉我他不能在我的应用程序中输入汉字,他使用fcitx输入法
目前我正在使用simplekey\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);
参考文献: