ひさしぶりに Bug 5353 - [Mac][Cocoa] IME APIの実装 を進めようとソースをいじってみると、なんか動きがおかしい。cvs update -C して make してもまだおかしいので Bugzilla-jp に投げてみたら、 Bug 5375 - [Cocoa] フォームに日本語が入力できないを教えてもらった。
とりあえず NSInputManager#markedTextAbandoned: をコメントアウトすると、日本語が入力できないのは回避できるんだけど、これは回避であって解決じゃない。
NSInputManager#markedTextAbandoned: を呼んでいるのは nsChildView#ResetInputState, nsChildView#CancelIMEComposition で、この二つのメソッドが呼ばれること自体はおかしくないと思う。nsChildView#ResetInputState の中身がだめかというと、それもちがう。
試しに Xcode で NSView のサブクラスと NSTextField をならべて、NSView 側の mouseDown: を
NSInputManager* manager = [NSInputManager currentInputManager];
[manager unmarkText];
[manager markedTextAbandoned: self];
としてテストしてみると、ちゃんとうまくいくし、どちらかが欠けるとうまくいかない。nsChildView#ResetInputState がやっているのも同じ処理なので、これでおかしくなるほうが (つまり Mozilla の他の部分が) おかしいんだろうと思う。
いまの段階でわかっていること:
- 二カ所ある「// XXX maybe call markedTextSelectionChanged:client: here?」が怪しいけど、ちょっといじってみた分には変化なし
- 日本語入力中は ChildView#setMarkedText:selectedRange:
- 確定で ChildView#insertText:
- ChildView#sendTextEvent:attributedString:selectedRange:markedRange:doCommit: の doCommit は表示用のフラグ
Mozilla は make 時間が長過ぎてだるい。無駄に jar とか作り直している感じがするので、一回ビルドプロセスを洗ってさくさく開発できるようにしてから再開したほうが良いかもしれない。