FCITX輸入中文繁體字的補丁
眾所周知,GBK碼中收錄了很多中文繁體字和簡體字,而GB2312幾本只收錄中文簡體字。而我們所喜愛的FCITX輸入法中有對GBK簡繁轉換
進行支持,于是,拼音輸入只能輸入簡體詞組,而繁體詞組則相當麻
煩幾于這個原因,本作者對FCITX,做了極為DIRTY的HACK(部分原因
是因為FCITX中的代碼極其煩冗,不易擴充,當然FCITX的作者們所做
的工作是有目共睹的),下面的PATCH中,對FCITX的幾個檔案做了挂
接處理,做了自動轉換簡體到繁體的功能。
補丁包說明:
gbks2t.tab- 本人整理的簡到繁字體轉換碼表
fcitx-3.2-output-gbk-tradition.patch - 補丁文件
安裝說明:
拷貝gbks2t.tab到 fcitx源碼 data/目錄下
進入fcitx源碼目錄
patch -p1 < fcitx-3.2-output-gbk-tradition.patch
編譯說明:
aclocal
autoconf
automake
libtoolize --copy --force
make
make install
其他說明:
本補丁針對 FCITX 3.2代碼
代碼中還修改了一下“联”這個字的圖標,以使這個圖標和我新增的
“繁”這個字的圖標一致,很不恭敬的作法希望原作者原諒。
關于GBK編碼下無法輸入某些字符的原因已找到,是因為libX11庫中GBK
編碼轉到UNICODE編碼時出了問題。補丁包裏有一個處理這個問題的補丁,
針對libX11-1.0.1(xorg7中模塊),libX11-1.0.1-gb18030.patch
這個是以前用來處理gb18030時用的,我做了一下處理同時處理GBK編碼,
這樣處理以後在X中看來GB18030和GBK編碼是同樣的東東了:) 顶一个先 另外要感謝KanKer,關于無法輸出某些繁體字符問題上的幫忙和提示,
THANK V'MUCH 非常感谢,如果你能参加进来,负责 magic 的繁体(正体)中文化,以及改进 magic,请和我联系,我们一直没有这方面的高手。可以用站内信件。也可以上 msn:jackliu9999 msn.com 用起來很爽,感謝 wall_join。打過該補丁的 fcitx 3.2.1 下載地址:
http://www.magiclinux.org/dev/2.0-update/RPMS/fcitx-3.2.1-3mgc.i686.rpm 用起來很爽,感謝 wall_join。打過該補丁的 fcitx 3.2.1 下載地址:
http://www.magiclinux.org/dev/2.0-update/RPMS/fcitx-3.2.1-2mgc.i686.rpm
你。。。
居然打包好了也不告诉我,害我重新下载了3.2.1。。。 wall_join 的 fcitx 補丁中有一個小 bug,點擊gbk,聯、繁等按鈕時會引起輸入法切換,在此修正:
--- fcitx-3.2/src/ui.c.orig 2006-06-22 16:15:16.000000000 +0800
+++ fcitx-3.2/src/ui.c 2006-06-22 16:21:53.000000000 +0800
@@ -419,11 +419,14 @@
ChangePunc ();
else if (IsInBox (event->xbutton.x, event->xbutton.y, 38, 1, 55, 19))
ChangeCorner ();
- else if (IsInBox (event->xbutton.x, event->xbutton.y, 56, 1, 73, 19))
+ else if (IsInBox (event->xbutton.x, event->xbutton.y, 55, 1, 72, 19))
ChangeGBK ();
- else if (IsInBox (event->xbutton.x, event->xbutton.y, 74, 1, 91, 19))
+ else if (IsInBox (event->xbutton.x, event->xbutton.y, 72, 1, 89, 19))
ChangeLegend ();
- iPos = 92;
+ else if (IsInBox (event->xbutton.x, event->xbutton.y, 89, 1, 106, 19))
+ ChangeGBKT ();
+
+ iPos = 107;
}
if (IsInBox (event->xbutton.x, event->xbutton.y, iPos, 1, iPos + 10, 19))
ChangeLock ();
ML 的 rpm包已修正,為3mgc。
關于Fcitx-3.2.1
我也發現這個問題了,fcitx-3.2下沒有這個問題,但fcitx-3.2.1出現了,而且我到現在也沒搞清楚是為什麽,奇奇怪怪的,不過KanKer
的方法能管用。
如果是編譯fcitx-3.2.1的話,除了打我上面包中的:
patch -p1 < fcitx-3.2-output-gbk-tradition.patch
還要打下面的補丁:
patch -p1 < fcitx-3.2.1-output-gbk-tradition-extra.patch
見附件。 上面錯誤的真正原因,已找到,因為一個變量越界造成的。
先看代碼 fcitx/src/ui.c:
INT8 iPos; /* -127到128 */
iPos = 110;
- else if (IsInBox (event->xbutton.x, event->xbutton.y, iPos + 11, 1, iPos + 30, 19))
- SwitchVK ();
- else if (IsInBox (event->xbutton.x, event->xbutton.y, iPos + 31, 1, MAINWND_WIDTH, 19))
- SwitchIM (-1);
+ else {
+ if (bShowVK || !bCompactMainWindow) {
+ if (IsInBox (event->xbutton.x, event->xbutton.y, iPos + 11, 1, iPos + 30, 19))
+ SwitchVK ();
+ iPos += 20;
+ }
+ if (IsInBox (event->xbutton.x, event->xbutton.y, iPos + 11, 1, MAINWND_WIDTH, 19))
+ SwitchIM (-1);
Bool IsInBox (int x0, int y0, int x1, int y1, int x2, int y2)
在FCITX3.2中因為是這樣調用iPos + 31,所以在調函數時,自動擴展成int,
所以不會出現越界。
而FCITX3.2.1中因為是這樣調用iPos += 20,所以此時iPos已經越界而變成
負數值,所以會在輸入法切換的box裏面。這樣在FCITX3.2.1中就出現了上面
的問題。我們只要將INT8 iPos改成INT32 iPos(或INT16 iPos)就解決了上
面的問題。
補丁如下:
--- fcitx-3.2.1/src/ui.c.orig 2006-06-24 19:09:53.000000000 +0800
+++ fcitx-3.2.1/src/ui.c 2006-06-26 10:47:55.000000000 +0800
@@ -336,7 +336,7 @@ void Draw3DEffect (Window window, int x,
*/
void MyXEventHandler (XEvent * event)
{
- INT8 iPos;
+ INT32 iPos;
switch (event->type) {
//added by yunfan 知其然亦知其所以然,向 wall_join 同志學習:P 牛人们。。能不能再做一个输出成big5编码的补丁?类似极点五笔中那样的功能? 谢谢~~
我已经将它加入了 :D
页:
[1]