Как получить символы из метода ввода в 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: