Category Archives: fcitx development
Memory pool
自从fcitx的内核从古老的gbk转向了utf8之后,自带拼音和码表的字符串就带来了一些问题。 首先情况是这样的在我的系统上,fcitx的自带拼音加载后将占用28MB的内存,考虑下的话,其中有个 (2int+2pointer)*词数的数据结构,其次是词本身,有约4MB,词总数约20万。那么估计一下的话拼音应该占用约8.5M。考虑刚刚启动不加载的时候,占用约6M,总计应该在14M左右。那多出来的14M都干啥去了呢?(并无内存泄露) 之前也一直没有关注这件事情,不过在前几天在 @henryhu 的建议下增加了一个Memory pool的实现。这个实现非常naive,乃至于不能单独释放申请的内存(只能整体释放)。不过对于fcitx自身拼音和码表的实现这个情况来说,是一个非常合适的选择。 首先有兴趣的人可以来做一个实验,写一个for循环,每次使用malloc申请1字节,循环申请1M次。然后看看操作系统的内存使用量。然后修改下,每次申请16字节,循环申请64k次,总量也是1MB,然后再看看操作系统内存使用量。 具体实现如下,内存不足时默认每次申请8k字节的内存块,如果一次申请超过8k就申请8k的2的n次方那么大的内存。每个块使用一个offset标记里面当前free的位置,当offset和容量的差距小于某个threshold的时候,就将其从可申请的list中移除,保证在遍历候选内存块的列表时的效率,那些不使用的部分成为可以忽略的内存碎片。(实际设定threshold = 16,16相比 8k 可忽略不计) 对于码表和拼音来说,其中的数据是几乎不用单独释放的,这正好可以采用这种naive的实现(而不是使用比较复杂的full functional的memory pool)。 那么最终的效果就是在我的系统上fcitx自带拼音加载后使用内存达到14MB,符合最开始的预期使用。 Ref: http://code.google.com/p/fcitx/issues/detail?id=133 http://en.wikipedia.org/wiki/Memory_pool
Fcitx 4.2 Plan
Feature Plan: XKB Integration. (Done) DBus based input method interface, make it possible to write input method with other programming language and other high level library, like glib or qt. (WIP) (Not one will actually eat this dog food, and … Continue reading
输入法环境变量的故事
有时候我想想,我是不是应该写一些比较普及的文档(你懂得,我特意纠结了一下措辞)。 那么这次先来介绍一下关于输入法的环境变量配置问题: 在远古时代,世界一片混沌,那时世界上还没有 X 窗口下的输入法支持。 神说,要有输入法,于是就有了 XIM 协议。 这个时代(当然还有个几个XIM协议的版本更新),需要设置的环境变量有 XMODIFIERS=”@im=imname” 比较现代的程序的话,是不用纠结imname这个值的,输入法自己会自己也检测一把这个值,然后启动xim的时候也把自己变成这个值。印象中一定要这个环境变量的程序有xterm。 然后XIM有诸多缺点,至少在输入法程序关闭(不一定是死掉)的时候,可能让程序freeze,或者崩溃。 于是神看到XIM是坏的,授意GTK和QT自己做自己的IM Module。 从此天下大乱。 先来看 Gtk 这边,假设没有环境变量,Gtk是读取一些配置文件里面记录的im module的。每个im module都有指定语言,也就是按环境的语言设置匹配。这里来第一个常见问题:英语环境为什么默认不能用输入法而要纠结 LC_CTYPE=”zh_CN.UTF-8″。就是为了让 Gtk 的匹配能够匹配中文的IM Module。当然我个人是反对这种配置的,因为其实只要 GTK_IM_MODULE 足以。世界上据我所知唯一一个奇葩程序一定要这么设置那就是emacs。(因为作为gtk界面的emacs其实是用XIM协议……鬼知道里面hardcode了啥) 第二个常见问题,为什么卸载了ibus就可以用 fcitx,那是因为系统中同时有两个zh的im module(其实是三个,还包括了xim),你不设置环境变量的话,那就会让gtk自己选择了,这个顺序似乎也不确定,如果选到ibus但你用fcitx,或者选到fcitx你用ibus,都会导致你输入法不能正常使用。 设置了GTK_IM_MODULE之后呢?假设匹配到对应的im module,就会使用对应的im module,假设没匹配到,那就返回之前的没有设置的情况。 LC_CTYPE和设置*_IM_MODULE两种方式我偏好后者。 这里还有个很脑残的问题,GTK一定会去读取 /etc/gtk-2.0/gtk.immodules (按发行版,和cpu架构,以及gtk版本可能不同)里面记录的im module,尽管gtk-query-immodules-2.0和gtk-query-immodules-3.0是可以自己查询的。所以打包者必须自己在安装后脚本内更新这些文件。可能当初Gtk想做缓存……不过现在这年头不缓存也没啥大不了的了。 回到 Qt 这边,情况稍好,首先挑选规则还是如之前所述,按语言。但如果没有环境变量QT_IM_MODUE的干预,这个可以通过 … Continue reading
Fcitx 的 Kimpanel 自动切换
如题。好处就是,不用做任何复杂的配置(比如选择特定的启动器,或者禁用什么插件),fcitx 的 kimpanel 就已经开箱即用了。如果没有 kimpanel 支持的桌面(比如没添加插件之类的),也不会变得盲打。 另外找到人接手我之前的 Gnome-Shell 的 kimpanel 了。