winformsの日本語入力サポートは大体できた
X11上のwinformsの日本語入力がそろそろ実用可能なものになるはず(僕のパッチが適用できれば完了)。とりあえず現在trunkに入っているコードの問題は:
- ほとんどのIMエンジンでそもそもUIが表示されない(scimだけ表示される。これはXRootWindowを使っているっぽい)。XCreateIC()で指定しているfocus windowがmapされていないとUIが表示されず、focus windowは入力専用ウィンドウなので基本的にmapされないというのが問題。これを解決するにはclientWindowごとにXICを作ることになる。
- preedit positionの座標がずれている。これはXSetICValues()に渡すXNSpotLocationの問題でもあり、XTranslateCoordinates()の使い方の問題でもある。XNSpotLocationの値は、XNFocusWindowが指定されている場合はfocus windowの座標としての、そうでなければclient windowの座標としての値になる。上記の通り、mapされていないfocus windowを指定しても意味がないので、focus windowにもclient windowを渡す…というより、そもそもXNFocusWindowを指定せずにclient windowの座標を渡すだけにするのが妥当だろう。
あと、preedit positionを有効化したことで表に出てきたwinforms本体の問題がいくつかあって、その辺はMLに投げた。
というわけで、その辺の問題を全部解決したパッチはこちら:
http://monoport.com/10999
firefoxやgtk-immoduleではon-the-spotモードが使えるけど、Windows Formsはover-the-spotで動いているし、めんどくさいのでパス。それよか次の作業をさせてもらいたいw
まあ、Mono 2.0にはなんとか間に合いそうで良かった。