[userChrome.js] 軽量マウスジェスチャー(ホイールジェスチャ・ロッカージェスチャ対応版) ~途中経過~

6/30 追記
ロッカージェスチャ有効時、選択範囲をテキストボックスへドラッグ&ドロップすると右クリックが効かなくなるバグを修正。

「Operaユーザは「右押しながら左クリック」をよく使う」というアンケート結果に衝撃を受けたわけではないですが、軽量マウスジェスチャへ、以下の2機能を追加したバージョンを作成しました。
 ・ホイールジェスチャ (右クリックしながらホイール回転でタブ切り替え)
 ・ロッカージェスチャ (右クリックしながら左クリックで戻る、左クリックしながら右クリックで進む)

ホイールジェスチャおよびロッカージェスチャ実行時には、 _performAction メソッドへ以下のような文字列が渡りますので、実行するアクションをカスタマイズ可能です。
 ・ホイールジェスチャ(下に回転): W+
 ・ホイールジェスチャ(上に回転): W-
 ・ロッカージェスチャ(右クリックしながら左クリック): L<R
 ・ロッカージェスチャ(左クリックしながら右クリック): L>R

ただし、ロッカージェスチャに未解決の問題点があって、例えば右クリックしながら左クリックを連続で何回か押して連続で戻る操作をしているとき、ページのローディングが行われている瞬間(くるくるアイコンが回転している瞬間)を狙って右クリックを放すと、放したことが認識されずに右クリックが続いていると誤認識され、その後の動作がおかしくなる。bfcache が効いていると再現しにくいので、いったんキャッシュをクリアするとページ遷移のたびにローディングされ、上記問題が再現しやすくなる。

とはいえ、そもそも All-in-One Gestures ではロッカージェスチャは連続でできない(右クリック押しながら一回左クリックをするとその時点で終了する)ため、 userChrome.js 版マウスジェスチャでもその動きにすれば上記問題点は解決すると思われる。反面、 Optimoz Mouse Gestures や本家 Opera では連続クリックが可能である。

ロッカージェスチャを望んでいる方は、この連続クリック機能が必須であるか、無くてもいい程度のものか、あるいはまったくもって不要かなどについて教えてくださるとありがたいです。ただ、連続クリックが必須という意見が大半であったとしても、今後がんばっても上記問題を解決できないままである可能性が高いです。

TOP

24 Comments to “[userChrome.js] 軽量マウスジェスチャー(ホイールジェスチャ・ロッカージェスチャ対応版) ~途中経過~”

AiOGでも詳細設定1のところで連続クリック可能なように設定出来ますよ。
必要かどうかと言われると、使ってる人からすれば必須だと思います。個人的にも必須です。

リリース早々で申し訳ないのですが、ロッカージェスチャで右クリックしながら中クリックを設定できるようになるとありがたいです。

ロッカージェスチャの連続クリック機能に関してですが、私も必須と思っています。
また、連続ロッカージェスチャを行ったのち右クリックを外さないで他のマウスジェスチャやホイールジェスチャを行えたりなど、
右クリック押下状態で実行できる各ジェスチャーはクリックを放さないで連続して行いたいです。

俺も必須だなぁ。。
適当なリンク先を連続クリックでバックグラウンドで開けたら便利かも。

> AiOGでも詳細設定1のところで連続クリック可能

見落としていました。さっそくAiOGで連続クリックを試してみたところ、ページロード中に右クリックを放しても認識されないという上記バグがAiOGでも発生しました。ただ、AiOGではロッカージェスチャ実行後にタイマーを仕掛け、3秒間何もしなければロッカージェスチャの継続を中断する(右クリックを放したものとみなす)仕掛けがありました。もしかするとこのタイマーは上記バグが発生したときの被害を最小限に食い止めるための一時しのぎ的な策かもしれません。

> ロッカージェスチャで右クリックしながら中クリックを設定できるようになるとありがたい

handleEventメソッドのcase “mousedown”の中のif文の末尾へ以下のコードを追加してください。ただし、Firefoxの自動スクロール機能が有効になっているとそちらの機能が実行されてしまいます。

				else if (this.enableRockerGestures && event.button == 1) {
					if (this._isMouseDownR) {
						this._suppressContext = true;
						this._directionChain = "M<R";
						this._stopGesture(event);
					}
				}

> 右クリック押下状態で実行できる各ジェスチャーはクリックを放さないで連続して行いたい
現状でもそのような仕様になっているはずです。

ジェスチャーでタブを閉じると、次回右クリック時にジェスチャーした/しないに関わらず右クリックメニューが出なくなるようです。

ロッカージェスチャとホイールジェスチャ機能 待ってました
ホイールジェスチャでAiOGにあるような履歴をたどる機能はできないでしょうか?

macじゃ使えないのですねコレ 対応の方よろしくお願いします。

> ジェスチャーでタブを閉じると、次回右クリック時にジェスチャーした/しないに関わらず右クリックメニューが出なくなる

バグでした。修正しました。

> ホイールジェスチャでAiOGにあるような履歴をたどる機能

History Scroller という userChrome.js 用スクリプトがあります。

> macじゃ使えないのですねコレ

当方mac環境がないため未確認です。

alice0775:

>ただし、Firefoxの自動スクロール機能が有効になっているとそちらの機能が実行されてしまいます。
EventListenerのmousedownのところのfalseをtrueにして,
else if (this.enableRockerGestures && event.button == 1) {
if (this._isMouseDownR) {
+ event.preventDefault();
+ event.stopPropagation();
としたら,自動スクロール機能は起動しないが,何か悪影響があるでしょうか?

alice0775さん
その方法でばっちりでした。

>History Scroller という userChrome.js 用スクリプトがあります。
History ScrollerはLinuxでは動かないようです orz

alice0775:

ロッカージェスチャ有効時において, Webページの文字列を選択しテキストBOXなどにドラッグ&ドロップすると,右クリックコンテキストおよびマウスジェスチャができなくなります。
その画面で一旦左クリックすると, 右クリックコンテキストおよびマウスジェスチャ共に機能するようになります。
この不具合は, draggestureをリッスンして,同ハンドラで this._isMouseDownL = false;とすれば,いけるみたいなんですが….

最近突如として右クリックが効かなくなることが多いので、原因を探らねばと思っていたところでした。確かにドラッグ&ドロップが原因ですね。ありがとうございました。
どうもロッカージェスチャは問題多いという感じですね…。

pirlouy:

Wonderful… Thanks for this update Gomita.

Just some things:
– Rocker Gestures allows back and forward navigation, great, but is it possible to have a different action for left and right gestures ? It seems not…
– WheelGestures works fine, but when a page is loading, wheel gestures won’t work all the time, and in some situations, it’s like if right click stays down, and when I use mouse wheel to scroll down, it changes tabs !

It’s just details but maybe you’re able to fix that…
Once again, thanks for your scripts. What a shame you don’t have an english blog…

初めまして、ITmediaの記事から来ました。

Macでは、
case “mouseup”:
// [3] ジェスチャ終了~アクション実行
– if (event.button == 2 && this._isMouseDownR) {
+ if (this._isMouseDownR && !this._isMouseDownL) {
とすることで、一応動作するようです。

すみません、そもそもMacだとどのように異常動作するのかすらわからないので教えてくださると助かります。

Macでは、一度右クリックすると、常に右クリック押下状態となってしまい、
マウスジェスチャのアクションを実行することができなくなります。
ただし、ホイールジェスチャとR>Lのロッカージェスチャは、右クリック押下状態なので実行できます。

senさん、どうもありがとうございます。
ホイールジェスチャとR>Lのロッカージェスチャは実行できるとのことですが、右クリックを放してもそれが認識されず、それ以降は左クリックだけでジェスチャが実行されてしまうことになりますか?
また、mouseupイベント発生時のevent.buttonとevent.ctrlKeyの値を教えていただけると幸いです。
Macはそもそもクリックに右・左という区別がなく、Ctrlキー+左クリック=右クリックだったという記憶がありますので。
そう考えると、もしかしたら下記で動くような気がしてきました。見えない敵と戦っているようなデバッグですが。

  // [1] ジェスチャ開始
- if (event.button == 2) {
+ if (event.button == 2 || 
      (navigator.platform.indexOf("Mac") == 0 && event.button == 0 && event.ctrlKey)) {

  // [3] ジェスチャ終了~アクション実行
- if (event.button == 2 && this._isMouseDownR) {
+ if ((event.button == 2 && this._isMouseDownR) || 
      (navigator.platform.indexOf("Mac") == 0 && event.button == 0 && event.ctrlKey && this._isMouseDownR)) {

> ホイールジェスチャとR>Lのロッカージェスチャは実行できるとのことですが、右クリックを放してもそれが認識されず、それ以降は左クリックだけでジェスチャが実行されてしまうことになりますか?

その通りです。

mouseupイベント発生時のevent.buttonの値は0です。
Macのクリックは左・右ではなく、クリック(機能は左)・control+クリック(機能は右)という扱いのようです。

っと、遅レスでしたね;

上記のコードで動作確認しました。Mac環境がないのにデバッグさせてすみません;ご苦労様です。
ちなみにmouseupイベント発生時のevent.ctrlKeyの値は1でした。

上記のコードで3種のジェスチャとも正常動作した、ということでしょうか!!??
また、event.ctrlKeyの値はtrueではなく1でしょうか?
alert(event.ctrlKey) などとすればtrueか1かが表示されるはずです。

あ、申し訳ない、event.ctrlKeyの値はtrueでした。event.ctrlKey == 1で真だったので勘違い;

> 上記のコードで3種のジェスチャとも正常動作した、ということでしょうか!!??

はい、マウス・ロッカー・ホイールジェスチャ共に正常動作しております。
ただし、ページ遷移中にmouseupイベントが認識されない例の問題の発生も確認しました。

[…] [userChrome.js] 軽量マウスジェスチャー(ホイールジェスチャ・ロッカージェ… […]

Vimperatorを入れてみたところ、ジェスチャ終了時に右クリックメニューが開いてしまう、という
現象が起こるようになりました。
どうにかならないでしょうか・・・

TOP

TOP