最後に、私は自分の道を見つけました。
まず第一に、私は持っていGtkWindow *
ます。
GtkWidget *window;
入力メソッドをサポートするには、 を初期化しGtkIMContext
、クライアント ウィンドウを設定する必要があります。これを 2 番目のパラメーターとして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);
最後のステップで、フォーカスを this に設定します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
- Cでgtkウィンドウのgdkウィンドウを取得するにはどうすればよいですか?