Как получить символы из метода ввода в gtk+2?

Я создаю приложение, используя C & gtk+2 с пользовательским вводом текста, панго, чтобы нарисовать символы GtkDrawingAreaвсе работает нормально, пока пользователь не скажет мне, что он не может вводить китайские символы в моем приложении, он использует метод ввода fcitx.

В настоящее время я использую простой key_press_event & key_release_event GSignals для реализации ввода символов, но я не думаю, что это будет работать для методов ввода, я нашел API GtkIMContext, но не уверен, как его использовать.

Итак, мой вопрос, как получить символы из методов ввода fcitx/ibus в gtk+2?

1 ответ

Решение

Наконец-то я нашел способ сам.

Прежде всего, у меня есть GtkWindow *,

GtkWidget *window;

Чтобы поддержать методы ввода, я должен инициализировать GtkIMContext и установите окно клиента, 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);

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. Как мне получить окно gdk для окна gtk в C?
Другие вопросы по тегам