Bug 6685 ロジクールのマウスでチルトホイールを傾けても一回しかスクロールしないことが多い #2
初回投稿日時: 2009年09月29日02時20分30秒
最終更新日時: 2009年09月29日02時25分04秒
カテゴリ: Mozilla Core バグ修正 バグ原因判明
SNS:
Tweet (list)
既にtrunkでは修正済みです。1.9.2 branchには直接の原因となった修正が今はまだチェックインされていないので、この修正もまだ入っていません。
原因の究明にはかなり時間がかかりましたが、ちゃんと理解できました。元々、ロジクールのマウスのドライバはGeckoに対してWM_MOUSEHWHEEL
を送信することで横スクロールという結果が発生している訳ではありませんでした。キャレットブラウジングモードに切り替えると分かるのですが、最初のWM_MOUSEHWHEEL
の処理時に::GetMessagePos
を一切利用せずに、常にゼロがセットされているlParam
を見て処理していました。このため、最初の::SendMessage
による反応テストの段階で失敗し、その後はWM_KEYDOWN
メッセージで矢印キーが押されたことにしてスクロールを実現していました(だからキャレットブラウジングモードだとスクロールせずにキャレットが動くのみ)。
ですがtrunkでは、::GetMessagePos
APIを利用するようになったことで、最初の::SendMessage
時にのみ正常なマウスカーソル位置が取得できてしまい、処理が成功したのを確認したロジクールのドライバが::PostMessage
でWM_MOUSEHWHEEL
を連射してくるものの、ここでは::GetMessagePos
APIの戻り値も壊れていて処理に失敗し続けている、というのがこのバグの真相でした。
私のパッチでは、lParam
値や、::GetMessagePos
APIの戻り値から、ロジクールのマウスであるかを推測し、そうであると判断した場合には::GetCursorPos
APIを利用するようにしています。もちろん、これらのAPIの違いの分、誤動作はあるかもしれませんが、よほど処理落ちした状況等以外で誤動作だと分かることもないのではないかと思います。