Bug-org 513952 Refactor nsTSMManager
初回投稿日時: 2009年10月02日00時39分51秒
最終更新日時: 2009年10月02日00時45分10秒
カテゴリ: Mozilla Core バグ修正
SNS:
Tweet (list)
legacyなAPIを使いまくっていたnsTSMManagerでは64bit版をビルドできない、ということでCocoaのAPIと64bitでも利用可能なTSM APIを利用した新しい実装が必要、というバグです。ちなみにこのバグの修正でIMEの状態管理のコードを丸ごと書き換えたので、バグがあればbugzilla-jpにフィードバックをお願いします。
今回も[NSInputManager currentInputManager]
と、::TSMGetActiveDocument()
のふたつの変な仕様に苦しめられました。事実上、NSView
と1:1でIMEのコンテキストがあるくせに、フォーカスがあるときにしか、そのポインタを取得できなかったり、キャッシュしていても一部の機能が対応するNSView
にフォーカス無い時には機能しない、というへんてこ仕様のおかげで、(やろうとしていることからすると)非常に複雑な実装になっています。
今回の修正のキモはフォーカスが無いときに未確定文字列を確定しなくてはいけなくなった場合、Gecko内でのみ先に確定して、見た目の異常を消しておき、次にフォーカスを受け取った時に、実際にIMEの未確定文字列を破棄する、という処理順序にした点です。これを応用することで、パスワード入力欄がフォーカスを得た時にキーボードレイアウトを制限する処理も実現されています。
また、この修正で、ime-mode: active;
とime-mode: inactive;
の処理がよりWindowsの動作に近くなりました。
まず、ime-mode: inactive;
の場合、現在選択されているのがIMEのモードの場合、TIS APIから変更すべきASCII capableなキーボードレイアウトに変更するようになりました。これにより、どのキーボードレイアウトが選択されるかはOSに依存することになります(今までは直前に利用されたASCII capableなキーボードレイアウトが使われていました)。
ime-mode: active;
は少し複雑です。Firefoxが起動してから、キーボードレイアウトの選択を常に監視するようにしました。これにより、Firefoxが起動した後に、IMEを有効にした場合、そのIMEのモードを記憶します。これにより、最後に利用したIMEモードをオンにする、という動作が実現されています。
ですが、問題はIMEを一度も起動せずにime-mode: active;
なエディタにフォーカスをあわせた場合です。この時は、Mac OS Xの環境設定で選択された言語の優先順位に基づき、順に各言語を入力するためのキーボードレイアウトを取得します。どの言語でどのキーボードレイアウトが返されるのかはMac OS Xに依存します。そして、返されたキーボードレイアウトがIMEのオンの状態にあたるモードだった場合、そのモードを選択します。もし、それが見付からなければ何もしません。
この最後の動作にはひとつ難点があり、ことえり以外のIMEをインストールし、ことえりを利用可能なキーボードレイアウトから削除していない場合、ime-mode: active;
で意図しないモードが選択される可能性があります。私の環境では、常にことえりのlastname
というモードが返され、これを選択させると通常のひらがな入力になりました。常に、というのが問題で、ATOKの英数入力を選択していても、ことえりにスイッチされます。
悩ましい話ですが、ime-mode
自体がそれほど利用されていないというのと、普段のブラウジング中に、他のアプリケーションも含め、一度もIMEを利用しないことはそうそう無いと思いますので、あまり問題ないかとは思いますが、もし発生すれば混乱を与えかねない動作だとは思います。