`
flytreeleft
  • 浏览: 91998 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

Fcitx4.2英文输入切换的改造

阅读更多

    最近Fcitx版本升级到了4.2,由于4.1版本中的英文输入切换考虑的情况太少,其仅在首个输入为大写字母时才切换到英文状态,而对于在中途输入大写字母并不能切换到英文输入.所以,我想看看4.2在这个问题上是否有所改善.于是,便下载/编译并安装试用.


    使用时,发现其还是没有将中途输入大写字母的情况切换到英文输入状态,于是,我又开始尝试修改源代码.


    按照前文<Fcitx中文状态下的英文输入问题解决方案>的方法,我打开文件"src/module/autoeng/AutoEng.c",并找到函数"ProcessAutoEng",结果发现作者对该函数进行了修改,前文的方法已经不适用了.不过,经过分析和调试,我发现,作者新增了一个函数"SwitchToEng",从名字看出,应该是切换到英文输入的判断方法,其源代码如下:

boolean SwitchToEng(FcitxAutoEngState* autoEngState, char *str)
{
    AUTO_ENG*       autoeng;
    for (autoeng = (AUTO_ENG *) utarray_front(autoEngState->autoEng);
            autoeng != NULL;
            autoeng = (AUTO_ENG *) utarray_next(autoEngState->autoEng, autoeng)) {
        printf("switch to english: str-%s,autoeng->str-%s\n", str, autoeng->str);
        if (!strcmp(str, autoeng->str))
            return true;
    }

    return false;
}

     其中,printf语句为便于分析该函数作用而写的调试输入,在编译,安装(由于fcitx将在/usr/lib和/usr/local/lib下搜索运行库,故必须进行安装),运行后发现,autoeng->str输出的为如"https","http:"等,并且在输入开头为这些字符串时,fcitx将自动进入英文状态,这样,可以判断,该函数的确是自动切换英文输入的方法,在返回true时,fcitx进入英文输入状态.

    

    于是,我在for循环之后,增加如下代码:

 

int index = autoEngState->index - 1;
char last = autoEngState->buf[index];
if (index > 0 && ('A' <= last && 'Z' >= last)) {
    return true;
}
 

     autoEngState->buf中存放的是当前输入的字符(最后一个为'\0'),这里,我仅对"中途"输入大写字母的情况进行了判断,如果中途输入了大写字母,则返回true,这样fcitx便自动进入英文输入状态.


    如此,我的目的便轻松地达到了.


    如果,这样的判断还是不能满足要求,那就在if语句中再增加判断条件吧!


    Fcitx-4.2.0的源代码及编译所需的pinyin.tar.gz和table.tar.gz已上传到附件中,可以直接下载.所上传代码为原始代码,并未做修改,需要的童鞋,可以直接打开文件"src/module/autoeng/AutoEng.c",并将函数"SwitchToEng"修改为如下代码:

boolean SwitchToEng(FcitxAutoEngState* autoEngState, char *str)
{
    AUTO_ENG*       autoeng;
    for (autoeng = (AUTO_ENG *) utarray_front(autoEngState->autoEng);
            autoeng != NULL;
            autoeng = (AUTO_ENG *) utarray_next(autoEngState->autoEng, autoeng)) {
        // 如果输入以"http:","https"等开头,则进入英文输入状态
        if (!strcmp(str, autoeng->str))
            return true;
    }
    // 那再对是否含有大写字母或标点进行判断,是,则进入英文输入状态
    int index = autoEngState->index - 1;
    char last = autoEngState->buf[index];
    if (index > 0 && ('A' <= last && 'Z' >= last)) {
        return true;
    }

    return false;
}

      在控制台中输入如下命令进行编译,安装:

$ cmake . && make && sudo make install && pkill fcitx && fcitx
  

    原始下载地址为: http://code.google.com/p/fcitx/downloads/list

 

后记: 现在4.2.2版已经能够支持首字母非大写的英文输入了,非常感谢作者一直对Fcitx的更新!

0
0
分享到:
评论
1 楼 hurricanek 2012-02-20  
嗯,想法很好。

已经修改了。虽然实现方式不太一样。

http://code.google.com/p/fcitx/source/diff?spec=svn5d667f7f20708c651b4ec3a8698c65599318ee0f&r=5d667f7f20708c651b4ec3a8698c65599318ee0f&format=side&path=/src/module/autoeng/AutoEng.c

相关推荐

Global site tag (gtag.js) - Google Analytics