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

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

もずはっく日記(2013年3月)

2013年3月28日

Bug-org 848672 [TSF] Redesign focus and IME state handling of nsTextStore
初回投稿日時: 2013年03月28日07時24分48秒
最終更新日時: 2013年03月28日09時14分59秒
カテゴリ: Mozilla Core Mozilla22 TSF Windows バグ修正
SNS: (list)

以前、widget::IMEHandlerを整備することで、IMMモードと、TSFモードのコードの完全分離を図りましたが、IMEの有効・無効状態が、nsTextStoreのコードでは不十分で、エディタにフォーカスが無い場合に無効化することができなかったので、IMMのコンテキストでの操作を続けていました。このバグの修正目標は、これをやめ、nsTextStoreのみで無効化できるようにするところにありました。

このバグの修正にあたっては、Chromiumのコードを参考にさせてもらったり、NyaRuRuさんの助言を参考にさせてもらったりと、地味ながら、エコシステム素晴らしい、みたいな修正になりました。

キーボード無効化のため、nsTextStoreのインスタンスが管理するITfDocumentMgr以外に、もうひとつ、別のITfDocumentMgrを作成し、これ用に作成したITfContextで、キーボードを無効化し、さらに、ITextStoreACPを実装しなくても良いように、空のコンテキストであると、マークし、このITfDocumentMgrが、エディタがフォーカスを持たない場合にフォーカスを持つように修正しました。

しかし、これだけでは、不十分で、不意にIMEが有効化されてしまう状況があることに気付きました。その時のログを読んでみると、nsIWidget::SetInputContext()が呼び出されて、IMEの状態は変更されるものの、nsIWidget::NotifyIME(NOTIFY_IME_OF_FOCUS)や、nsIWidget::NotifyIME(NOTIFY_IME_OF_BLUR)が呼び出されていない、という状況が確認できました。この際に、SetInputContext()は、FOCUS_NOT_CHANGEDで呼び出されていることが確認できましたので、その際には、SetInputContext()が、フォーカス移動をエミュレートするようにして解決しています。

また、エディタがフォーカスを持つ間だけ、ITfThreadMgr::AssociateFocus() APIで、フォーカスを持つウインドウハンドルをTSFに登録するようにしました。この修正により、入力している最中に、Firefoxのプロセスがビジー状態になった時に、フォーカスが一時的に失われ、その後、復帰した時に、on-the-spotで未確定文字列を入力できなくなる、というバグが修正されています。

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

bug-org 848672を含むエントリ