gcin-2.7.4 套件實例

  1. gcin-1.5.1 版詞音輸入法中的拼音,只有「聲調拼音」,沒有不含聲調的拼音。升級至 2.7.2 版有「無聲調拼音」,但安裝完後仍然需要修改設定,所以,修改 gcin rpm 安裝程序再重新建立 RPM 套件。
  2. 下載 SRPM 套件
    [dywang@dywH ~]$ cd rpmbuild
    [dywang@dywH rpmbuild]$ wget ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/\
    repositories/home%3A/swyear%3A/gcin-fedora/CentOS_CentOS-6/src/gcin-2.7.4-1.3.src.rpm 
    

  3. 安裝 SRPM 套件
    [dywang@dywH rpmbuild]$ rpm -ivh gcin-2.7.4-1.3.src.rpm
    
  4. 至原始碼目錄中查看檔案。
    [dywang@dywH rpmbuild]$ cd SOURCE
    [dywang@dywH SOURCES]$ ls gcin-2.*z
    gcin-2.7.4.tar.xz
    

  5. 解壓縮原始碼 tarball,產生 gcin-2.7.4 目錄,存放原始碼。
    [dywang@dywH SOURCES]$ tar xf gcin-2.7.4.tar.xz
    

  6. 至 gcin-2.7.4 目錄,查看檔案。
    [dywang@dywH SOURCES]$ cd gcin-2.7.4
    [dywang@dywH gcin-2.7.4]$ ls
    about.cpp              gtab-buf.h            qt-im
    a.txt                  gtab.cpp              README.html
    AUTHORS                gtab-dbg.cpp          regression.txt
    bak                    gtab.h                scripts
    cache.cpp              gtab-init.cpp         setup-rpm
    Changelog.html         gtab-list.cpp         sim2trad.cpp
    config.h               gtab-list.h           statistic.cpp
    configure              gtab-merge.cpp        suffixes-rule
    COPYING                gtab-phrase-db.h      t2s-file.h
    data                   gtab-tsin-fname.cpp   t2s-lookup.cpp
    eggtrayicon.cpp        gtab-use-count.cpp    table-update.cpp
    eggtrayicon.h          gtab-util.cpp         tchs
    eve.cpp                gtk3-im               tenv
    fullchar.cpp           gtk_bug_fix.c         tenvq
    gcb.cpp                gtk-im                tgdb
    gcin2tab.cpp           html-browser.cpp      tray.cpp
    gcin-common.cpp        IC.cpp                tray-win32.cpp
    gcin-conf.cpp          IC.h                  tsa2d32.cpp
    gcin-conf.h            icons                 tscr
    gcin.cpp               im-addr.cpp           tsd2a32.cpp
    gcin-crypt.cpp         im-client             ts-download.cpp
    gcin-endian.h          im-dispatch.cpp       ts-edit.cpp
    gcin-exec-script.cpp   IMdkit                tsin2gtab-phrase.cpp
    gcin-exit.cpp          im-srv.cpp            tsin-char.cpp
    gcin-fedora.spec       im-srv.h              tsin.cpp
    gcin-fedora.spec.in    juyin-learn.cpp       tsin.h
    gcin_filter            kbmcv.cpp             tsin-parse.cpp
    gcin-gb-toggle.cpp     lang.cpp              tsin-parse.h
    gcin-gtk-compatible.h  lang.h                tsin-scan.cpp
    gcin.h                 Licnese.txt           tsin-util.cpp
    gcin-icon.cpp          locale.cpp            tslearn.cpp
    gcin-kbm-toggle.cpp    Makefile              ts-share.h
    gcin-message.cpp       man                   ts-upload.cpp
    gcin-module-cb.cpp     menu                  tutf8
    gcin-module-cb.h       mitem.h               tval
    gcin-module.cpp        modules               txim
    gcin-module.h          os-dep.h              unix-exec.cpp
    gcin.png               pho2pinyin.cpp        util.cpp
    gcin-send.cpp          phoa2d.cpp            util.h
    gcin-settings.cpp      pho.cpp               VERSION.gcin
    gcin-setup.cpp         phod2a.cpp            win0.cpp
    gcin-setup-gtab.cpp    pho-dbg.cpp           win1.cpp
    gcin-setup-list.cpp    pho.h                 win1.h
    gcin-setup-pho.cpp     pho-kbm-name.cpp      win32-utf8-signature.txt
    gcin.spec.in           pho-kbm-name.h        win-gtab.cpp
    gcin-state.h           pho-lookup.cpp        win-inmd-switch.cpp
    gcin.test              pho-play.cpp          win-kbm.cpp
    gcin-version.h         pho-status.h          win-message.cpp
    gen-deb                pho-sym.cpp           win-pho.cpp
    gen-dist               pho-util.cpp          win-pho-near.cpp
    gen-fedora             phrase.cpp            win-save-phrase.cpp
    gen-unix               phrase-save-menu.cpp  win-save-phrase.h
    gen-win32              pin-juyin.cpp         win-sym.cpp
    gen-win32-tsin         pinyin.cpp            win-sym.h
    gst.h                  po
    gtab-buf.cpp           qt4-im
    

  7. 修改 RPM spec 規格檔,版本加入 dyw。DYW Linux 使用 gtk2 圖形界面,故只在章節 %post gtk2 加入修改腳本,並修改檔案 redhat-linux-gnu 為 unknown-linux-gnu。
    [dywang@dywH SOURCES]$ vim ../SPECS/gcin.spec 
    Release:        1.3.dyw
    
    .......
    %post gtk2
    if [ $1 -eq 1 ] ; then
        # For upgrades, the cache will be regenerated by the new package's %%postun
        file="/etc/gtk-2.0/%{_arch}-unknown-linux-gnu/gtk.immodules"
        gtk-query-immodules-2.0-%{__isa_bits} > $file || :
        if ! grep "im-gcin.so" $file; then
            echo "\"/usr/lib64/gtk-2.0/immodules/im-gcin.so\"" >> $file
            echo "\"gcin\" \"gcin Input Method\" \"gcin\" \"/usr/share/locale\" \"*\"" >> $file
        fi
        gd="/etc/X11/xinit/xinput.d"
        cd $gd
        gf="/etc/X11/xinit/xinput.d/gcin.conf"
        ln -sf $gd/gcin.conf /etc/alternatives/xinputrc
        [ ! -e none.conf.orig  -a ! -L none.conf ] && mv none.conf none.conf.orig
        ln -sf gcin.conf none.conf
        grep '^pkill gcin' /etc/gdm/PreSession/Default
        [ $? -ne 0 ] && echo 'pkill gcin' >> /etc/gdm/PreSession/Default
    
        sed -i 's/^\(XIM_ARGS=\"\)/\1C_CTYPE=zh_TW.UTF-8\ /' $gf
    fi
    .......
    %postun gtk2
    gtk-query-immodules-2.0-%{__isa_bits} > /etc/gtk-2.0/%{_arch}-unknown-linux-gnu/gtk.immodules || :
    .......
    
  8. 輸入法預設值修改,檔案在 gcin-settings.cpp。
    [dywang@dywH gcin-2.7.4]$ diff -uN ../gcin-2.7.4.orig/gcin-settings.cpp gcin-settings.cpp 
    --- ../gcin-2.7.4.orig/gcin-settings.cpp	2011-12-31 15:47:58.000000000 +0800
    +++ gcin-settings.cpp	2015-03-20 09:48:21.705148031 +0800
    @@ -71,17 +71,17 @@
    
  9. 部分顯示字型過大,都改為 12。
     void load_setttings()
     {
    -  gcin_font_size = get_gcin_conf_int(GCIN_FONT_SIZE, 16);
    +  gcin_font_size = get_gcin_conf_int(GCIN_FONT_SIZE, 12);
     #if UNIX || 1
       get_gcin_conf_str(GCIN_FONT_NAME, &gcin_font_name, "Sans");
     #else
       get_gcin_conf_str(GCIN_FONT_NAME, &gcin_font_name, "MingLiU Bold");
     #endif
    -  gcin_font_size_tsin_presel = get_gcin_conf_int(GCIN_FONT_SIZE_TSIN_PRESEL, 16);
    +  gcin_font_size_tsin_presel = get_gcin_conf_int(GCIN_FONT_SIZE_TSIN_PRESEL, 12);
       gcin_font_size_symbol = get_gcin_conf_int(GCIN_FONT_SIZE_SYMBOL, 12);
    -  gcin_font_size_tsin_pho_in = get_gcin_conf_int(GCIN_FONT_SIZE_TSIN_PHO_IN, 13);
    +  gcin_font_size_tsin_pho_in = get_gcin_conf_int(GCIN_FONT_SIZE_TSIN_PHO_IN, 12);
       gcin_font_size_gtab_in = get_gcin_conf_int(GCIN_FONT_SIZE_GTAB_IN, 10);
    -  gcin_font_size_pho_near = get_gcin_conf_int(GCIN_FONT_SIZE_PHO_NEAR, 14);
    +  gcin_font_size_pho_near = get_gcin_conf_int(GCIN_FONT_SIZE_PHO_NEAR, 12);
       gcin_font_size_win_kbm = get_gcin_conf_int(GCIN_FONT_SIZE_WIN_KBM, 10);
       gcin_font_size_win_kbm_en = get_gcin_conf_int(GCIN_FONT_SIZE_WIN_KBM_EN, 8);
       gcin_input_style = get_gcin_conf_int(GCIN_INPUT_STYLE, InputStyleOverSpot);
    
  10. 開啟應用程式預設使用中文輸入法,但在Linux上常用終端命令,開啟中文輸入會成困擾,所以取消預設啟動。
    @@ -92,7 +92,7 @@
       gcin_eng_phrase_enabled = get_gcin_conf_int(GCIN_ENG_PHRASE_ENABLED, 1);
       gcin_tray_hf_win_kbm = get_gcin_conf_int(GCIN_TRAY_HF_WIN_KBM, 0);
     #if UNIX
    -  gcin_init_im_enabled = get_gcin_conf_int(GCIN_INIT_IM_ENABLED, 1);
    +  gcin_init_im_enabled = get_gcin_conf_int(GCIN_INIT_IM_ENABLED, 0);
     #else
    
  11. gcin-2.7.4 所有輸入法列表,每行第一個欄位為「輸入法名稱」,第二位欄位為「代表符號」,第三欄位為「對應檔案」,第四欄位為「使用圖示」。注意「代表符號」對應到程式的撰寫及快速鍵。
    [dywang@dywH ~]$ cd rpmbuild/SOURCES/gcin-2.7.4
    [dywang@dywH gcin-2.7.4]$ cat data/gtab.list 
    EN e !EN gcin-tray.png
    
    #####符號輸出類#########
    # ↓↓↓ ~/.gcin/symbol-table
    符號表 4 !SYMBOL_TABLE symbol_table.png
    符號小鍵盤 , symbols.gtab symbols.png
    
    #####注音/拼音類#########
    注音 3 !PHO juyin.png
    詞音/拼音 6 !TSIN tsin.png
    !新酷音 [ chewing-module.so chewing.png
    #拼音 5 pinyin.gtab pinyin.png
    # gtab 拼音現在不用了,改用詞音的拼音
    
    #####倉頡類#########
    倉頡 1 cj.gtab cj.png
    #標點倉頡 4 cj-punc.gtab cj-punc.png
    倉五 2 cj5.gtab cj5.png
    亂倉打鳥 \ NewCJ3.gtab NewCJ3.png
    五四三倉頡 2 cj543.gtab cj543.png
    #五四三倉頡會由詞庫自動選字  http://hyperrate.com/thread.php?tid=12828
    速成/簡易 - simplex.gtab simplex.png
    標點簡易 - simplex-punc.gtab simplex-punc.png
    
    #####大易類#########
    大易 7 dayi3.gtab dayi3.png
    #大易 7 gdayi3.gtab dayi3.png
    
    #####行列類#########
    行列 8 ar30.gtab ar30.png
    行列大字集 8 ar30-big.gtab ar30-big.png
    行列33 8 ar33.gtab ar33.png
    行列符號 8 array-symbols.gtab array-symbols.png
    
    #####其他類#########
    嘸蝦米 9 noseeing.gtab noseeing.png
    帶調粵拼 ] jyutping.gtab jyutping.png
    內碼 0  intcode-module.so intcode.png
    #輕鬆 2 ez7.gtab
    
    #####外語類#########
    !日本anthy = anthy-module.so kana-nippon.png
    hangul / hangul.gtab hangul.png
    greek ` greek.gtab greek.png
    latin-letters [ latin-letters.gtab latin-letters.png
    En-words [ vocabulary.gtab vocabulary.png
    russian ? russian.gtab russian.png
    ### russian by yuriy
    
  12. 預設以 Ctrl-Shift 循環 啟動幾乎包含所有輸入法,其中 1 表示倉頡,2 表示倉五及,3 表示注音,如前述對應表。修改後僅保留 123678- 部分常用輸入法。
    @@ -101,12 +101,12 @@
       gcin_punc_auto_send = get_gcin_conf_int(GCIN_PUNC_AUTO_SEND, 1);
    -  get_gcin_conf_str(GCIN_STR_IM_CYCLE, &gcin_str_im_cycle, "1234567890-=[]\\");
    +  get_gcin_conf_str(GCIN_STR_IM_CYCLE, &gcin_str_im_cycle, "123678-");
       gcin_remote_client = get_gcin_conf_int(GCIN_REMOTE_CLIENT, 0);
       gcin_shift_space_eng_full = get_gcin_conf_int(GCIN_SHIFT_SPACE_ENG_FULL, 1);
       gcin_capslock_lower = get_gcin_conf_int(GCIN_CAPSLOCK_LOWER, 1);
    
  13. 修改以 Ctrl-Shift 循環 啟動第一次內定由詞音改為倉頡五輸入法。
    -  get_gcin_conf_str(DEFAULT_INPUT_METHOD, &default_input_method_str, "6");
    +  get_gcin_conf_str(DEFAULT_INPUT_METHOD, &default_input_method_str, "2");
       left_right_button_tips = get_gcin_conf_int(LEFT_RIGHT_BUTTON_TIPS, 1);
       gcin_im_toggle_keys = get_gcin_conf_int(GCIN_IM_TOGGLE_KEYS, 0);
     #if TRAY_ENABLED
    
  14. 外觀顯示預設「按鍵顯示於應用程式」,不但蓋住終端命令輸入,而且在未輸入完中文拼字時切換成「英文」,原未完成的拼字還顯示在螢幕上,造成相當大的困擾,故取消此設定。
    @@ -195,7 +195,7 @@
       gcin_edit_display = get_gcin_conf_int(GCIN_EDIT_DISPLAY, GCIN_EDIT_DISPLAY_OVER_THE_SPOT);
     #endif
     
    -  gcin_on_the_spot_key = get_gcin_conf_int(GCIN_ON_THE_SPOT_KEY, 1);
    +  gcin_on_the_spot_key = get_gcin_conf_int(GCIN_ON_THE_SPOT_KEY, 0);
       if (gcin_on_the_spot_key)
         gcin_edit_display = GCIN_EDIT_DISPLAY_ON_THE_SPOT;
    
  15. 詞音/拼音輸入鍵盤預設「標準」,如果預設提供陸生使用,鍵盤預設改為「拼音無聲調」,以滿足其需求。但此設定也會影響到「注音」的輸入,故不修改,僅提供修改參考。
    @@ -211,7 +211,7 @@
       else
     #endif
       {
    -    char *kbm_str = is_chs?"pinyin "N1234" 1 1":"zo "N1234" 1 1";
    +    char *kbm_str = is_chs?"pinyin "N1234" 1 1":"pinyin-no-tone "N1234" 1 1";
         get_gcin_conf_fstr(PHONETIC_KEYBOARD, phokbm, kbm_str);
       }
    

  16. 重新建立 RPM 二進位檔,出現需要相依開發套件。
    [dywang@dywH SOURCES]$ rpmbuild -bb --target=$(uname -m) ../SPECS/gcin.spec
    Building target platforms: x86_64
    Building for target x86_64
    error: Failed build dependencies:
    	qt-devel is needed by gcin-2.7.4-1.3.dyw.x86_64
    	gtk2-devel is needed by gcin-2.7.4-1.3.dyw.x86_64
    	libXtst-devel is needed by gcin-2.7.4-1.3.dyw.x86_64
    	anthy-devel is needed by gcin-2.7.4-1.3.dyw.x86_64
    

  17. 安裝 gcin 開發相依套件
    [dywang@dywH SOURCES]$ yum install qt-devel gtk2-devel libXtst-devel anthy-devel
    

  18. 同時建立 RPM 及 SRPM 二進位檔字,無法成功建立的訊息最後幾行如下,顯示函式 libgdk-x11-2.0.so 錯誤。
    ...................
    /usr/lib/gcc/x86_64-redhat-linux/4.4.4/../../../../lib64/libgdk-x11-2.0.so: undefined reference to `_XGetRequest'
    collect2: ld returned 1 exit status
    make: *** [gcin] Error 1
    error: Bad exit status from /var/tmp/rpm-tmp.AqAfaH (%build)
    
    
    RPM build errors:
        Bad exit status from /var/tmp/rpm-tmp.AqAfaH (%build)
    

  19. 以 ldd 命令測試錯誤的函式。
    [dywang@dywH SOURCES]$ ldd -r -d /usr/lib/gcc/x86_64-redhat-linux/4.4.4/../../../../lib64/libgdk-x11-2.0.so
    	linux-vdso.so.1 =>  (0x00007fffc15ec000)
    	libpangocairo-1.0.so.0 => /usr/lib64/libpangocairo-1.0.so.0 (0x00007fc680d91000)
    	libpango-1.0.so.0 => /usr/lib64/libpango-1.0.so.0 (0x00007fc680b45000)
    	libfontconfig.so.1 => /usr/lib64/libfontconfig.so.1 (0x00007fc68090f000)
    	libXext.so.6 => /usr/lib64/libXext.so.6 (0x00007fc6806fd000)
    	libXrender.so.1 => /usr/lib64/libXrender.so.1 (0x00007fc6804f3000)
    	libXinerama.so.1 => /usr/lib64/libXinerama.so.1 (0x00007fc6802f0000)
    	libXi.so.6 => /usr/lib64/libXi.so.6 (0x00007fc6800e1000)
    	libXrandr.so.2 => /usr/lib64/libXrandr.so.2 (0x00007fc67fed9000)
    	libXcursor.so.1 => /usr/lib64/libXcursor.so.1 (0x00007fc67fcce000)
    	libXcomposite.so.1 => /usr/lib64/libXcomposite.so.1 (0x00007fc67facc000)
    	libXdamage.so.1 => /usr/lib64/libXdamage.so.1 (0x00007fc67f8ca000)
    	libXfixes.so.3 => /usr/lib64/libXfixes.so.3 (0x00007fc67f6c4000)
    	libcairo.so.2 => /usr/lib64/libcairo.so.2 (0x00007fc67f44b000)
    	libX11.so.6 => /usr/lib64/libX11.so.6 (0x00007fc67f10c000)
    	libgdk_pixbuf-2.0.so.0 => /usr/lib64/libgdk_pixbuf-2.0.so.0 (0x00007fc67eeec000)
    	libgio-2.0.so.0 => /lib64/libgio-2.0.so.0 (0x00007fc67ebdb000)
    	libgobject-2.0.so.0 => /lib64/libgobject-2.0.so.0 (0x00007fc67e98f000)
    	libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00007fc67e689000)
    	libm.so.6 => /lib64/libm.so.6 (0x00007fc67e405000)
    	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc67e1e8000)
    	libc.so.6 => /lib64/libc.so.6 (0x00007fc67de54000)
    	libpangoft2-1.0.so.0 => /usr/lib64/libpangoft2-1.0.so.0 (0x00007fc67dc2a000)
    	libgmodule-2.0.so.0 => /lib64/libgmodule-2.0.so.0 (0x00007fc67da27000)
    	libfreetype.so.6 => /usr/lib64/libfreetype.so.6 (0x00007fc67d78a000)
    	libexpat.so.1 => /lib64/libexpat.so.1 (0x00007fc67d562000)
    	libpixman-1.so.0 => /usr/lib64/libpixman-1.so.0 (0x00007fc67d2d9000)
    	libpng12.so.0 => /usr/lib64/libpng12.so.0 (0x00007fc67d0b3000)
    	libz.so.1 => /lib64/libz.so.1 (0x00007fc67ce9d000)
    	libxcb.so.1 => /usr/lib64/libxcb.so.1 (0x00007fc67cc7e000)
    	libdl.so.2 => /lib64/libdl.so.2 (0x00007fc67ca7a000)
    	libgthread-2.0.so.0 => /lib64/libgthread-2.0.so.0 (0x00007fc67c876000)
    	librt.so.1 => /lib64/librt.so.1 (0x00007fc67c66d000)
    	libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fc67c453000)
    	libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fc67c234000)
    	/lib64/ld-linux-x86-64.so.2 (0x00000034dae00000)
    	libXau.so.6 => /usr/lib64/libXau.so.6 (0x00007fc67c030000)
    undefined symbol: _XGetRequest	(/usr/lib/gcc/x86_64-redhat-linux/4.4.4/../../../../lib64/libgdk-x11-2.0.so)
    

  20. 查詢函式屬於套件 gtk2-devel。
    [dywang@dywH SOURCES]$ rpm -qf /usr/lib64/libgdk-x11-2.0.so
    gtk2-devel-2.20.1-4.el6.x86_64
    

  21. 查詢 gtk2 相關套件,發現 gtk2-engines 套件與 gtk2 套件版本不同。
    [dywang@dywH SOURCES]$ rpm -qa | grep ^gtk2
    gtk2-2.20.1-4.el6.x86_64
    gtk2-devel-2.20.1-4.el6.x86_64
    gtk2-engines-2.18.4-5.el6.dyw.x86_64
    

  22. 因為 gtk2-engines 套件是作者重新建立的 RPM 套件,因此將 gtk2 及 gtk2-devel 降版本安裝回 2.18.4-5 版本。
    [dywang@dywH SOURCES]$ yum downgrade gtk2 gtk2-devel
    

  23. 再同時建立 RPM 及 SRPM 二進位檔字,成功建立的訊息最後幾行,看到產生 gcin-gtk2, gcin-qt4 gcin 三個 RPM 檔及一個 gcin SRPM 檔。
    [dywang@dywH SOURCES]$ rpmbuild -ba --clean --target=$(uname -m) ../SPECS/gcin.spec
    ...................
    Wrote: /root/rpmbuild/SRPMS/gcin-2.7.4-1.3.dyw.src.rpm
    Wrote: /root/rpmbuild/RPMS/x86_64/gcin-2.7.4-1.3.dyw.x86_64.rpm
    Wrote: /root/rpmbuild/RPMS/x86_64/gcin-gtk2-2.7.4-1.3.dyw.x86_64.rpm
    Wrote: /root/rpmbuild/RPMS/x86_64/gcin-qt4-2.7.4-1.3.dyw.x86_64.rpm
    Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.0MB2uA
    + umask 022
    + cd /home/dywang/rpmbuild/BUILD
    + cd gcin-2.7.4
    + /bin/rm -rf /home/dywang/rpmbuild/BUILDROOT/gcin-2.7.4-1.3.dyw.x86_64
    + exit 0
    
  24. 安裝 gcin 開發相依套件
    [dywang@dywH SOURCES]$ sudo cp ../RPMS/x86_64/gcin-* /var/ftp/pub/centos6/crtPackages
    
  25. 以 root 身份重新建立 repo 資料庫,repogroup.sh 為自行撰寫的腳本。
    [root@dywH Packages]$ repogroup.sh 
    1793/1793 - vartmp/openssl-1.0.0-27.el6.x86_64.rpm                              
    Saving Primary metadata
    Saving file lists metadata
    Saving other metadata
    Loaded plugins: fastestmirror, refresh-packagekit
    Cleaning up Everything
    Cleaning up list of fastest mirrors
    
  26. 重新安裝 gcin,因本系統使用 gtk2,故必須安裝 gcin-gtk2,yum 會自動將 gcin 也一起安裝起來。否則只安裝 gcin 套件,將無法工作。
    [dywang@dywH ~]$ sudo yum reinstall gcin-gtk2 gcin