3

カスタムテキスト入力、pango で文字を描画する C & gtk+2 を使用してアプリケーションを作成していますGtkDrawingArea。ユーザーが私のアプリケーションで漢字を入力できないと言うまで、すべて正常に動作します。彼は fcitx 入力メソッドを使用します。 .

現在、単純なkey_press_event& key_release_eventGSignals を使用して文字入力を実装していますが、入力メソッドでは機能しないと思います。GtkIMContext API を見つけましたが、使用方法がわかりません。

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

4

1 に答える 1

5

最後に、私は自分の道を見つけました。

まず第一に、私は持ってい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);

参考文献:

  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. Cでgtkウィンドウのgdkウィンドウを取得するにはどうすればよいですか?
于 2016-10-27T08:11:17.423 に答える