2016-10-13 15 views
0

私はアプリケーションを作成しています。に文字を描画するために、カスタムテキスト入力のpangoを使用してアプリケーションを作成しています。アプリケーションで漢字を入力できないことをユーザーが教えてくれるまでは問題ありません。 fcitx入力メソッド。 gtk + 2のインプットメソッドから文字を受け取る方法は?

は現在、私は、文字入力を実現するために、単純な key_press_event & key_release_event GSignalsを使用していますが、私はそれがインプットメソッドのために働くだろうとは思わない、私は GtkIMContext APIを見つけたが、それを使用する方法がわかりません。

私の質問は、gtk + 2のfcitx/ibus入力メソッドから文字を受け取る方法です。

答えて

0

最後に私は自分のやり方を見つけました。

まず、私は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); 

最後に、これをim_contextに設定します。

gtk_im_context_focus_in(im_context); 

これで入力方法が利用可能になりました。その後、入力を処理するためにGtkIMContextの信号を聞くことができます。 commit信号のコールバックでの英語の文字を受信するために

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); 

、あなたは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); 

Refenerces:

  1. https://github.com/GNOME/gtk/blob/gtk-2-24/gtk/gtkentry.h
  2. https://github.com/GNOME/gtk/blob/gtk-2-24/gtk/gtkentry.c
  3. https://developer.gnome.org/gtk2/2.24/GtkIMContext.html
  4. How do I get the gdk window for a gtk window in C?
関連する問題