gcin-1.5.1 套件實例

  1. gcin 套件不是 RHEL/CentOS 內建的輸入法,安裝後有 bug 無法使用,必須修改設定。與其安裝完再修改設定,不如直接修改 RPM 套件。gcin-2.7.1 在 glibc-2.12 環境、locale 使用 en_US.UTF-8 可以執行,但使用 zh_TW.UTF-8 中文桌面卻無法執行,會彈出 "Unknown file type" 視窗。因此,還是使用 gcin-1.5.1,只是無法支援陸生習慣的輸入法。
  2. 下載 SRPM 套件
    [dywang@dywH ~]$ cd rpmbuild
    [dywang@dywH rpmbuild]$ wget ftp://mirror.switch.ch/pool/1/mirror/epel/beta/6/SRPMS/gcin-1.5.1-1.el6.src.rpm
    

  3. 安裝 SRPM 套件
    [dywang@dywH rpmbuild]$ rpm -ivh gcin-1.5.1-1.el6.src.rpm
    

  4. 至原始碼目錄中查看檔案。
    [dywang@dywH rpmbuild]$ cd SOURCE
    [dywang@dywH SOURCES]$ ll
    total 4408
    -rw-r--r--. 1 mockbuild mockbuild     748 May  5  2010 configure.patch
    -rw-r--r--. 1 mockbuild mockbuild     709 Oct 21  2008 gcin-1.4.2-gtk-immodules-lang.patch
    -rw-rw-r--. 1 mockbuild mockbuild 2827298 Jun 23  2010 gcin-1.5.1.tar.bz2
    -rw-r--r--. 1 mockbuild mockbuild     179 Nov 24  2009 gcin.conf
    -rw-r--r--. 1 mockbuild mockbuild     888 Jan  5  2010 gcin_gtab.patch
    -rw-r--r--. 1 mockbuild mockbuild   20290 Sep  8  2006 gcinicon.tgz
    -rw-r--r--. 1 mockbuild mockbuild    5833 Jul  8  2010 gtk-deprecated.patch
    -rw-r--r--. 1 mockbuild mockbuild    5584 Jul  8  2010 im-client.patch
    -rw-r--r--. 1 mockbuild mockbuild 1621854 Apr 17  2007 NewCJ3.cin
    -rw-r--r--. 1 mockbuild mockbuild     533 Feb  4  2009 newcj3.patch
    -rw-r--r--. 1 mockbuild mockbuild    1644 Jul  8  2010 qt.patch
    

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

  6. 至 gcin-1.5.1 目錄,修改原始碼。
    [dywang@dywH SOURCES]$ cd gcin-1.5.1
    [dywang@dywH gcin-1.5.1]$ ls
    about.cpp             gtab.cpp            scripts
    anthy.cpp             gtab-dbg.cpp        setup-rpm
    a.txt                 gtab.h              sim2trad.cpp
    ..........
    gcin-endian.h         juyin-learn.cpp     tslearn.cpp
    gcin-exec-script.cpp  kbmcv.cpp           tutf8
    gcin_filter           locale.cpp          tval
    gcin-gb-toggle.cpp    Makefile            txim
    gcin.h                man                 unix-exec.cpp
    gcin-icon.cpp         menu                util.cpp
    gcin-kbm-toggle.cpp   mitem.h             VERSION.gcin
    gcin-message.cpp      os-dep.h            win0.cpp
    ..........
    
  7. 修改 gcin.spec 規格檔版本宣告,版本加入 dyw。
    [dywang@dywH SOURCES]$ diff -uN ../tmp/gcin.spec ../SPECS/gcin.spec 
    --- ../tmp/gcin.spec	2010-07-08 16:49:35.000000000 +0800
    +++ ../SPECS/gcin.spec	2015-09-07 07:07:32.505233444 +0800
    @@ -1,6 +1,6 @@
     Name:           gcin
     Version:        1.5.1
    -Release:        1%{?dist}
    +Release:        1%{?dist}.dyw
     Summary:        Input method for Traditional Chinese
     
     Group:          System Environment/Libraries
    
  8. 修改 gcin.spec 規格檔在章節 %post gtk2 加入修改腳本,主要目的為解決 gcin 非 RHEL/CentOS 預設輸入法造成的問題,修改檔案 redhat-linux-gnu 為 unknown-linux-gnu,可以在不知系統版本下都使用 gcin。
    @@ -76,6 +76,28 @@
     
     %post
     /sbin/ldconfig
    +# For upgrades, the cache will be regenerated by the new package's %%postun
    +mkdir /etc/gtk-2.0/%{_arch}-unknown-linux-gnu 2>/dev/null
    +file="/etc/gtk-2.0/%{_arch}-unknown-linux-gnu/gtk.immodules"
    +gtk-query-immodules-2.0-%{__isa_bits} > $file || :
    +if ! grep -q "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
    +sed -i 's/^\(XIM_ARGS=\"\).*$/\1LC_CTYPE=zh_TW.UTF-8 -x gcin\"/' $gf
    
    +gtk-query-immodules-2.0-%{__isa_bits} --update-cache
     %{_bindir}/update-gtk-immodules %{_host} >/dev/null 2>&1 || :
     update-desktop-database %{_datadir}/applications >/dev/null 2>&1 || :
       %{_sbindir}/alternatives --install %{_sysconfdir}/X11/xinit/xinputrc \
    xinputrc %{_sysconfdir}/X11/xinit/xinput.d/gcin.conf 40
    
  9. gcin 設定程式預設字型過大,修改字型大小為 11。
    [dywang@dywH SOURCES]$ diff -uN ../tmp/gcin-1.5.1/gcin-settings.cpp gcin-1.5.1/gcin-settings.cpp
    --- ../tmp/gcin-1.5.1/gcin-settings.cpp	2010-06-19 13:54:02.000000000 +0800
    +++ gcin-1.5.1/gcin-settings.cpp	2015-09-07 08:59:30.875230520 +0800
    @@ -63,17 +63,17 @@
     
     void load_setttings()
     {
    -  gcin_font_size = get_gcin_conf_int(GCIN_FONT_SIZE, 16);
    +  gcin_font_size = get_gcin_conf_int(GCIN_FONT_SIZE, 11);
     #if UNIX
       get_gcin_conf_str(GCIN_FONT_NAME, &gcin_font_name, "sans");
     #else
       get_gcin_conf_str(GCIN_FONT_NAME, &gcin_font_name, "MingLiU");
     #endif
    -  gcin_font_size_tsin_presel = get_gcin_conf_int(GCIN_FONT_SIZE_TSIN_PRESEL, 16);
    -  gcin_font_size_symbol = get_gcin_conf_int(GCIN_FONT_SIZE_SYMBOL, 12);
    +  gcin_font_size_tsin_presel = get_gcin_conf_int(GCIN_FONT_SIZE_TSIN_PRESEL, 11);
    +  gcin_font_size_symbol = get_gcin_conf_int(GCIN_FONT_SIZE_SYMBOL, 11);
       gcin_font_size_tsin_pho_in = get_gcin_conf_int(GCIN_FONT_SIZE_TSIN_PHO_IN, 10);
       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, 11);
       gcin_input_style = get_gcin_conf_int(GCIN_INPUT_STYLE, InputStyleOverSpot);
       gcin_root_x = get_gcin_conf_int(GCIN_ROOT_X, 2000);
       gcin_root_y = get_gcin_conf_int(GCIN_ROOT_Y, 2000);
    
  10. gcin 程式每種輸入法皆以 2 的次方的數值代表,詳細內容可 man gcin-setup 查看手冊。所有輸入法都使用的數字為 2147483647,要取消某種輸入法只要將其數字扣除即可。舉例:設定預設只有「倉頡五2」、「注音3」、「詞音6」、「簡易11」「亂倉打鳥16」等五種輸入法,總數扣除其數字後為 2147420235,此數字以 16 進位表示為 7FFF084B。
    [root@dywH ~]# echo '2147483647-\
    2^0-2^1-2^4-2^5-2^7-2^8-2^9-2^10-2^12-2^13-2^14-2^15' | bc
    2147420236
    [root@dywH ~]# echo 'obase=16; 2147483647-\
    2^0-2^1-2^4-2^5-2^7-2^8-2^9-2^10-2^12-2^13-2^14-2^15' | bc
    7FFF084C
    [root@dywH ~]#
    
  11. gcin 循環鍵選擇輸入法預設所有輸入法,但有很多輸入法很少用,所以設定預設只有「倉頡五2」、「注音3」、「詞音6」、「簡易11」「亂倉打鳥16」等五種輸入法。
    @@ -86,12 +86,12 @@
       gcin_init_im_enabled = true;
     #endif
     
    -  gcin_flags_im_enabled = get_gcin_conf_int(GCIN_FLAGS_IM_ENABLED,0x7fffffff);
    +  gcin_flags_im_enabled = get_gcin_conf_int(GCIN_FLAGS_IM_ENABLED,0x7FFF084C);
       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);
    
  12. 第一次內定設定使用「倉頡五2」。
    -  default_input_method = get_gcin_conf_int(DEFAULT_INPUT_METHOD, 6);
    +  default_input_method = get_gcin_conf_int(DEFAULT_INPUT_METHOD, 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
    
  13. gcin 「由詞庫自動選字」會造成有多頁符合字無法使用空白鍵換頁。尤其使用「簡易輸入法」的情境,往往是在無法完整輸入倉頡碼時使用,只輸入字型的倉頡前後兩個碼符合的字可能好幾頁,若無法換頁會很困擾,所以將「自動」改為「關閉」。
    @@ -106,7 +106,7 @@
     
       gtab_dup_select_bell = get_gcin_conf_int(GTAB_DUP_SELECT_BELL, 0);
       gtab_space_auto_first = get_gcin_conf_int(GTAB_SPACE_AUTO_FIRST, GTAB_space_auto_first_none);
    -  gtab_auto_select_by_phrase = get_gcin_conf_int(GTAB_AUTO_SELECT_BY_PHRASE, GTAB_AUTO_SELECT_BY_PHRASE_AUTO);
    +  gtab_auto_select_by_phrase = get_gcin_conf_int(GTAB_AUTO_SELECT_BY_PHRASE, GTAB_AUTO_SELECT_BY_PHRASE_NO);
       gtab_pre_select = get_gcin_conf_int(GTAB_PRE_SELECT, 1);
       gtab_press_full_auto_send = get_gcin_conf_int(GTAB_PRESS_FULL_AUTO_SEND, 1);
       gtab_disp_partial_match = get_gcin_conf_int(GTAB_DISP_PARTIAL_MATCH, 1);
    
  14. 預設輸入選單「垂直顯示」。
    @@ -117,7 +117,7 @@
       gtab_hide_row2 = get_gcin_conf_int(GTAB_HIDE_ROW2, 0);
       gtab_in_row1 = get_gcin_conf_int(GTAB_IN_ROW1, 0);
       gtab_capslock_in_eng = get_gcin_conf_int(GTAB_CAPSLOCK_IN_ENG, 1);
    -  gtab_vertical_select = get_gcin_conf_int(GTAB_VERTICAL_SELECT, 0);
    +  gtab_vertical_select = get_gcin_conf_int(GTAB_VERTICAL_SELECT, 1);
       gtab_unique_auto_send = get_gcin_conf_int(GTAB_UNIQUE_AUTO_SEND, 0);
       gtab_que_wild_card = get_gcin_conf_int(GTAB_QUE_WILD_CARD, 0);
    
  15. 修改原始碼後,要重新打包壓縮
    [dywang@dywH SOURCES]$ tar jcvf gcin-1.5.1.tar.bz2 gcin-1.5.1
    
  16. 重新建立 RPM 二進位檔
    [dywang@dywH SOURCES]$ rpmbuild -ba --clean --target=$(uname -m) ../SPECS/gcin.spec
    Building target platforms: x86_64
    Building for target x86_64
    error: Failed build dependencies:
    	qt3-devel is needed by gcin-1.5.1-1.el6.dyw.x86_64
    	libXtst-devel is needed by gcin-1.5.1-1.el6.dyw.x86_64
    	anthy-devel is needed by gcin-1.5.1-1.el6.dyw.x86_64
    

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

  18. 再重新建立 RPM 二進位檔,選項 -bb 只產生 RPM 檔,不產生 SRPM 檔。
    [dywang@dywH SOURCES]$ rpmbuild -bb --target=$(uname -m) ../SPECS/gcin.spec
    

  19. 查看產生的 RPM 及 SRPM 檔。
    [dywang@dywH SOURCES]$ ll ../RPMS/x86_64/
    total 3592
    -rw-r--r--. 1 dywang dywang 3676583 Jul 31 10:44 gcin-1.5.1-1.el6.dyw.x86_64.rpm
    [dywang@dywH SOURCES]$ ll ../SRPMS/x86_64/
    ls: cannot access ../SRPMS/x86_64/: No such file or directory
    

  20. 建立 RPM 及 SRPM 二進位檔
    [dywang@dywH SOURCES]$ rpmbuild -bs --target=$(uname -m) ../SPECS/gcin.spec
    Building target platforms: x86_64
    Building for target x86_64
    Wrote: /root/rpmbuild/SRPMS/gcin-1.5.1-1.el6.dyw.src.rpm
    [dywang@dywH SOURCES]$ ll ../SRPMS/
    total 3564
    -rw-r--r--. 1 dywang dywang 3648959 Jul 31 10:50 gcin-1.5.1-1.el6.dyw.src.rpm
    

  21. 同時建立 RPM 及 SRPM 二進位檔
    [dywang@dywH SOURCES]$ rpmbuild -ba --clean --target=$(uname -m) ../SPECS/gcin.spec