登陆论坛
|
论坛注册
|
加入收藏
|
设为首页
|
RSS
首页
Linux频道
软件下载
开发语言
技术论坛
嵌入式频道
|
安装与配置
|
上网与多媒体
|
使用与技巧
|
输入您的搜索字词
提交搜索表单
您当前的位置:
首页
>
Linux频道
>
Linux入门与提高
>
安装与配置
Linux下添加炎黄中文输入法平台
时间:2006-07-21 20:01:41 来源:Linux联盟收集 作者:
在炎黄中文平台上,用户可以自行添加输入法。炎黄中文平台的输入部分的程序设计使用了一个主导模块作为和平台的接口,它和各输入法模块之间采用统一的、规范的界面。各个输入法可看作是一个个过滤,输入ASCII码,返回得到的汉字。
mtrLinux联盟
mtrLinux联盟
输入法的主导模块以动态连接库(libimpi.a)的形式存在,和各输入法模块连接成单独的可执行文件。模块层次如下图:
mtrLinux联盟
mtrLinux联盟
对于每一个具体的输入法,只需要按照一定的数据结构就可以链接成为新的可执行文件,并且添加到炎黄中文平台上。这些数据结构包括外部变量和外部函数。
mtrLinux联盟
mtrLinux联盟
1、外部变量
mtrLinux联盟
mtrLinux联盟
数组extcode[]:字符串类型,表示输入的外码串;
mtrLinux联盟
mtrLinux联盟
数组candstr[]:字符串类型,表示重码的待选串;
mtrLinux联盟
mtrLinux联盟
数组result[]:字符串类型,表示得到的结果串;
mtrLinux联盟
mtrLinux联盟
数组imname[]:字符串类型,表示输入法的名称;
mtrLinux联盟
mtrLinux联盟
数组imdscrpt[]:字符串类型,表示对输入法的描述。
mtrLinux联盟
mtrLinux联盟
变量maxeclen:整型,表示外码的最大长度;
mtrLinux联盟
mtrLinux联盟
变量eclen:整型,表示外码的长度。
mtrLinux联盟
mtrLinux联盟
这些变量的定义如下所示:
mtrLinux联盟
mtrLinux联盟
extern int maxeclen; /* The maximum length of external code */
mtrLinux联盟
mtrLinux联盟
extern int eclen; /* The length of external code */
mtrLinux联盟
mtrLinux联盟
extern char extcode[]; /* External code */
mtrLinux联盟
mtrLinux联盟
extern char candstr[]; /* Candinate string */
mtrLinux联盟
mtrLinux联盟
extern char result[]; /* Result string */
mtrLinux联盟
mtrLinux联盟
2、外部函数
mtrLinux联盟
mtrLinux联盟
外部函数一共有四个,它们分别是IMInit()、IMCleanup()、IMSelect()和IMFilter()。这四个函数的定义分别如下所示:
mtrLinux联盟
mtrLinux联盟
int IMInit();
mtrLinux联盟
mtrLinux联盟
int IMClearup();
mtrLinux联盟
mtrLinux联盟
int IMSelect(int select);
mtrLinux联盟
mtrLinux联盟
int IMFilter(int ch);
mtrLinux联盟
mtrLinux联盟
其中IMInit()函数用来完成输入法的初始化工作;IMClearup()函数用来对输入法被释放时的情况进行处理; IMSelect()函数用来处理当前输入法被选中的情况;IMFilter()是输入法的核心函数,用来对接收的字符串进行过滤,得到正确的输入结果。
mtrLinux联盟
mtrLinux联盟
下面以区位输入法为例对此进行简单的介绍:
mtrLinux联盟
mtrLinux联盟
准备工作
mtrLinux联盟
mtrLinux联盟
首先需要取得libimpi.a文件,然后可以创建一个qvwei目录。
mtrLinux联盟
mtrLinux联盟
代码编写
mtrLinux联盟
mtrLinux联盟
编译一个qvwei.c文件,接着对输入法进行初始化,这时候的qvwei.c如下所示。
mtrLinux联盟
mtrLinux联盟
/* The qvwei input method
mtrLinux联盟
mtrLinux联盟
*/
mtrLinux联盟
mtrLinux联盟
#include
mtrLinux联盟
mtrLinux联盟
#include
mtrLinux联盟
mtrLinux联盟
#include
mtrLinux联盟
mtrLinux联盟
#include
mtrLinux联盟
mtrLinux联盟
#include "impi.h"
mtrLinux联盟
mtrLinux联盟
char imname[] = "区位";
mtrLinux联盟
mtrLinux联盟
char imdscrpt[] = "区位输入法";
mtrLinux联盟
mtrLinux联盟
static void reset();
mtrLinux联盟
mtrLinux联盟
static void append(int ch);
mtrLinux联盟
mtrLinux联盟
static void comp_appe(int prevch, int ch);
mtrLinux联盟
mtrLinux联盟
int IMInit()
mtrLinux联盟
mtrLinux联盟
{
mtrLinux联盟
mtrLinux联盟
return 0;
mtrLinux联盟
mtrLinux联盟
}
mtrLinux联盟
mtrLinux联盟
int IMClearup()
mtrLinux联盟
mtrLinux联盟
{
mtrLinux联盟
mtrLinux联盟
return 0;
mtrLinux联盟
mtrLinux联盟
}
mtrLinux联盟
mtrLinux联盟
int IMSelect(select)
mtrLinux联盟
mtrLinux联盟
int select;
mtrLinux联盟
mtrLinux联盟
{
mtrLinux联盟
mtrLinux联盟
return 0;
mtrLinux联盟
mtrLinux联盟
}
mtrLinux联盟
mtrLinux联盟
int IMFilter(ch)
mtrLinux联盟
mtrLinux联盟
int ch;
mtrLinux联盟
mtrLinux联盟
{
mtrLinux联盟
mtrLinux联盟
}
mtrLinux联盟
mtrLinux联盟
接下来的工作就是编写IMInit()、IMClearup()、IMSelect()和IMFilter()这四个函数了。
mtrLinux联盟
mtrLinux联盟
在IMInit()函数中添加如下的代码:
mtrLinux联盟
mtrLinux联盟
maxeclen = 5;
mtrLinux联盟
mtrLinux联盟
reset();
mtrLinux联盟
mtrLinux联盟
return 0;
mtrLinux联盟
mtrLinux联盟
由于区位输入法比较简单,IMClearup()和IMSelect()函数都不需要额外添加代码,在IMFilter()这个函数中加入如下的处理代码:
mtrLinux联盟
mtrLinux联盟
candstr[0] = ' ';
mtrLinux联盟
mtrLinux联盟
result[0] = ' ';
mtrLinux联盟
mtrLinux联盟
/* process currnet keystroke */
mtrLinux联盟
mtrLinux联盟
if (isdigit(ch))
mtrLinux联盟
mtrLinux联盟
{
mtrLinux联盟
mtrLinux联盟
if ((eclen == 1) || (eclen == 3))
mtrLinux联盟
mtrLinux联盟
comp_appe(extcode[eclen - 1], ch);
mtrLinux联盟
mtrLinux联盟
else
mtrLinux联盟
mtrLinux联盟
append(ch);
mtrLinux联盟
mtrLinux联盟
if (eclen == 4)
mtrLinux联盟
mtrLinux联盟
{
mtrLinux联盟
mtrLinux联盟
int qv, wei;
mtrLinux联盟
mtrLinux联盟
qv = (extcode[0] - '0') * 10 + (extcode[1] - '0');
mtrLinux联盟
mtrLinux联盟
wei = (extcode[2] - '0') * 10 + (extcode[3] - '0');
mtrLinux联盟
mtrLinux联盟
reset();
mtrLinux联盟
mtrLinux联盟
result[0] = qv + 0xa0;
mtrLinux联盟
mtrLinux联盟
result[1] = wei + 0xa0;
mtrLinux联盟
mtrLinux联盟
result[2] = ' ';
mtrLinux联盟
mtrLinux联盟
}
mtrLinux联盟
mtrLinux联盟
}
mtrLinux联盟
mtrLinux联盟
else
mtrLinux联盟
mtrLinux联盟
{
mtrLinux联盟
mtrLinux联盟
if ((ch == KEY_BACKSPACE) && (eclen > 0))
mtrLinux联盟
mtrLinux联盟
extcode[--eclen] = ' ';
mtrLinux联盟
mtrLinux联盟
else
mtrLinux联盟
mtrLinux联盟
{
mtrLinux联盟
mtrLinux联盟
result[0] = ch;
mtrLinux联盟
mtrLinux联盟
result[1] = ' ';
mtrLinux联盟
mtrLinux联盟
}
mtrLinux联盟
mtrLinux联盟
}
mtrLinux联盟
mtrLinux联盟
/* generate candinates */
mtrLinux联盟
mtrLinux联盟
if ((eclen > 0) && (eclen < 4))
mtrLinux联盟
mtrLinux联盟
{
mtrLinux联盟
mtrLinux联盟
int qv, wei, i, w;
mtrLinux联盟
mtrLinux联盟
char buf[3];
mtrLinux联盟
mtrLinux联盟
char *p;
mtrLinux联盟
mtrLinux联盟
mtrLinux联盟
mtrLinux联盟
if (eclen > 1)
mtrLinux联盟
mtrLinux联盟
qv = (extcode[0] - '0') * 10 + (extcode[1] - '0');
mtrLinux联盟
mtrLinux联盟
else if (extcode[0] == '0')
mtrLinux联盟
mtrLinux联盟
qv = 1;
mtrLinux联盟
mtrLinux联盟
else
mtrLinux联盟
mtrLinux联盟
qv = (extcode[0] - '0') * 10;
mtrLinux联盟
mtrLinux联盟
wei = (eclen < 3) ? 0 : (extcode[2] - '0') * 10;
mtrLinux联盟
mtrLinux联盟
p = candstr;
mtrLinux联盟
mtrLinux联盟
for (i = 0; i <= 9; i++)
mtrLinux联盟
mtrLinux联盟
{
mtrLinux联盟
mtrLinux联盟
w = wei + i;
mtrLinux联盟
mtrLinux联盟
if ((w > 0) && (w <= 94))
mtrLinux联盟
mtrLinux联盟
{
mtrLinux联盟
mtrLinux联盟
buf[0] = qv + 0xa0;
mtrLinux联盟
mtrLinux联盟
buf[1] = wei + i + 0xa0;
mtrLinux联盟
mtrLinux联盟
buf[2] = ' ';
mtrLinux联盟
mtrLinux联盟
p += sprintf(p, " %d: %s", i, buf);
mtrLinux联盟
mtrLinux联盟
}
mtrLinux联盟
mtrLinux联盟
}
mtrLinux联盟
mtrLinux联盟
}
mtrLinux联盟
mtrLinux联盟
return 0;
mtrLinux联盟
mtrLinux联盟
上面的代码中用到了另外三个函数,这三个函数可以定义为局部函数,它们的实现代码如下所示:
mtrLinux联盟
mtrLinux联盟
static void reset(void)
mtrLinux联盟
mtrLinux联盟
{
mtrLinux联盟
mtrLinux联盟
eclen = 0;
mtrLinux联盟
mtrLinux联盟
extcode[0] = ' ';
mtrLinux联盟
mtrLinux联盟
candstr[0] = ' ';
mtrLinux联盟
mtrLinux联盟
result[0] = ' ';
mtrLinux联盟
mtrLinux联盟
}
mtrLinux联盟
mtrLinux联盟
static void append(ch)
mtrLinux联盟
mtrLinux联盟
int ch;
mtrLinux联盟
mtrLinux联盟
{
mtrLinux联盟
mtrLinux联盟
extcode[eclen++] = ch;
mtrLinux联盟
mtrLinux联盟
extcode[eclen] = ' ';
mtrLinux联盟
mtrLinux联盟
}
mtrLinux联盟
mtrLinux联盟
static void comp_appe(prevch, ch)
mtrLinux联盟
mtrLinux联盟
int prevch;
mtrLinux联盟
mtrLinux联盟
int ch;
mtrLinux联盟
mtrLinux联盟
{
mtrLinux联盟
mtrLinux联盟
if (prevch == '0')
mtrLinux联盟
mtrLinux联盟
{
mtrLinux联盟
mtrLinux联盟
if (ch != '0')
mtrLinux联盟
mtrLinux联盟
append(ch);
mtrLinux联盟
mtrLinux联盟
}
mtrLinux联盟
mtrLinux联盟
else if (prevch == '9')
mtrLinux联盟
mtrLinux联盟
{
mtrLinux联盟
mtrLinux联盟
if (ch <= '4')
mtrLinux联盟
mtrLinux联盟
append(ch);
mtrLinux联盟
mtrLinux联盟
}
mtrLinux联盟
mtrLinux联盟
else
mtrLinux联盟
mtrLinux联盟
append(ch);
mtrLinux联盟
mtrLinux联盟
}
mtrLinux联盟
mtrLinux联盟
把上面的代码拼接起来,就是一个完整的qvwei.c文件。
mtrLinux联盟
mtrLinux联盟
编译和链接
mtrLinux联盟
mtrLinux联盟
最后可以编写一个MakeFile来创建可执行的输入法文件。一个Makefile的例子如下所示:
mtrLinux联盟
mtrLinux联盟
qvwei:
mtrLinux联盟
mtrLinux联盟
cc –c qvwei.c
mtrLinux联盟
mtrLinux联盟
cc –o $@ qvwei.o libimpi.a
mtrLinux联盟
mtrLinux联盟
strip $@
mtrLinux联盟
mtrLinux联盟
rm –f *.o
mtrLinux联盟
mtrLinux联盟
然后只需要在这个目录下键入make,就可以创建一个可执行的qvwei文件。在运行炎黄中文平台之后运行这个qvwei文件,就可以把这个输入法添加到炎黄中文平台中,平台会自动给这个输入法分配切换快捷键。
mtrLinux联盟
mtrLinux联盟
注意事项:
mtrLinux联盟
mtrLinux联盟
1:随同打包的还有四个文件,它们分别是impi.c、impi.h、incommon.c和imcommon.h,它们的作用是用来生成 libimpi.a。提供这四个函数源代码的用意是方便用户对输入法的理解。但是绝对不要改变这四个文件并且重新编译libimi.a,否则炎黄中文平台有可能无法识别新生成的输入法。
mtrLinux联盟
mtrLinux联盟
2:以上只是一个简单的示例,针对不同的输入法类型,输入法的核心代码可能要复杂得多。
mtrLinux联盟
来顶一下
返回首页
发表评论
共有
条评论
用户名:
密码:
验证码:
匿名发表
相关文章
在 Arch Linux 上安装 GNOME 及中
应用Linux下两种中文输入法
栏目更新
栏目热门
站内搜索:
Linux频道
下载频道
图库
商品
嵌入式频道
高级搜索
网站首页
|
关于我们
|
服务条款
|
广告服务
|
联系我们
|
网站大全
|
免责声明
|
返回顶部
Copyright © 2007-2008 xxlinux.com, All rights reserved.
Powered by linux联盟
京ICP备05012402号