Linux用マルチタッチジェスチャのFusumaがv2にアップデート

Linux向けのマルチタッチジェスチャツールのFusumaがv2にバージョンアップした。 新たにジェスチャの設定項目が充実して、細かいところに手が届くようになった。

Fusuma v2のアップデートの概要

Fusuma v2ではマルチプロセス化、I/O多重化、継続ジェスチャ、contextに応じた設定の切り替えなど、 色々とアップデートが入った結果、以下のような機能が実現できるようになった。

  • アプリ固有のジェスチャ設定(fusuma-plugin-appmatcher)
  • Mac OSスタイルの3本指ドラッグ
  • Windowsスタイルの3本指スワイプでのウィンドウ切り替え
  • スワイプ/ローテートによる音量調整・輝度変更

動作確認した環境

この記事内での設定はDELL XPS 13 9310上のUbuntu 20.04(X11/Gnome-shell)で動作確認している。 利用しているディストリビューションやデスクトップ環境に応じてショートカットキーなどは適宜読み替えて欲しい。

$ fusuma --version
reload config: /home/iberianpig/.config/fusuma/config.yml
---------------------------------------------
Fusuma: 2.0.5
libinput: 1.16.5
ruby 2.7.0p0
OS: Linux 5.10.0-1026-oem #27-Ubuntu SMP Thu May 6 07:19:13 UTC 2021
Distribution: Ubuntu 20.04.2 LTS \n \l
Desktop session: ubuntu x11
---------------------------------------------

なお、Fusuma v2から要求するRubyバージョンが2.5.1以上(Ubuntu 18.04のデフォルトのRubyバージョン)となっているので注意。

Fusumaとプラグインを最新版にアップデート

gemコマンドでアップデートできる。 システムワイドのRubyを使ってインストールしていない場合sudoは不要。

$ sudo gem update fusuma

インストール済みのFusumaプラグインがある場合はそれらをアップデートしておく。

# プラグインをリストする
$ sudo gem list fusuma-plugin-
fusuma-plugin-keypress (0.4.1)
fusuma-plugin-sendkey (0.6.2)
fusuma-plugin-wmctrl (0.4.3)
# プラグインをアップデート
$ sudo gem update fusuma-plugin-sendkey fusuma-plugin-wmctrl fusuma-plugin-keypress

アプリケーション固有のジェスチャを設定する

fusuma-plugin-appmatcherをインストールするとFusumaのconfig.yml上でアプリケーション固有の設定ができるようになる。

これまでジェスチャの設定はアプリ関係なくグローバルな設定のみだったので、アプリ毎に微妙にショートカットキーが違う場合も対応できるようになる。

自分が動作確認できるX11とUbuntu-Waylandは現在サポートしているが、Plasma Waylandや他のWayland環境へは未対応。 コマンドからwm_classを取得できさえすれば実装可能なので、fusuma-plugin-appmatcherにPull Requestを作ってもらえると嬉しい。

fusuma-plugin-appmatcherのインストール

ターミナルで↓のコマンドを実行

$ sudo gem install fusuma-plugin-appmatcher

設定で利用するアプリケーション名の取得

config.ymlで指定するためのアプリケーション名は$ fusuma-appmatcher -lで取得できる。 -lオプション無しの場合はフォアグラウンドのアプリケーション名のみを取得する。

$ fusuma-appmatcher -l
discord
Slack
Gnome-terminal
Google-chrome

config.ymlにcontext: WM_CLASSを設定する

既存のconfig.ymlに書き足す場合:

  1. ~/.config/fusuma/config.ymlの最下部に---を追加してcontextを区切る。
  2. context: { application: Google-chrome }を追加する。
  3. その下にswipe: ...と通常通りジェスチャを記述していく。

以下の例では4本指のジェスチャをデフォルトの設定とし、Google ChromeとGnome Terminalに対して3本指のスワイプジェスチャを割り当てている。

# デフォルトのコンテキスト
swipe:
  4:
    up:
      workspace: next  # 次のワークスペースに移動
      keypress:
        LEFTSHIFT:
          window: next # ウィンドウを次のワークスペースに移動
    down:
      workspace: prev  # 前のワークスペースに移動
      keypress:
        LEFTSHIFT:
          window: prev # ウィンドウを前のワークスペースに移動

# ↓Contextを区切るために`---`が必要
---

# context: { application: Google-chrome }
# ⇅は同じ意味
context:
  application:  Google-chrome

swipe:
  3:
    left:
      sendkey: 'LEFTALT+RIGHT' # 進む
    right:
      sendkey: 'LEFTALT+LEFT'  # 戻る
    up:
      sendkey: 'LEFTCTRL+T'    # タブを開く
      keypress:
        LEFTSHIFT: # シフトキー押しながら
          sendkey: 'LEFTSHIFT+LEFTCTRL+T' # 最後に閉じたタブを開く
    down:
      sendkey: 'LEFTCTRL+W'    # タブを閉じる
---
context:
  application:  Gnome-terminal

swipe:
  3: 
    up:
      sendkey: 'LEFTSHIFT+LEFTCTRL+T' # タブを開く
    down:
      sendkey: 'LEFTSHIFT+LEFTCTRL+W' # タブを閉じる

※ この例にはfusuma-plugin-wmctrlfusuma-plugin-sendkeyfusuma-plugin-keypressを利用している。

Google ChromeとGnome Terminalでそれぞれ3本指上スワイプを試してみるとどちらもタブが開く。 Google ChromeにはLEFTCTRL+T、Gnome TerminalにはLEFTSHIFT+LEFTCTRL+Tとそれぞれ異なるキーを割り当てることができた。

Fusuma v2から---を含むYAMLドキュメントを処理できるようになった。---で区切られた先頭のドキュメントがデフォルト設定として扱われる。 ちなみに---は1つのファイル内で複数ドキュメントを記述できるYAML標準のシンタックスである。

Mac OSの3本指ドラッグをLinuxで実現する

Mac OSのトラックパッドでの3本指のドラッグ機能が便利らしいことを目にした。

「3本指のドラッグ」の用途は無限にあって,具体的な例を挙げておく.Keynote でキレイな発表資料を作るときも使えないと困ってしまう.

  • Chrome で表示されている文字をドラッグしてコピーするとき
  • iTerm2 でターミナルの結果をドラッグしてコピーするとき
  • Keynote でオブジェクトのサイズを変更するとき

とても便利そう。ということで実装したのがこちら。

テキスト選択、Chromeのタブ移動、ウィンドウの移動など、3本指ドラッグは確かに便利。 トラックパッドでクリックしてから別の指でドラッグするよりも、3本指ドラッグは操作ステップが少く直感的に動かせる。

3本指ドラッグの設定方法

↓ を~/.config/fusuma/config.ymlに設定して、Fusumaを再起動すると3本指のドラッグができるようになっている。

swipe:
  3:
    begin:
      command: xdotool mousedown 1 # 左マウスボタンを押し続ける
    update:
      command: xdotool mousemove_relative -- $move_x, $move_y # マウス移動
      interval: 0.01 # 更新間隔を小さく
      accel: 2 # マウスの移動量の増加
    end:
      command: xdotool mouseup 1 # 左マウスボタン解放

begin:/update:/end:プロパティ

Fusuma v2からスワイプ、ピンチ、ローテートにジェスチャの開始/更新/終了イベントを割り当てを個別で設定できるようになった。

例えば上述の3本指ドラッグの設定では begin:/update:/end: にxdotoolの マウス押下/マウス移動/マウス解放 を割り当ている。

またジェスチャの移動量の$move_x, $move_y, $zoom, $rotateが変数として扱えるようにした。 accel: 2$move_x, $move_yなどの値を2倍にする。3本指ドラッグで移動距離を増やすのに使っていて、今の所ほぼ3本指ドラッグ専用の機能。 これらの変数はcommand:に指定されたコマンドから環境変数としてアクセスできる。

実は3本指ドラッグは以前からGithubに機能追加のIssueはあって、実装したかった機能の1つだった。

開始/更新/終了イベントに個別のアクションの割当が可能になり、複雑なジェスチャがconfig.ymlで表現できるようになった。 ちなみに後述のAlt+Tabのウィンドウ切り替えやローテートの音量・輝度調節もこの機能で実現している。

Windowsの3本指スワイプでのウィンドウ切り替えをLinuxで実現する

こちらもFusumaのGithub Issueでユーザーから機能要望が上がってきたものだった。 Windowsは3本指の左右スワイプするとウィンドウの切り替えができるらしく、Windowsマシンが手元になかったのでヨドバシカメラで動作確認した。

Alt+Tabを送信してウィンドウ切り替えを真似てみた。

スワイプするとウィンドウを切り替え、指を離すまではプレビューが出る。 こちらもFusuma v2のbegin:/update:/end:を使って再現した。

3本指スワイプによるウィンドウ切り替えの設定方法

Alt+Tabのウィンドウ切り替えをconfig.ymlに記述する。

swipe:
  3:
    begin:
      command: xdotool keydown Alt # Altキーを押し続ける
    right:
      update:
        command: xdotool key Tab  # Tabキーを押下
        interval: 5
    left:
      update:
        command: xdotool key Shift+Tab # Shift+Tabキーを押下
        interval: 5
    end:
      command: xdotool keyup Alt  Alt # Altキー解放

Altを押しっぱなしにして指が左右へ移動する時にTab/Shift+Tabを押下する。 ウィンドウの切り替えが早すぎると使いづらいのでinterval: 5を設定してupdate:のイベントを間引いている。 ちなみにbegin:/update:/end:はSwipeやPinch/Rotateの方向プロパティ(right/leftなど)の下にも設定できる。

スワイプ/ローテートによる音量・輝度調整

3本指のローテート(回転)ジェスチャで音量が変更できる。Shiftキーを押すと音量変化の幅が小さくなって微調整が効く。 ALTキーを押しながら回転させると輝度を変更する。

スワイプ/ローテートによる音量・輝度調整の設定方法

rotate:
  3:
    clockwise: # 時計回り
      update:
        sendkey: VOLUMEUP # 音量UP 
        LEFTSHIFT: # Shift押しながら
          sendkey: LEFTSHIFT+VOLUMEUP # 音量UP(微増)
        LEFTALT: # Alt押しながら
          sendkey: BRIGHTNESSUP # 輝度UP
    counterclockwise:  # 反時計回り
      update:
        sendkey: VOLUMEDOWN # 音量DOWN
        LEFTSHIFT: # Shift押しながら
          sendkey: LEFTSHIFT+VOLUMEDOWN  # 音量DOWN(微減)
        LEFTALT: # Alt押しながら
          sendkey: BRIGHTNESSDOWN  # 輝度DOWN

rotate: x update:イベントの動作確認用に設定していたのだが、使ってみたら意外と便利だったのでそのまま使っている。
回転ジェスチャやピンチジェスチャはコツがいるので、難しい場合は修飾キー+上下スワイプでの音量・輝度調整が簡単でオススメ。

その他の設定はWikiへ

今回紹介した設定はfusuma Wikiに追加した。

誰でも編集できて、各々がおすすめの設定を載せているので参考になるので見て欲しい。 また、便利設定を発見したら共有してもらえると嬉しい。