linux - gtk+2下如何接受输入法输入的字符?

查看:363
本文介绍了linux - gtk+2下如何接受输入法输入的字符?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

gtk+2(C语言)下如何接受fcitx或ibus等输入法输入的字符?

解决方案

最终还是我自己找到了答案……

首先我有一个GtkWindow *.

GtkWidget *window;

为了使用输入法,必须又一个GtkIMContext,然后用gtk_im_context_set_client_window设置其client window,这个函数使用GdkWindow *作为第二参数,而不是GtkWindow *

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

参考:

  1. https://github.com/GNOME/gtk/...

  2. https://github.com/GNOME/gtk/...

  3. https://developer.gnome.org/g...

  4. http://stackoverflow.com/ques...

这篇关于linux - gtk+2下如何接受输入法输入的字符?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆