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

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

もずはっく日記(2009年9月)

2009年9月29日

Bug 6685 ロジクールのマウスでチルトホイールを傾けても一回しかスクロールしないことが多い #2
初回投稿日時: 2009年09月29日02時20分30秒
最終更新日時: 2009年09月29日02時25分04秒
カテゴリ: Mozilla Core バグ修正 バグ原因判明
SNS: (list)

既にtrunkでは修正済みです。1.9.2 branchには直接の原因となった修正が今はまだチェックインされていないので、この修正もまだ入っていません。

原因の究明にはかなり時間がかかりましたが、ちゃんと理解できました。元々、ロジクールのマウスのドライバはGeckoに対してWM_MOUSEHWHEELを送信することで横スクロールという結果が発生している訳ではありませんでした。キャレットブラウジングモードに切り替えると分かるのですが、最初のWM_MOUSEHWHEELの処理時に::GetMessagePosを一切利用せずに、常にゼロがセットされているlParamを見て処理していました。このため、最初の::SendMessageによる反応テストの段階で失敗し、その後はWM_KEYDOWNメッセージで矢印キーが押されたことにしてスクロールを実現していました(だからキャレットブラウジングモードだとスクロールせずにキャレットが動くのみ)。

ですがtrunkでは、::GetMessagePos APIを利用するようになったことで、最初の::SendMessage時にのみ正常なマウスカーソル位置が取得できてしまい、処理が成功したのを確認したロジクールのドライバが::PostMessageWM_MOUSEHWHEELを連射してくるものの、ここでは::GetMessagePos APIの戻り値も壊れていて処理に失敗し続けている、というのがこのバグの真相でした。

私のパッチでは、lParam値や、::GetMessagePos APIの戻り値から、ロジクールのマウスであるかを推測し、そうであると判断した場合には::GetCursorPos APIを利用するようにしています。もちろん、これらのAPIの違いの分、誤動作はあるかもしれませんが、よほど処理落ちした状況等以外で誤動作だと分かることもないのではないかと思います。

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

bug 6685を含むエントリ

Bug 6685 ロジクールのマウスでチルトホイールを傾けても一回しかスクロールしないことが多い