星期一, 3月 21, 2011

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 的方式載入,這樣也對,可以省掉一開始不必要的配置。

沒有留言: