Bug-org 757688 Refactor KeyboardLayout
初回投稿日時: 2012年06月18日11時20分39秒
最終更新日時: 2012年06月18日11時20分57秒
カテゴリ: Mozilla Core Mozilla16 Windows バグ修正
SNS:
Tweet (list)
Windowsのキーイベントから、入力された文字を算出してデッドキーの入力処理や、ショートカットキーの入力処理に利用しているmozilla::widget::KeyboardLayout
のリファクタリングを行いました。
KeyboardLayout
はnsWindow
がWM_KEYDOWN
を受け取ったときに、KeyboardLayout::OnKeyDown()
が呼び出されることを前提に動作しています。このメソッド内で押されたキー、生成される文字列、デッドキーの状態を保存し、いくつかのメソッドがこの情報を外部(nsWindow
)に返すようになっています。
しかし、こんなstatefulなクラスは使いにくくて仕方がないので、DOM KeyboardEventの作業前に修正してしまいました。
まず、OnKeyDown()
はデッドキーの状態以外を保存しません。この状態のみ、statefulでしか効率的に管理できないので諦めました。その代わり、このデッドキーの状態は、OnKeyDown()
内でしか参照されず、他のメソッドは全てstatelessになりました。
現在のキーで入力される文字列は、OnKeyDown()
が戻り値として返すようになっています。これにより、最後のOnKeyDown()
が呼ばれた際の入力される文字列を返していたGetUniChars()
は廃止され、任意のモディファイアの状態を指定できていたGetUniCharsWithShiftState()
が、GetUniCharsAndModifiers()
に置き換えられ、より使いやすくなっています。
またさらに、このリファクタリングの副作用で、デッドキーも自動テストでテストできるようになっています。ただ、今までの自動テストはショートカットキー以外はあまり有用ではありませんでしたので、文字が入力される場合にはnsWindow::OnKeyDown()
内でKeyboardLayout::OnKeyDown()
の戻り値とAPIで指定された文字(疑似WM_CHAR
の内容)とを比較し、異なる場合にはデバッグビルドではそのままクラッシュするようにし、テストの信頼性を向上させています。キーボード周りをハックされる方は注意してください。