扫码关注官方订阅号
gtk+2(C语言)下如何接受fcitx或ibus等输入法输入的字符?
人生最曼妙的风景,竟是内心的淡定与从容!
最终还是我自己找到了答案……
首先我有一个GtkWindow *.
GtkWindow *
GtkWidget *window;
为了使用输入法,必须又一个GtkIMContext,然后用gtk_im_context_set_client_window设置其client window,这个函数使用GdkWindow *作为第二参数,而不是GtkWindow *。
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上:
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函数。
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);
参考:
https://github.com/GNOME/gtk/...
https://developer.gnome.org/g...
http://stackoverflow.com/ques...
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
最终还是我自己找到了答案……
首先我有一个
GtkWindow *.为了使用输入法,必须又一个
GtkIMContext,然后用gtk_im_context_set_client_window设置其client window,这个函数使用GdkWindow *作为第二参数,而不是GtkWindow *。最后一步,就是设置焦点到
im_context上:现在输入法就可以正常使用了! 之后,还可以监听各种
GtkIMContext的信号来处理输入:为了能在
commit信号的回调中能接受英文字符,必须监听key-press-event信号并使用gtk_im_context_filter_keypress函数。参考:
https://github.com/GNOME/gtk/...
https://github.com/GNOME/gtk/...
https://developer.gnome.org/g...
http://stackoverflow.com/ques...