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

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

もずはっく日記(2012年2月)

2012年2月10日

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: (list)

古いIMEのコードの整理第一弾です。WM_IME_COMPOSITIONlParamMSDNのドキュメントには、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_COMPATTRGCS_COMPCLAUSEGCS_COMPSTRGCS_CURSORPOSが含まれておらず、未確定文字列の「変化」ではなく、「結果」を元にフラグが設定されている印象です。

別のハックがあるおかげで、単純に何もしないようにしてしまっても問題はないのですが、より好ましい形に修正しています。

lParamに未確定文字列の変化を示すフラグが含まれていなくても、最新の未確定文字列を取得し、その最新情報に基づいた内容をエディタに通知するようにしました。

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

bug-org 713628を含むエントリ