Bug-org 713628 [IMM] Do nothing if composition string isn't changed even when WM_IME_COMPOSITION is received
初回投稿日時: 2012年02月10日12時38分08秒
カテゴリ: Mozilla Core Mozilla13 バグ修正
SNS:
Tweet (list)
古いIMEのコードの整理第一弾です。WM_IME_COMPOSITION
のlParam
はMSDNのドキュメントには、Value specifying how the composition string or character changed.
と書かれています。つまり、そのWM_IME_COMPOSITION
で何が変化したのかを示すビットマスクなのですが、そのlParam
が、「確定」も「未確定文字列の変化」も示さない場合にエディタ上の未確定文字列を削除してしまうという奇妙なコードがありました。
MSDNの仕様からすると、特異なケースにも関わらず、特にコメントも無いので何もしないようにすれば良いかと思いましたが、えむけいさんのレビューに基づいて調査してみると、日本語のIMEは少し奇妙な動作をしていました。
Windows 7では、IMMはOSにエミュレートされていますので、Windows 7自身が昔のIMEの動作を互換性のためにそのまま真似ているのだと思われますが、日本語のIMEでは、未確定文字列が空になった時、例えばBackspaceキーで未確定文字列を全部削除した時に、WM_IME_COMPOSITION
が送信され、lParam
にはGCS_COMPATTR
、GCS_COMPCLAUSE
、GCS_COMPSTR
、GCS_CURSORPOS
が含まれておらず、未確定文字列の「変化」ではなく、「結果」を元にフラグが設定されている印象です。
別のハックがあるおかげで、単純に何もしないようにしてしまっても問題はないのですが、より好ましい形に修正しています。
lParam
に未確定文字列の変化を示すフラグが含まれていなくても、最新の未確定文字列を取得し、その最新情報に基づいた内容をエディタに通知するようにしました。