1 概述
Poky是一个简洁的嵌入式Linux图形环境。在poky中实现中文显示比较容易,主要是设置区域和增加中文字体。实现中文输入就要复杂一些。我尝试过移植scim或fcitx,但都碰到同样的问题:poky环境的xim用不起来。我写了一个IMdkit的测试程序,在调用IMOpenIM后,我登记的回调函数收不到任何XIM呼叫。我想这个问题可能是poky对xlib的简化引起的。
为了回避xim问题,我改用Gtk的IMContext接口。输入法引擎基本上照搬fcitx,重写了接口和显示部分。另外还写了一个GTK的IM模块。
2 工作原理
2.1 程序框架
程序构架如下图所示。
GTK的IM模块派生自GtkIMContext接口。它负责把编辑窗口的输入法事件传递给输入法程序,并将输入法程序返回的文本用"commit"信号提交给编辑框。输入法程序接收IM模块传来的输入法事件,显示预编辑信息,并将用户选择的文本发送给IM模块。
2.2 输入法程序
输入法程序可以分成三块:
- 接口部分。这部分负责与客户程序通信。目前它是和GTK的IM模块通信。如果要改成基于XIM的输入法,主要是重写这块。
- 输入法引擎。这部分基本照搬fcitx。不过我去掉了fcitx的大部分全局变量,只保留了几个简单的接口。只要能实现几个接口函数,就可以把引擎替换掉。
- 用户界面。这部分负责状态窗口、候选窗口的绘制。
三个部分用一些简单的接口代码连接起来,基本上可以独立测试。例如我先在windows的VC环境调好输入法引擎。然后调好IM模块和输入法程序接口部分的通信。最后才是绘制界面。
2.3 IM模块和输入法程序的通信
IM模块和输入法程序用socket通信。IM模块通过GTK的io channel接收socket数据。输入法程序用select同时接收X事件和通过socket传来的输入法事件。
2.4 IM模块的实现
中文输入需要显示预编辑输入和候选字词。根据这些输入信息的显示位置,XIM总结了4种输入法风格:
- root-window就是在输入法窗口显示所有输入信息。
- over-the-spot就是输入法程序将输入信息显示在一个小窗口里面,小窗口随光标移动,例如:
- on-the-spot就是由客户程序直接在光标位置显示预编辑输入,例如:
- off-the-spot是由客户程序提供一个显示窗口,由输入法程序负责绘制。
在Windows中,通常只有输入法感知的程序才能实现on-the-spot,即客户程序要处理输入法信号。在GTK中,GtkIMContext提供了预编辑接口,所以由IM模块和输入法程序配合就可以实现on-the-spot,不需要客户程序直接参与。
不过,为了简单起见,我还是使用了over-the-spot的风格。这样只需要重载5个接口:
static void
mb_im_context_class_init (MbIMContextClass *klass)
{
GtkIMContextClass *context_class = GTK_IM_CONTEXT_CLASS (klass);
parent_class = g_type_class_peek_parent (klass);
context_class->set_client_window = mb_im_context_set_client_window;
context_class->focus_in = mb_im_context_focus_in;
context_class->focus_out = mb_im_context_focus_out;
context_class->filter_keypress = mb_im_context_filter_keypress;
context_class->set_cursor_location = mb_im_context_set_cursor_location;
}
在focus_in和focus_out显示或隐藏输入法窗口。set_client_window和set_cursor_location收集光标位置,传给输入法程序。 filter_keypress将按键信息传给输入法程序。
字母和数字按键都可以异步处理,即这些按键都交给输入法程序,不需要编辑窗口处理。有的按键需要同步处理。例如退格键,首先交给输入法程序,如果输入法程序认为这个键未处理,就要再返还给编辑窗口处理。因此对于此类按键,im模块要同步等待输入法程序的响应。
3 结束语
scim的框架有78597行代码,拼音输入模块有13917行代码。 fcitx有28542行代码,其中IMdkit库有10000行代码,调用IMdkit库的xim.c有800行代码。我写的IM模块有842行代码,输入法程序有7230行代码,其中服务器接口部分只有291行代码。虽然我的程序是实验性的,但这也说明使用GtkIMContext接口比使用XIM接口要简单一点。
但基于GtkIMContext的输入法只能用于GTK程序,在兼容性上要弱于基于XIM的输入法。所以以后还是可以尝试一下重新构建poky,去掉影响xim功能的简化。
分享到:
相关推荐
* POKY可以用于构建嵌入式Linux根文件系统,提供了快速、稳定的开发环境。 * POKY可以减少开发周期,提高开发效率。 知识点五:Linux根文件系统 * 根文件系统是Linux操作系统的起点和支撑,选择一个好的根文件系统...
这意味着poky可能是一个公开的、可供下载和克隆的项目,用于开发者进行协作或构建自己的软件环境。 标签是 "Python",这意味着poky项目可能与Python编程语言有密切关系,或者是使用Python编写的,或者是为Python...
这样,开发者可以直接在熟悉的QtCreator环境中编写、编译和调试使用Poky SDK构建的应用程序,无需手动配置复杂的环境变量和路径。 **主要功能** 1. **自动检测和导入**: 插件自动检测并加载Poky SDK,使得开发者...
Poky作为Yocto项目的一部分,扮演着核心编译环境的角色。它包含了构建嵌入式Linux所需的全部工具链,包括GCC(GNU Compiler Collection)编译器、Glibc库、Binutils以及其他的开发工具。这些工具使得开发者可以编写...
Yocto:Yocto是这个开源项目的名称,该项目旨在帮助我们自定义...此外Poky还有另外一层意思,使用Poky系统得到的默认参考 Linux 发行版也叫Poky(当然,我们可以对此发行版随意命名)。 很有用的yocto教程,看完包会
poky 允许您将多电子商务平台从多次电子商务平台导入/复制产品,只需单击一下,它是保存您的时间复制和粘贴的良好应用程序。 您只需在商店安装Poky应用程序并访问我们的应用支持的平台上的产品页面,并启动少量点击...
4. **Yocto Project**:Poky是Yocto Project的基础,后者是一个由Linux基金会支持的开源项目,旨在为嵌入式设备提供一致且可扩展的开发环境。Yocto Project提供了工具链、构建系统(BitBake)和元数据,使得开发者...
meta-debian是用于poky构建系统的一组配方(元数据),它允许使用Debian源代码包交叉构建GNU / Linux映像。 通过启用meta-debian,您可以使用Debian源代码为多种体系结构交叉构建一个小的GNU / Linux映像。 meta-...
POKY WooCommerce版本允许您一键将产品从多个电子商务平台导入/复制到WooCommerce商店,这是一个节省您复制和粘贴时间的好应用程序。 您只需在商店上安装POKY扩展程序,然后在我们的应用程序支持的平台上访问产品...
龙芯平台yocto工程
### MDM9607 MDM9X07编译环境安装 #### 一、概述 本文档将指导您如何在Ubuntu 12.04或Ubuntu 14(64位)系统上安装、更新及配置MDM9607/MDM9X07的编译环境。为了确保安装过程顺利进行,您需要具备root权限或能够...
本文将详细介绍如何在Yocto环境下创建一个Linux镜像,并成功启动该镜像,同时会涉及一些关于Yocto环境配置和操作的基础知识点。 硬件条件方面,Yocto环境的创建首先需要满足一定的硬件要求。推荐使用64位多核CPU,...
Yocto 编译环境是指用于构建定制化 Linux 发行版的开发环境。在这个环境中,开发者可以通过配置一系列参数来指定构建的目标平台、软件包、工具链等信息。Yocto 编译环境的核心优势在于其高度的灵活性和可定制性,...
5. **poky-ref-manual.pdf**:Poky是Yocto的核心,此手册详细介绍了其内部结构和工作流程。内容包括源码管理、构建过程、目标设备支持等,帮助开发者深入理解Poky系统。 6. **Yocto Project Development Manual.pdf...
M6708-T系列核心板交叉编译所需工具,包括交叉编译工具poky-glibc-x86_64-meta-toolchain-qt5-cortexa9hf-vfp-neon-toolchain-1.7.sh,触摸屏驱动tslib-1.21-new.tar.gz,文件系统rootfs.tar.gz
该uimage是基于Ubuntu下在arm-linux-gcc 的环境下交叉编译生成的,帮助一些朋友不用经过繁琐的编译
- 而应该使用Poky SDK提供的环境脚本来自动设置所有的环境变量。这是因为直接指定工具链可能会忽略一些必要的编译选项,导致编译失败或缺失必要的头文件。 6. **检查编译命令**: - 确认编译命令是否正确。例如,...
./configure --host=arm-poky-linux-gnueabi --prefix=/opt/fsl-imx-fb/4.9.88-2.0.0/sysroots/cortexa9hf-neon-poky-linux-gnueabi/usr ``` 需要注意的是,不要加 CC 选项,否则可能会出现问题。 OpenSSL 库 ...