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の違いの分、誤動作はあるかもしれませんが、よほど処理落ちした状況等以外で誤動作だと分かることもないのではないかと思います。