« tabbrowser.xml と関連ファイルの移動 | 待望の document.elementFromPoint が実装 » |
[userChrome.js] 軽量マウスジェスチャをMacに対応させる
9/1 訂正 やはり以前作った Linux 対応版でも、マウスジェスチャのみのバージョンは Mac にも対応していたようである。ただ、ロッカージェスチャ・ホイールジェスチャ機能追加版の方は Mac では動作せず、その原因は Mac で右クリックしたときの mouseup イベントが「event.button == 2」で判断不可で、代わりに「event.button == 0 && event.ctrlKey」としなければならないためであるようだ。
以前 userChrome.js 版マウスジェスチャを Linux 対応させたとき、勢い余って Mac にも対応と書いてしまっていたが実際はロッカージェスチャ・ホイールジェスチャ機能追加版の方は Mac では動作していなかった。ところが、 Windows / Linux で右クリックの mouseup イベントを「event.button == 2」として判断している箇所を、Mac ではCtrlキー+左クリックされたと読み替えて「event.button == 0 && event.ctrlKey」とすることでうまくいくようだ(筆者は未確認ですが)。そこで、下記の青字で示した部分が追加される。
ロッカージェスチャ・ホイールジェスチャ対応版
_lastX: 0, _lastY: 0, _directionChain: "", _isMac: false, // for Mac init: function() { this._isMac = navigator.platform.indexOf("Mac") == 0; gBrowser.mPanelContainer.addEventListener("mousedown", this, false); gBrowser.mPanelContainer.addEventListener("mousemove", this, false); gBrowser.mPanelContainer.addEventListener("mouseup", this, false); gBrowser.mPanelContainer.addEventListener("contextmenu", this, true);
case "mouseup":
// [3] ジェスチャ終了~アクション実行
if ((this._isMouseDownR && event.button == 2) ||
(this._isMouseDownR && this._isMac && event.button == 0 && event.ctrlKey)) {
this._isMouseDownR = false;
if (this._directionChain)
this._suppressContext = true;
私の手元のMac(Mac OS X 10.4.10 Intel, Firefox 2.0.0.6)では,以前のLinux対応版で動いています.ただ,ホイールジェスチャーとロッカージェスチャーが追加されたバージョンは正しく動いていないです.
このページのスクリプトは正常に動作しています。
> 以前のLinux対応版で動いています.
http://www.xuldev.org/blog/?p=101
↑こちらのスクリプトだと
case “mouseup”:
// [3] ジェスチャ終了~アクション実行
if (this._isMouseDown) {
となっているのでMacでも動作しますね。
そういえば、Macでもmousedownイベント時では、
左クリック(クリック)のevent.buttonの値は0、
右クリック(control+クリック)のevent.buttonの値は2でした。
なるほど!結論としては、以下のようになりますでしょうか。
その理由は、右クリックのmouseupの判断を「event.button == 2」で行なっているからである。
したがって、このエントリの「マウスジェスチャのみ版」の変更は不要で、「ロッカージェスチャ・ホイールジェスチャ対応版」の変更は「case “mouseup”:」以降の箇所だけで良いということになりますね。
Macでもロッカージェスチャ・ホイールジェスチャ動きました!
Mac対応どうもありがとうございます!
ただし,
http://www.xuldev.org/misc/script/MouseGestures2.uc.js
に上がっているファイルの
this._isMac = navigator.platform.indexOf(“Mac”) == 0;
の位置がinit()内にあるべきところがuninit()内になっているのでそこだけ修正しました.
あと,ものすごく稀な状況ですが,Vimperatorという拡張が入っていると
XULBrowserWindow.statusTextFieldlabel = …
の箇所が失敗するので,
document.getElementById(‘statusbar-display’).label = …
にするとそれっぽい動作となりました.Vimperator自体がキーボードでFirefoxを
操作するための拡張なので両方入れる時点で矛盾していますが,
私はノートパソコンでマウスがあるときはマウスジェスチャでないときはVimperatorと
使い分けているので,こんなことになってしまいました(^-^;)
> init()内にあるべきところがuninit()内になっている
ご指摘ありがとうございます。これはとんでもないミスでした。早速修正しました。
> document.getElementById(‘statusbar-display’).label
これも本来ならそうすべきなので、近々修正する予定です。
ところで、現在試作中のマウスジェスチャ・ロッカージェスチャ・ホイールジェスチャなどなどGUI付き多機能版のMacでの動作確認にもしご協力いただけるのであればメールください。