如何从 gtk+2 中的输入法接收字符?
How to receive characters from input method in gtk+2?
我正在使用 C & gtk+2 创建一个带有自定义文本输入的应用程序,pango 将字符绘制到 GtkDrawingArea
,一切正常,直到用户告诉我他不能输入中文字符在我的申请中,他使用的是fcitx输入法。
目前我正在使用简单的 key_press_event
& key_release_event
GSignals 来实现字符输入,但我认为它不适用于输入法,我发现了一个 GtkIMContext api 但不确定如何使用它。
所以,我的问题是,如何从 gtk+2 中的 fcitx/ibus 输入法接收字符?
我终于找到了自己的路。
首先,我有一个GtkWindow *
。
GtkWidget *window;
为了支持输入法,我必须初始化一个GtkIMContext
并设置客户端window,gtk_im_context_set_client_window
使用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_context
。
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
信号的回调中接收英文字符,您必须监听 key-press-event
信号并使用 gtk_im_context_filter_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);
参考文献:
- https://github.com/GNOME/gtk/blob/gtk-2-24/gtk/gtkentry.h
- https://github.com/GNOME/gtk/blob/gtk-2-24/gtk/gtkentry.c
- https://developer.gnome.org/gtk2/2.24/GtkIMContext.html
- How do I get the gdk window for a gtk window in C?
我正在使用 C & gtk+2 创建一个带有自定义文本输入的应用程序,pango 将字符绘制到 GtkDrawingArea
,一切正常,直到用户告诉我他不能输入中文字符在我的申请中,他使用的是fcitx输入法。
目前我正在使用简单的 key_press_event
& key_release_event
GSignals 来实现字符输入,但我认为它不适用于输入法,我发现了一个 GtkIMContext api 但不确定如何使用它。
所以,我的问题是,如何从 gtk+2 中的 fcitx/ibus 输入法接收字符?
我终于找到了自己的路。
首先,我有一个GtkWindow *
。
GtkWidget *window;
为了支持输入法,我必须初始化一个GtkIMContext
并设置客户端window,gtk_im_context_set_client_window
使用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_context
。
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
信号的回调中接收英文字符,您必须监听 key-press-event
信号并使用 gtk_im_context_filter_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);
参考文献:
- https://github.com/GNOME/gtk/blob/gtk-2-24/gtk/gtkentry.h
- https://github.com/GNOME/gtk/blob/gtk-2-24/gtk/gtkentry.c
- https://developer.gnome.org/gtk2/2.24/GtkIMContext.html
- How do I get the gdk window for a gtk window in C?