文档详情

fcitx源码分析

小**
实名认证
店铺
PDF
153.71KB
约18页
文档ID:47791513
fcitx源码分析_第1页
1/18

Fcitx 源码分析源码分析fcitx是一个输入法linux下的输入法做得很好用起来很方便,很舒服可惜,已经停止开发但是,已经快1年了吧个人感觉,它依然是最好 的Ubuntu7.10自带的是scim可是,刚一装上就有文件夹重命名问题虽说,可以通过改配置文件解决但是,总是感觉很不舒服,各种各样的问 题,太烦了没办法,一上来就换成fcitx可惜,fctix已经停止了而且已经停止很久了接替者,好像也一直没有正式的更新放出我能找到的最后的源代码就是这个2007-11-21的于是,我就以这个版本为标准对其源代码进行分析和分析wattcp一样我尽量不去解说那些成文的规则仅仅解说他是如何实现的不过,到现在为止,我还没有对它的代码进行任何的分析和阅读所以,也就不再分章节了我们就从 main函数开始,一个函数一个函数的往下看最后,如果可以的话,我们再以文件为单位进行一些解说分析它的源代码,不敢奢求有什么贡献谨以表示对作者的尊敬和感谢今天从上面找到了源代码各个文件的说明,很不全以后有时间一点一点的填补吧转载如下: -----------------------------------------------------------------------------------------描述 fcitx 源码文件的用处。

AutoEng.h/AutoEng.c自动切换到英文输入状态void LoadAutoEng (void) 从 ~/.fcitx/AutoEng.dat (如果不存在,则从 /usr/local/share/fcitx/data/AutoEng.dat) 读取需要自动转换到英文输入状态的情况的数据void FreeAutoEng (void)释放相关资源Bool SwitchToEng (char *) 判断是否需要自动转到英文输入状态IC.h/IC.c InputWindow.h/InputWindow.c 输入条窗口KeyList.h/KeyList.c 键盘扫描码列表MainWindow.h/MainWindow.c 主窗口MyErrorsHandlers.h/MyErrorsHandlers.c PYFA.h/PYFA.c QuickPhrase.h/QuickPhrase.c about.h/about.c extra.h/extra.c fcitx.h ime.h/ime.c 按键和输入法通用功能处理internalVersion.c main.h/main.c/main.c.test程序主入口punc.h/punc.cpy.h/py.cpyMapTable.h/pyMapTable.cpyParser.h/pyParser.cqw.h/qw.csp.h/sp.ctable.h/table.c tools.h/tools.c配置文件读写ui.h/ui.cversion.h.invk.h/vk.cxim.h/xim.cint main (int argc, char *argv[]) { XEvent event; // 见解说1 int c; // 用于保存用户输入的参数 BoolbBackground = True;// 见解说2// 解析命令行参数,见解说2、3while((c = getopt(argc, argv, “dDvh“)) != -1){ switch(c){ case 'd':// 见解说2 /* nothing to do */ break; case 'D':// 见解说2 bBackground = False; break; case 'v':// 输出版本号 Version(); return 0; case 'h':// h或者其他任何不合法的参数均,输出参数帮助信息 case '?': Usage(); return 0; } }// 下面两行代码用于检查当前系统使用的是否是UTF字符集。

相当于在字符终端执行“locale charmap”[6] setlocale (LC_CTYPE, ““);// 设置字符分类为当前系统类型,见解说4 bIsUtf8 = (strcmp (nl_langinfo (CODESET), “UTF-8“) == 0);/* 先初始化 X 再加载配置文件,因为设置快捷键从 keysym 转换到* keycode 的时候需要 Display*/ if (!InitX ())exit (1);// xWindow是必须的如果此处初始化失败,程序肯定无法运行个人认为应该输出输出相关信息的语句,或采用断言如果可能发生,出了错就应该有信息输出如果不可能发生就使用断言,写成:// bReturn = InitX ();// ASSERT(bReturn);// (个人观点,仅供参考)// 加载用户配置文件,通常是“~/.fcitx/config”,如果该文件不存在就从安装目录中拷贝“/data/config”到“~/.fcitx/config”,详细的解说见《LoadConfig及LoadProfile函数》 LoadConfig (True);// 创建字体。

实际上,就是根据用户的设置,使用xft读取字体的相关信息xft是x11提供的处理字体的相关函数集详细参考[7] CreateFont ();// 根据字体计算输入窗口的高度 CalculateInputWindowHeight ();// 加载配置文件,这个配置文件不是用户配置的,而是用于记录fctix的运行状态的,比如是全角还是半角等等通常是“~/.fcitx /profile”,如果该文件不存在就从安装目录中拷贝“/data/profile”到“~/.fcitx/profile”,详细的解说见 《LoadConfig及LoadProfile函数》LoadProfile ();// 加载字典文件,详见《字典及成语的处理》 LoadPuncDict (); // 加载成语,详见《字典及成语的处理》 LoadQuickPhrase (); // 从 ~/.fcitx/AutoEng.dat (如果不存在,则从 /usr/local/share/fcitx/data/AutoEng.dat) 读取需要自动转换到英文输入状态的情况的数据 [8] LoadAutoEng ();// 以下是界面的处理。

详细解说见《界面的处理》// 创建主窗口,即输入法状态窗口 CreateMainWindow (); // 处理颜色,即候选词窗口的颜色,也就是我们在“~/.fcitx/config”定义的那些颜色信息 InitGC (mainWindow); // 创建候选次窗口 CreateVKWindow (); // 创建输入窗口 CreateInputWindow (); // 创建关于窗口,(说实话,用了这么长时间的fctix了,还从来没有见到过这个窗口) CreateAboutWindow ();// 将本程序加入到输入法组,告诉系统,使用我输入字符 SetIM ();// 处理主窗口的显示详细解说见《界面的处理》 if (hideMainWindow != HM_HIDE) {DisplayMainWindow ();DrawMainWindow (); }// 初始化输入法,详细解说见《我是输入法》 if (!InitXIM (mainWindow))exit (4);//以后台方式运行 if (bBackground) { pid_t id;id = fork ();if (id == -1) {printf (“Can't run as a daemon!\n“);exit (1);}else if (id > 0)exit (0); }// 处理相关的信号 SetMyExceptionHandler (); // 主循环,相当与windows下GUI程序的消息循环。

详细解说见《事件处理》 for (;;) {// 等待一个事件发生XNextEvent (dpy, // 如果是超时,等待下一个事件if (XFilterEvent (// 处理事件MyXEventHandler ( }return 0; }1、XEvent是xlib里面定义的结构它用来保存从X服务器那里接受到的事件,包括事件的类型,以及与事件相关的数据(例如在屏幕什么地方生成的 事件,鼠标键的事件等等),需要根据事件类型来读取相应的事件里的数据[1]详细用法请参考“man XEvent”2、该变量用以标示是否以daemon运行fcitx 启动时默认作为 daemon 运行(这个更常见些)如需不作为 daemon运行,可使用 -D 选项原来的 -d 选项仍保留,但什么也不做[2]daemon:守护程序,操作系统的后台进程,通常具有root安全级别许可权守护程序通常隐藏在后台,直至被某个事件(例如特定的时间或日期、时间间隔、收到电子邮件等)触发后它才会进入活动状态[3]相当于windows下的服务的概念3、使用 getopt 解析命令行选项使用 getopt 可以提供更一致的(相对于系统中的其他程序而言)命令行选项处理方式[2]。

getopt:unix下解析命令行参数的函数,定义于:getopt.h 通常通过包含unistd.h间接包含它具体用法请执行“man getopt”或参考[4]4、setlocal不是一个函数,而是一个宏,实际上调用的是_Xsetlocalesetlocale(分类, locale)来初始化locale数据. 当locale设置为空时, locale的值便从系统的环境变量中取得详细信息见源代码“usr/include/x11/xlocale.h“或参考[5]参考资料:1、 国际化本地化和中文化(二)》 2401.htm6、《Linux Unicode 编程》 %90%E7%A0%81%E6%96%87%E4%BB%B6%E8%AF%B4%E6%98%8E 一、读取配置文件 /** 读取用户的配置文件*/ void LoadConfig (Bool bMode) { FILE*fp; charbuf[PATH_MAX], *pbuf, *pbuf1; BoolbFromUser = True;// 用以标识配置文件是用户家目录下的,还是从安装目录下拷贝过来的。

int group_idx, i; Configure *tmpconfig;// 见解说[1]bIsReloadConfig = bMode;// 这是一个全局变量,定义于“src/tool.c[193]“pbuf = getenv(“HOME“);// 从环境变量中获取当前用户家目录。

下载提示
相似文档
正为您匹配相似的精品文档