Bug-org 807241 [TSF] Should use ITfMessagePump and ITfKeystrokeMgr
初回投稿日時: 2013年03月27日19時49分24秒
カテゴリ: Mozilla Core Mozilla22 TSF Windows バグ修正
SNS:
Tweet (list)
WindowsのIMEのAPIセットが、IMMからTSFへの移行するにあたり、TSFにネイティブ対応していないアプリのために、IMM-TSFのエミュレーション機能である、CUASと呼ばれるシステムが、通常のアプリの場合は動作しています。これは、メッセージをフックし、様々な処理を自動で行い、必要があればIMMのメッセージを発行したりしています。
ITfMessagePump
は、PeekMessageW()
メソッドを持っていて、これを利用すると、通常のPeekMessageW()
よりは生のメッセージキューからメッセージを取得し、処理を行うことができます。
TSF対応アプリが、従来からあるPeekMessageW()
APIを利用してメッセージを取得した際に、CUASが先にメッセージをTSFに渡してしまい、もし、キーイベントが処理されてしまった場合、アプリはキーイベントの発生自体が分からなくなっていることに、テスト中に気付きました。
これでは、D3Eの仕様書で定義されている、keydown
イベントと、keyup
イベントを、未確定文字列がある場合でも発行する、という仕様に従うことができないので、その準備として今回の修正を行いました。
これにより、TSFモードの場合、PeekMessageW()
の呼び出しが、virtual callになってしまうので、かなりパフォーマンスが悪くなっているのではないかと思われます。色々と検討してみたんですが、virtual callを阻止して、直接実装されているメソッドを呼び出す方法が思いつきませんでしたので、今のところ、必要悪なパフォーマンス低下になっています(IMMモードでは、従来通り、CのPeekMessageW()
を呼び出すので、パフォーマンスに変化はありません)。
また、この修正により、CUASが自動でキーイベントをTSFに渡してくれなくなりますので、ITfKeystrokeMgr
を利用して、nsTextStore
自身がTSFにキーイベントを通知するように修正しています。