当前位置: 技术问答>linux和unix
Linux下的GTK widget为什么能找到输入法
来源: 互联网 发布时间:2017-01-02
本文导语: 问题: 在嵌入式平台上开发一个输入法程序,但是GTK程序找不到这个输入法。 -------------- 在Ubuntu上,GTK程序会根据系统变量 GTK_IM_MODULE 的值,到/etc/X11/xinit/xinput.d/ 目录下去找输入法的配置文件,从而找到输入法的...
问题: 在嵌入式平台上开发一个输入法程序,但是GTK程序找不到这个输入法。
--------------
在Ubuntu上,GTK程序会根据系统变量 GTK_IM_MODULE 的值,到/etc/X11/xinit/xinput.d/ 目录下去找输入法的配置文件,从而找到输入法的应用程序。
请问,我想把输入法移植到一个嵌入式平台上,没有对应的/etc/X11/xinit/xinput.d/ 目录。
1. 我需要做些什么,才能让GTK程序找到输入法的配置文件/和IME进行通讯?
2. Ubuntu系统为什么能找到/etc/X11/xinit/xinput.d/ 目录?
多谢!
PS: 在[嵌入式开发]板块发了两天都没人理我,所以在这里重新发一次。
--------------
在Ubuntu上,GTK程序会根据系统变量 GTK_IM_MODULE 的值,到/etc/X11/xinit/xinput.d/ 目录下去找输入法的配置文件,从而找到输入法的应用程序。
请问,我想把输入法移植到一个嵌入式平台上,没有对应的/etc/X11/xinit/xinput.d/ 目录。
1. 我需要做些什么,才能让GTK程序找到输入法的配置文件/和IME进行通讯?
2. Ubuntu系统为什么能找到/etc/X11/xinit/xinput.d/ 目录?
多谢!
PS: 在[嵌入式开发]板块发了两天都没人理我,所以在这里重新发一次。
|
大概看了一下gtk的代码,实现很简单。
gtk 自己维护一个hashtable,管理所有的输入法, 输入法加载后拿到“类指针”保存起来
gtkentry的实现, “类” 里面有一个成员是用来保存 这个 输入法指针的, gtkentry建立的时候,初始化这个指针为 指定的输入法,
然后gtkentry有 按键消息的时候, 就使用这个指针去调用 输入法的注册的回调函数就处理就可以了。
static gint
gtk_entry_key_press (GtkWidget *widget,
GdkEventKey *event)
{
GtkEntry *entry = GTK_ENTRY (widget);
GtkEntryPrivate *priv = entry->priv;
gtk_entry_reset_blink_time (entry);
gtk_entry_pend_cursor_blink (entry);
if (priv->editable)
{
if (gtk_im_context_filter_keypress (priv->im_context, event)) ///这里调用输入发注册的回调函数
{
gtk_entry_obscure_mouse_cursor (entry);
priv->need_im_reset = TRUE;
return TRUE;
}
}
|
你这个输入法应该是GTK接口的? 还有好像也可以 XIM 接口的。
启动应用程序之前应该设置 这变量吧,默认应该也是有个 gtk.immodules这样的配置文件,自己找下看看
http://www.gtk.org/api/2.6/gtk/gtk-running.html
GTK_IM_MODULE.� Specifies an IM module to use in preference to the one determined from the locale.
GTK_IM_MODULE_FILE.� Specifies the file listing the IM modules to load. This environment variable overrides the im_module_file specified in the RC files, which in turn overrides the default value sysconfdir/gtk-2.0/gtk.immodules (sysconfdir is the sysconfdir specified when GTK+ was configured, usually /usr/local/etc.)
启动应用程序之前应该设置 这变量吧,默认应该也是有个 gtk.immodules这样的配置文件,自己找下看看
http://www.gtk.org/api/2.6/gtk/gtk-running.html
GTK_IM_MODULE.� Specifies an IM module to use in preference to the one determined from the locale.
GTK_IM_MODULE_FILE.� Specifies the file listing the IM modules to load. This environment variable overrides the im_module_file specified in the RC files, which in turn overrides the default value sysconfdir/gtk-2.0/gtk.immodules (sysconfdir is the sysconfdir specified when GTK+ was configured, usually /usr/local/etc.)
|
因为输入法框架支持gtk接口
linux下的scim、ibus并不相当于windows下的搜狗、智能abc,而相当于Windows语言栏,是个框架,这个框架负责和桌面交互
linux下的scim、ibus并不相当于windows下的搜狗、智能abc,而相当于Windows语言栏,是个框架,这个框架负责和桌面交互
|
im都有自己的守护进程,进程既然存在,那无论是gtk找im,还是im自己就能找你的鼠标什么的都是可以实现的,具体的细节我是不太清楚
|
自己去看下gtk的代码就知道了
http://git.gnome.org/browse/gtk+/tree/gtk/gtkentry.c
http://git.gnome.org/browse/gtk+/tree/gtk/gtkentry.c