この日記はMozillaのプロダクトへの貢献者としての私の成果を中心に、気になったバグやWeb界隈の話題について書いていますが、 断り書きがある場合を除き、いかなる団体のオフィシャルな見解ではありません。あくまでも個人的なものです。 Mozilla Foundation、Mozilla Corporation、及び関連企業の公式情報ではないことに注意してください。

現在、XHTML 1.0 (もどき)から、HTML5なコンテンツに修正中です。古い日記は修正が完了していませんので表示が崩れます。 順次、修正していく予定ですのでしばらくお待ちください。

もずはっく日記(2009年10月)

2009年10月2日

Bug-org 513952 Refactor nsTSMManager
初回投稿日時: 2009年10月02日00時39分51秒
最終更新日時: 2009年10月02日00時45分10秒
カテゴリ: Mozilla Core バグ修正
SNS: (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を利用しないことはそうそう無いと思いますので、あまり問題ないかとは思いますが、もし発生すれば混乱を与えかねない動作だとは思います。

関連するかもしれないエントリ

bug-org 513952を含むエントリ