FireGestures ボツネタ ~ 複数機能のポップアップ

※このエントリの内容は FireGestures のボツネタ機能に関する説明です。

機能

通常マウスジェスチャでは、ひとつのジェスチャにはひとつの機能しか割り当てることができないが、ひとつのジェスチャに対して複数の機能割り当てを許可し、そのジェスチャを行うとポップアップを表示して実行したい機能を選択できるという機能。

例えば、↑のジェスチャに対して、「新しいウィンドウ」「新しいタブ」の2つの機能を割り当てる。
すると、↑のジェスチャを行うと下図のようなポップアップが表示され、本当に実行したい機能を選択できる。

あまり使わない機能群に対して同一ジェスチャを割り当てておけば、覚えなければならないジェスチャの数も減らせて効果的である。

実装

とりあえず実装してみたところ、小1時間ほどでできた。改修したポイントは以下の5点。

  • 機能のタイプの定義へ、新たにポップアップ型を追加。(現状は標準装備型とユーザスクリプト型の2種類)
  • 設定画面にて、複数機能に対して同一ジェスチャの割り当てを許可する(現状は同一ジェスチャを割り当てようとするとダイアログ表示)。
  • マッピング管理では、同一ジェスチャに対して複数の機能が割り当てられている場合、それらの機能のIDをタブで連結した文字列にて保持する。
  • ユーザが行ったジェスチャに対してポップアップ型機能が割り当てられている場合、ポップアップを表示する(1度目の機能実行)。
    さらにポップアップからメニュー項目を選択すると、そのメニュー項目に割り当てられているコマンドを実行する(2度目の機能実行)。つまり、2段階で目的の機能を実行する形となる。
  • 実際にポップアップを表示する処理は、元々あるホイールジェスチャなどから表示するポップアップの実装を流用。

問題点

「リンクをタブで開く」のようにジェスチャの始点のリンクに対して何かするような機能をポップアップから実行する場合に痛い問題が発生。ジェスチャ開始位置のDOM要素への参照は、ジェスチャ実行開始~終了までの間は保持するものの、ジェスチャに割り当てられた機能を実行後にメモリリーク対策として破棄してしまう。よって、2度目の機能実行(ポップアップのメニュー項目を選択)をした時点では、ジェスチャ始点にあるDOM要素はもはや保持されておらず、リンク先に対する処理が実行できない。

ジェスチャ開始位置のDOM要素への参照を破棄するタイミングを変えることができるように修正しようとしたが、ロジックがだいぶ複雑化しそうなので早々に諦めた。

TOP