当前位置:Linux教程 - Linux文化 - Linux中文化之炎黄中文平台输入法添加

Linux中文化之炎黄中文平台输入法添加


在炎黄中文平台上,用户可以自行添加输入法。炎黄中文平台的输入部分的程序设计使用了一个主导模块作为和平台的接口,它和各输入法模块之间采用统一的、规范的界面。各个输入法可看作是一个个过滤,输入ASCII码,返回得到的汉字。

输入法的主导模块以动态连接库(libimpi.a)的形式存在,和各输入法模块连接成单独的可执行文件。对于每一个具体的输入法,只需要按照一定的数据结构就可以链接成为新的可执行文件,并且添加到炎黄中文平台上。这些数据结构包括外部变量和外部函数。

1、外部变量

数组extcode[]:字符串类型,表示输入的外码串;

数组candstr[]:字符串类型,表示重码的待选串;

数组result[]:字符串类型,表示得到的结果串;

数组imname[]:字符串类型,表示输入法的名称;

数组imdscrpt[]:字符串类型,表示对输入法的描述。

变量maxeclen:整型,表示外码的最大长度;

变量eclen:整型,表示外码的长度。

这些变量的定义如下所示:

extern int maxeclen; /* The maximum length of external code */   extern int eclen; /* The length of external code */   extern char extcode[]; /* External code */   extern char candstr[]; /* Candinate string */   extern char result[]; /* Result string */

2、外部函数

外部函数一共有四个,它们分别是IMInit()、IMCleanup()、IMSelect()和IMFilter()。这四个函数的定义分别如下所示:

 int IMInit();   int IMClearup();   int IMSelect(int select);   int IMFilter(int ch); 其中IMInit()函数用来完成输入法的初始化工作;IMClearup()函数用来对输入法被释放时的情况进行处理; IMSelect()函数用来处理当前输入法被选中的情况;IMFilter()是输入法的核心函数,用来对接收的字符串进行过滤,得到正确的输入结果。

下面以区位输入法为例对此进行简单的介绍。

准备工作

首先需要取得libimpi.a文件,然后可以创建一个qvwei目录。

代码编写

编译一个qvwei.c文件,接着对输入法进行初始化,这时候的qvwei.c如下所示:

 /* The qvwei input method      */   #include   #include   #include   #include   #include "impi.h"   char imname[] = "区位";   char imdscrpt[] = "区位输入法";   static void reset();   static void append(int ch);   static void comp_appe(int prevch, int ch);   int IMInit()   {   return 0;   }   int IMClearup()   {   return 0;   }   int IMSelect(select)   int select;   {   return 0;   }   int IMFilter(ch)   int ch;   {   }

接下来的工作就是编写IMInit()、IMClearup()、IMSelect()和IMFilter()这四个函数了。

在IMInit()函数中添加如下的代码:

 maxeclen = 5;   reset();   return 0;

由于区位输入法比较简单,IMClearup()和IMSelect()函数都不需要额外添加代码,在IMFilter()这个函数中加入如下的处理代码:

candstr[0] = '\0';   result[0] = '\0';   /* process currnet keystroke */   if (isdigit(ch))   {   if ((eclen == 1) || (eclen == 3))   comp_appe(extcode[eclen - 1], ch);   else   append(ch);   if (eclen == 4)   {   int qv, wei;   qv = (extcode[0] - '0') * 10 + (extcode[1] - '0');   wei = (extcode[2] - '0') * 10 + (extcode[3] - '0');   reset();   result[0] = qv + 0xa0;   result[1] = wei + 0xa0;   result[2] = '\0';   }   }   else   {   if ((ch == KEY_BACKSPACE) && (eclen > 0))   extcode[--eclen] = '\0';   else   {   result[0] = ch;   result[1] = '\0';   }   }   /* generate candinates */   if ((eclen > 0) && (eclen < 4))   {   int qv, wei, i, w;   char buf[3];   char *p;          if (eclen > 1)   qv = (extcode[0] - '0') * 10 + (extcode[1] - '0');   else if (extcode[0] == '0')   qv = 1;   else   qv = (extcode[0] - '0') * 10;   wei = (eclen < 3) ? 0 : (extcode[2] - '0') * 10;   p = candstr;   for (i = 0; i 0) && (w