« [userChrome.js] 軽量マウスジェスチャー(ホイールジェスチャ・ロッカージェスチャ対応版) ~途中経過~ | マウストレイルの実装 » |
ロッカージェスチャの実装 Part 1
[userChrome.js] 軽量マウスジェスチャーでの問題点
ロッカージェスチャを使って「戻る」をして、ページロード中に右クリックを放すとそれが認識されない(mouseup イベントが発生しない)。その後通常の左クリックをしただけでロッカージェスチャが実行されてしまう。
All-in-One Gestures の場合
上記とまったく同様のバグが発生することがわかった。ただ、AiOG ではロッカージェスチャ実行後にタイマーが仕掛けられ、3秒間何もしないとロッカージェスチャの待ち状態が解除される(つまり右クリックを放したと見なされる)という仕組みがある。もしかするとこのタイマーはバグが発生したときの被害を最小限に食い止めるための意味があるのかも?つまり、右クリック放しが認識されずにバグ状態に陥っても、3秒間我慢すれば勝手に正常な状態へと戻る。
Optimoz Mouse Gestures の場合
Windows の場合はバグ発生しない。 Linux の場合はバグ発生する。
なぜ Windows の場合にバグが発生しない(mouseup イベントが必ず発生する)かを調べたところ、 OMG では独自に実装したC++製?のXPCOMコンポーネントによって、 DOM のレイヤーで発生する mouseup イベントとは別にもっと上のレイヤー?でマウスの動きを検知しているためである。この XPCOM コンポーネントは mgIMouseService というインタフェースを有し、マウストレイル(マウスジェスチャ中の軌跡描画)が主な仕事であるが、それ以外にもマウスの動きやクリックに応じて nsIObserverService による通知を行う仕組みをもっている。 XUL 側ではこの通知を監視し、クリックの放し (mozgestButtonUp) が発生すると initMouseEvent によって DOM のレイヤーでの mouseup イベントを生成する処理になっている。
結論
マウスジェスチャとホイールジェスチャは mousedown や mousemove といった DOM イベントを捕捉することで実装できた。しかし、まともなロッカージェスチャを DOM のレイヤーのみで実装するのは無理っぽい。
素直にマウ筋使えばいいのに。アプリケーションごとにジェスチャー付ける馬鹿が多すぎる
OpenSourceSoftware(OSS)である Firefox は、Linux、MacOS、Windows に対応しています。
特定のOSに依存していないことが、OSS(Firefoxも含めて)が世界的に人気があり、その開発や使用が積極的に進められている一つの要員でもあります。