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:
Tweet (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で未確定文字列を入力できなくなる、というバグが修正されています。