gcin筆記(2)

看了 gcin 的程式,覺得頗亂,命名跟檔名是有其規則,例如 pp 是指詞音、pho 是注音、gtab 是亂倉打鳥、倉頡…等,不過,對於要新增輸入法,並沒有 interface讓人知道說該實作些什麼。看到這裡有點想放棄了說~
連線的部份是 socket,但 event 的處理則是用 glib 的 io_channel (g_io_add_watch)。
當 client 第一次跟 server 建立連線,是在 cb_new_gcin_clients(),gcin_clients 在 cb_new_gcin_client() 被配置出來,這邊是在超過預先配置好的 gcin_clients 的時候,才以 trealloc() 去重配置。在一開始如果有太頻繁的client過來(仔細想想,好像不太可能),每次都重新配置,是不太有利的。但是如果改用 g_list 或 g_array 來做,感覺上又不是很划算。
server 收到 client request 的點是在 im-srv.cpp 裡的 cb_read_gcin_client(),裏面會去執行 process_client_req()。process_client_req() 在 im-dispatch.cpp 裡,拿到 fd,直接用之前在 cb_new_gcin_client() 預配置的陣列 gcin_clients 去做判斷、處理。裏面會根據 req_no 再去看要呼叫 ProcessKeyPress()/ProcessKeyRelease()…等函數 (在 eve.cpp 裡)。
參考 anthy 日文輸入法,好像比較好,因為同樣也是外部的library
下面是掃過 eve.cpp 以後,得到的一些東西:

  • feedkey_anthy()
  • feedkey_anthy_release()
  • hide_win_anthy()
  • show_win_anthy() => init_in_method() 會用到
  • move_win_anthy()
  • get_win_anthy_geom()
  • anthy_visible() => 給 win_is_visible() 用
  • init_win_anthy() => init_in_method() 會用到
  • anthy_get_preedit()
  • gcin_anthy_reset() => 給 gcin_reset() 用
  • flush_anthy_input => 給 flush_edit_buffer 用

看起來是要實作這些部份。
init_win_anthy(): anthy 是用 dlopen 的方式載入,這樣也對,可以省掉一開始不必要的配置。

gcin筆記

gcin輸入法以 INMD 定義,在 gtab-list.cpp 裡載入,從 gtab.list 載入,裏面決定了檔名、方法…
如果要加新酷音,

  • 在 method_codes[] 裡增加一個項目, !CHEWING
  • gtab.list 裡增加一個新的項目,新酷音 ] !CHEWING chewing.png
  • MAX_GTAB_NUM_KEY 也要再加1
  • load_gtab_list 一開頭把 method_type 寫死了,所以這邊也要加,inmd[16].method_type=method_type_CHEWING
  • 加 method_type_CHEWING

以上從 gcin-setup.cpp 的 cb_default_input_method() 開始追
callback 裡呼叫了 create_gtablist_window(),然後再呼叫 create_model()。從裏面的 add_items() 再看到 load_gtab_list() 而推導的。
從 GtkIMContextClass 的 filter_keypress 開始看: gtk_im_context_gcin_filter_keypress
大致上的架構是這樣子:
gtk_im_context -> gcin client <-> gcin server
eve.cpp 裡的 ProcessKeyPress 是處理 Key 的部份,所以這邊可以看到輸入法的切換、暫時切換為英文、選phrase…等等的處理。

好久沒用Vimana之gundo

因為看到了Gundo.vim,就想說來試用看看。
要安裝 vim 插件,當然就是用 vimana,於是就更新許久未用的vimana。依照vimana的readme,以cpanm來進行重安裝。但是卻無法安裝,cpanm告訴我有 “Can’t locate inc/Module/Install.pm”
太鳥了,去年有碰到此問題,但沒解決,果然有報應,該找出原因的還是該找出來,否則以後一直會遇到。亂找了一下,發現要安裝 libmodule-install-perl 才行,於是就立馬執行了 sudo apt-get install libmodule-install-perl。
接著再來安裝,是說,不知道為什麼,會有Test fail的情況,所以就省略掉測試,改用 cpanm –sudo –reinstall -n “Vimana的目錄” 這樣就大功告成了。

sis162u與ndiswrapper

原本以為linux的硬體相容性很高,至少好幾年前買的Asus USB無線網卡應該是要可以用的,結果,並不是我想的。不支援,就是不支援。
還好知道這支無線網卡的晶片是SiS162U,就上網Google了一下,發現大家都是用ndiswrapper來裝上Windows的驅動程式,然後讓它運作。
我裝的是ndisgtk這個GUI程式,安裝以後,執行ndisgtk,然後安裝sis162的windows驅動程式,就…大功告成了嗎?
不是,因為我用的sis162 windows驅動程式不知道有問題還是太舊,查了好久,後來我是去SiS官方網站抓了最新的105版的驅動程式下來裝,就沒問題了!!
所以碰到只有Windows驅動程式而Linux不支援的時候,可以用ndiswrapper + ndisgtk 試試看,也許就起死回生。

libchewing小記

libchewing的用法挺簡單的,我是先試 python 目錄下的範例,可是即便我把 Init() 裡的目錄改成對的了,還是不行。這邊要傳進去的目錄,要用 libchewing3-data 的安裝路徑,否則Init會出錯。
對照 test/testchewing.c 裡的程式以後,發現沒什麼太大的不同,可是就是不行,反正以後沒有要用 python 來寫,所以就算了。
最後是對照 test/testchewing.c 去寫一個小的程式,就可以運作了,test/testchewing.c 是一個很好的進入點。

讀Debian新維護人員手冊

Debian新維護人員手冊記下的:

  • 比較版本:dpkg –compare-versions ver1 op ver2
  • 添加環境變數到 .bashrc 以供識別:
    DEBEMAIL=your.email.address@example.org
    DEBFULLNAME="Firstname Lastname"
  • dh_make 可以快速的從一個 tarball 產生出 tarball 副本跟 debian 目錄,如:dh_make -f ../gentoo-0.9.12.tar.gz
  • control裡的內容,如分類、權重…等可參考 Debian Policy Manual
  • 可以用 dpkg-depcheck -d ./configure去檢查相依性,或者用 objdump -p foo | grep NEEDED 去看用了哪些 library
  • changelog 可以參考Debian Policy Manual, 4.4,是主要定版號的地方。
  • rules 可以用 fakeroot debian/rules target 來執行裏面的特定 target
  • 可以用 debuild 來自動化,在 .devscripts 裡添加
    • DEBSIGN_KEYID=”keyID”
    • DEBUILD_LINTIAN=yes
    • DEBUILD_LINTIAN_OPTS=”-i -I –show-overrides”

    ,然後 debuild -sa、debuild clean

  • 檢查套件:
    • debi xxxx_i386.changes
    • lintian -i -I –show-overrides xxx_i386.changes

AlbiteReader後續修正

J2ME裡的英文字型寬度不是固定的,所以顯示英文字的時候會怪怪的。利用 HashTable 去存英文字的寬度,至於中文字型還是固定,這樣英文顯示就比較漂亮一點了。
大致上就這樣,更新以後的檔案放在同一個地方,需要的人自己下載。
另記用 Sigil 的心得,儘量使用 p、blockquote 來做編排,段落的呈獻會比較漂亮,避免使用 br 來做斷行。簡單說,大致的編排就是儘量使用 html 搭配 css,而不要用硬幹的方式。