[Anthy-dev 2785] uim-xim

アーカイブの一覧に戻る

Masanari Yamamoto h0131****@ice*****
2005年 12月 31日 (土) 03:47:17 JST


山本です。

最近、gvimでuim-ximを使えるようにするにはどうすればいいのか調査してい
ます。

1 gvim-gtk2 + im-xim + uim-xim

set imactivatekey=
のようにimactivatekeyを空にしておけばとりあえず使えます。
ただし、ノーマルモードに移行しても自動的にdirect modeにはなりません。

set imactivatekey=s-space
の状態で、s-spaceを入力すると入力モードは切り替わりますが(anthyの場合
「あ」と表示される)、アルファベットしか入力できません。
s-spaceが入力されてIMがonになったとき、gvimはXIM_PREEDIT_STARTが送られ
ることを期待していますが、uim-ximの場合XIM_PREEDIT_STARTはプリエディッ
トが開始されたときに送られるため、gvimはIMがonになったことを認識しない
ためです。

set imactivatekey=x
imactivatekeyが空でないときに、C-^を入力するとgvimが固まり、uim-ximは
unknown type of forwarded event.(0)と出力します。
gvimはC-^が入力されるとimactivatekeyの値を
gtk_im_context_filter_keypressでimmoduleに送ります。この処理はmbyte.c
のim_synthesize_keypress内で行われますが、この中でevent->send_event = TRUE;
のようにsend_eventフラグをTRUEにしています。Xlibの実装がおかしいような
気がするのですが、send_eventがTRUEになっているとXIMサーバが受け取る
xEventのu.u.typeが0になってしまいます。そのため、uim-ximはどのイベント
が発生したのか分からないのです。


2 gvim-gtk1 + uim-xim

set imactivatekey=
imactivatekeyが空のときは、C-^が入力されるとgvimはXNPreeditStateを使っ
てIMのon/offを行います。uim-ximはXNPreeditStateに対応していないので、
C-^を入力したあとs-spaceを入力する必要があります。

set imactivatekey=x
imactivatekeyが空でないとき、C-^が入力されるとgvimはXSendEventを使って
imactivatekeyの値を自分に送ります(mbyte.cのim_xim_send_event_imactivate)。
この場合も上と同じようにunknown type of forwarded event.(0)と出力され
てgvimが固まります。


まとめとして、gvimでuim-ximを便利に使えるようにするためには、
XIM_PREEDIT_STARTとXIM_PREEDIT_DONEをIMのon/offに合わせて送る。
XNPreeditStateに対応する。
send_event = TRUEのときの対処
が必要です。

-- 
山本将也



Anthy-dev メーリングリストの案内
アーカイブの一覧に戻る