gomita / firegestures

FireGestures, a Firefox extension.
http://www.xuldev.org/firegestures/
Other
128 stars 30 forks source link

Wheel gestures on e10s #163

Open knoajp opened 7 years ago

knoajp commented 7 years ago

I assign wheel gestures to left/right scrolling. But it doesn't work on e10s being on, with error message(window.content is null).

By the way, FireGestures' wheel scrolling with right click is just one-way scroling; I mean, if I start RIGHTward scrolling with wheel gesture, I can't scroll backward(LEFTward) without "mouseup". I want scroll left/right with remaining mousedown.

*

in Japanese: ホイールジェスチャを左右のスクローに割り当てて使用していましたが、 e10sを有効にしていると(window.content is null)とのエラーが出て動きません。

ところで、FireGesturesのホイールジェスチャによる左右スクロールは一方通行ですね。 すなわち、ひとたび右ボタンを押してから「右」方向にスクロールさせると、 押した右ボタンを離さない限りは「左」方向に戻すスクロールができません。 右ボタンを押したまま、上下のホイールで自在に左右にスクロールさせられるとうれしいです。

knoajp commented 7 years ago

左右のスクロールはてっきり標準で用意されている動作だと思っていたのですが、わたしの勘違いで、自分で書いていたスクリプトで実現させていたことでした。 下記のように書き直すことで、e10s有効環境下でも動作させることができました。お騒がせしてすみません。

var mm = gBrowser.selectedBrowser.messageManager;
mm.loadFrameScript('data:,' + encodeURIComponent((function(){
  content.scrollBy(100,0);
}).toSource() + '()'), true);

ただ、先の投稿の最後のほうに書いた要望は生きています。 ホイールジェスチャのホイール回転について、「右クリックを押し続けたまま」上方向にも下方向にも発動させられると便利です。

gomita commented 7 years ago

content.scrollBy(100,0); この100を-100に変えたスクリプトを上方向のホイールジェスチャに割り当てすれば良いのではないでしょうか。

knoajp commented 7 years ago

ありがとうございます。上手く伝わらなくてすみません。 -100に割り当てたスクリプトはもちろんユーザースクリプトとして登録してありますし、それをホイールジェスチャの上スクロールにも割り当てています。その上で、

  1. マウスの右ボタンをmousedown
  2. ホイールを下方向に回して望みの位置まで右スクロールさせる
  3. 望みの位置より少し右方向に行きすぎてしまったときに…
  4. (1.でmousedownさせた右ボタンをmouseupさせないまま、) ←ここ重要
  5. ホイールを上方向に回して、望みの位置まで左方向に戻そうとする
  6. 意図に反して、左方向ではなく通常のホイールの動作である上方向にスクロールしてしまう

ということです。 が、いま改めて検証して気付いたのですが、4.の瞬間に「ジェスチャのタイムアウト」時間が経過してしまっていたのが原因でした。0.5秒と短めに設定しているのも災いしたようです。

右クリックしたままホイールの上下でひょいひょい微調整できると便利なので、個人的にはホイールジェスチャのみタイムアウトを無視してくれるといいなと思いますが、レアケースだと思いますし仕様的にも例外を設けるのは美しくない気がしますので、あきらめることにします。(タイムアウトを1秒にするなど、意図的にジェスチャをキャンセルしたいときの待ち時間との、ベストバランスを模索します)

まことにお騒がせしてしまいました。ありがとうございました。

(実際には下記のようにスムーズにスクロールさせています)

var mm = gBrowser.selectedBrowser.messageManager;
mm.loadFrameScript('data:,' + encodeURIComponent((function(){
  let i = 10;
  let id = setInterval(function(){
    content.scrollBy(10,0);
    if(--i===0) clearInterval(id);
  }, 1000/100);
}).toSource() + '()'), true);