Bug-org 1199997 [TSF] Selected text isn't replaced with composition string when you use MS Pinyin, MS Wubi, MS Changjie and MS Quick on Win8.1 and Win10
初回投稿日時: 2015年09月17日21時16分44秒
カテゴリ: IME Mozilla Core Mozilla41 Mozilla42 Mozilla43 TSF Windows バグ修正
SNS:
Tweet (list)
TSFで、Win8.1やWin10に付属しているMS製のTIP、MS Pinyin、MS Wubi、MS Changjie、MS Quickでは、未確定文字列を入力しても、選択文字列が置換されず、選択範囲の先頭に未確定文字列が挿入されるというバグです。
TSFTextStore
のログを見ると、これらのTIPでは未確定文字列の入力開始時にITextStoreACP::QueryInsert()
が呼び出され、その返り値が未確定文字列が置き換える範囲となってITfContextOwnerCompositionSink::OnStartComposition()
が呼び出されていました(元に、QueryInsert()
の返り値を選択範囲そのままで返すと正しく置換されました)。
GeckoのQueryInsert()
の戻り値もちょっとおかしいのですが、その値が未確定文字列の置き換え範囲として利用されるのはこのケースでは明らかにおかしいので、TIPから利用しているカウンターパートを探してみたところ、ITfRange::AdjustForInsert()
の呼び出し時に呼び出されてそうです。このドキュメントによると、
This method should be used to prepare a range to initiate a new composition, before editing begins. It should be used only when the text is not inserted at the current selection.
とあります。そこで、中国語のTIPのバグだと断定し、ハックを入れることで対処することにしました。
入れたハックはややリスキーなもので、QueryInsert()
の戻り値をこれらのTIPがアクティブな時に書き換えるというものです。本当はOnStartComposition()
の方で読み替えて対応したかったんですが、それを行うと、続いて呼び出される様々なメソッド全てにハックが必要で不可能に近いことに思えたので、このようにしています。
TSF対応最初のバージョンである41にも修正を入れています。