wall_john 发表于 2006-6-24 01:37:34

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編碼是同樣的東東了:)

npcomet 发表于 2006-6-24 01:41:16

顶一个先

wall_john 发表于 2006-6-24 01:41:36

另外要感謝KanKer,關于無法輸出某些繁體字符問題上的幫忙和提示,

THANK V'MUCH

KDE 发表于 2006-6-24 11:10:27

非常感谢,如果你能参加进来,负责 magic 的繁体(正体)中文化,以及改进 magic,请和我联系,我们一直没有这方面的高手。可以用站内信件。也可以上 msn:jackliu9999 msn.com

KanKer 发表于 2006-6-24 12:47:00

用起來很爽,感謝 wall_join。打過該補丁的 fcitx 3.2.1 下載地址:
http://www.magiclinux.org/dev/2.0-update/RPMS/fcitx-3.2.1-3mgc.i686.rpm

MichaelBibby 发表于 2006-6-24 15:30:41

用起來很爽,感謝 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。。。

KanKer 发表于 2006-6-24 18:24:59

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。

wall_john 发表于 2006-6-24 20:52:08

關于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
見附件。

wall_john 发表于 2006-6-26 11:15:46

上面錯誤的真正原因,已找到,因為一個變量越界造成的。

先看代碼 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

KanKer 发表于 2006-6-26 12:45:54

知其然亦知其所以然,向 wall_join 同志學習:P

xlwcat 发表于 2006-6-26 14:13:58

牛人们。。能不能再做一个输出成big5编码的补丁?类似极点五笔中那样的功能?

Yuking 发表于 2006-6-26 22:41:30

谢谢~~
我已经将它加入了 :D
页: [1]
查看完整版本: FCITX輸入中文繁體字的補丁