Chinaunix首页 | 论坛 | 博客
  • 博客访问: 192254
  • 博文数量: 111
  • 博客积分: 3010
  • 博客等级: 中校
  • 技术积分: 1240
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-07 07:46
文章分类

全部博文(111)

文章存档

2015年(2)

2014年(1)

2011年(1)

2010年(7)

2009年(100)

我的朋友

分类: LINUX

2009-08-23 08:19:54


转载时请注明出处和作者联系方式
文章出处:http://www.limodev.cn/blog
作者联系方式:李先静

2.7. 模块动态加载机制(Module)

SCIM只是一个框架,具体的输入法是通过动态库的方式加载进来的,而不是在编译时静态的绑起来的。SCIM实现了一个Module类,封装了操作系统底层函数,提供面向对象的接口。另外,在此基础之上,还实现了其它几个类对Module进行包装,提供更具体的服务。

o ConfigModule 用于动态加载配置模块。

o FilterModule用于动态加载过滤器模块。

o FrontEndModule用于动态加载前端模块。

o IMEngineModule用于动态加载引擎模块。

o HelperModule用于动态加载辅助功能模块。

2.8. 其它组件

2.8.1. 过滤器(Filter)模块:提供动态的转换或过滤功能,可以实现诸如在中文繁体和简体之间进行转换的功能。

2.8.2. 异常处理:SCIM完全采用OOP编程,使用了C++的异常处理机制,大部分模块都有自己的异常处理类。

2.8.3. 类工厂:为解耦使用者与实现者之间的耦合,SCIM采用了类工厂的机制来封装对象的创建。

2.8.4. Signal/Slot:为解耦软件各层间的耦合,SCIM采用了Signal/Slot机制。

3. SCIM的动态行为(GTK+中)

3.1. 传统输入法

PanelClient/ SocketInstance/SocketConfig是在应用程序进程中运行的,但为了降低与应用程序的耦合,它们往往被封装在一个独立的模块里,比如在GTK+中就是这样做的。

Panel是作为一个单独的进程运行的,它通过PanelAgent与外界交互。

输入法服务进程也是一个单独进程,它通过SocketFrontEnd与外界交互。尽管它也可以是另外一个输入法服务进程的代理,不过那样做似乎没有什么意义。

3.2. 手写输入法

手写输入法不是作为一个普通的引擎来实现的。它往往是一个单独的进程,带有GUI界面。它通过HelperAgent把识别的字符串提交给Panel,或者转发一些事件给Panel,它与应用程序之间并无直接通信。

Panel在此时除了具体传统的功能外,同时还作为手写输入法与应用程序的中介者。

这里的应用程序和普通的应用程序没有差别,它根本不会觉察到手写输入法的存在,这可能也体现出SCIM设计的精妙之处吧。

4. SCIM框架与具体输入法的关联

具体的输入法要挂到SCIM中,那是一件非常简单的事情,只要实现IMEngineInstanceBase接口,编译成一个动态库,放到指定的目录即可。输入法的实现者不必花费时间去考虑如何与应用程序关联起来,专心的去实现输入法本身就行了。

5. SCIM与GTK+的关联

GTK+是GNOME的一套GUI,实现得也很精致。把输入法挂到GTK+中来很简单,和SCIM类似,它对输入法也作了抽象,它要求实现GtkIMContextClass接口,并编译成一个动态库,放到指定的目录即可。

关于GtkIMContextClass的描述,可能参考文档http://developer.gnome.org/doc/API/2.0/gtk/GtkIMContext.html。

6. SCIM的配置文件

6.1. SCIM的配置文件放在/usr/local/etc/scim中(与安装位置有关):

Config文件放置的是与输入法有关的配置信息,包括输入法前端、输入法引擎、Panel、快捷键等的参数。

Global文件放置的是与输入法无关的配置信息,但这些信息对SCIM的环境来说,是必不可少的,如socket地址、panel应用程序名、socket超时时间等。

6.2. 数据文件和资源文件放在/usr/local/share/scim/中(与安装位置有关):

icons 中是放置的图片文件。

Pinyin之类的目录放的是具体输入法需要的数据文件。

阅读(1086) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~