LinuxをトラックパッドジェスチャでMacみたいに使おう (KDE5 + libinput-gestures)

# 背景
10年前までMacを使っていて、トラックパッドをスワイプしてウィンドウ一覧を出すExposeや、仮想デスクトップをスライドで切り替えるSpacesなどがとてつもなく便利でした（老人の感想）。
LinuxでもKDE**5**環境でなら近い使用感にできたので、細かい点を忘れないようメモしておきます[^0]。Qiitaにはすでに他の方の記事もたくさんあるので、そちらもご参考ください。
[^0]: [2024/02/12] yayコマンドのパッケージ名が間違っていたので修正; [2024/03/09] KDE6に関する注意書きを追記; [2024/03/13] KDE6へのパッチ当てを追記
:::note warn
[2024/03/09] 新たにKDE6がリリースされていますが、組み込みのタッチパッドジェスチャと以下の操作が衝突します。しかも組み込み機能の無効化や設定パネルがないようなので[^5]、ジェスチャがないと生きていけない人はまだ6/Waylandにアップデートしないことを私としては推奨します。([参考](https://forum.endeavouros.com/t/gesture-shortcut-or-command-feasability-on-wayland/51943))
:::
[^5]: どうしても無効化するにはKwinのソースを編集して再ビルドする必要があります。大変面倒なので推奨しませんが、[ここ](https://gist.github.com/ys-clarry/a65a3626de8294bc49d11a19147d5df0)に6.0.1向けのパッチを置いておきます。なおWaylandでは`libinput-gestures`は動きますが`xte`が使えないので、変わりに[`ydotool`](https://github.com/ReimuNotMoe/ydotool)を使いましょう。

# 検証環境
- ディストリビューションはArch Linux (up to date)
- PCはVAIO SX12 (VJS124)、トラックパッドはELAN製
- Linuxで`Xorg`によるGUIが立ち上がっていること（`Wayland`はこの記事の対象外です）。
- KDE**5** (Plasma) をデスクトップ環境に使用している、あるいは乗り換えに抵抗がないこと
- libinputをトラックパッドのドライバに使っていること (この確認は以下の記事が参考になります）[^1]
[^1]:ちなみにArchでこの確認をするには`xorg-xinput`の導入が必要です。

https://qiita.com/74th/items/d58e152fb70d59395597

## インストール
まず必要なパッケージを導入します。以下の三点を入れてください。
- `libinput-gestures`: ジェスチャを受け取る本体
- `dex`: KDEのログイン時、上記を自動起動するために必要
- `xte` (パッケージは `xautomation`): ジェスチャを実行した際にキー入力をするのに必要

:::note warn
Archでは`libinput-gestures`はAURレポジトリに含まれており`pacman`では導入できません。例えば`yay`を使って上記すべてを以下のように導入できます。
`$ yay -S libinput-gestures dex xautomation`
:::

## ジェスチャを受け取る側 (libinput-gestures) の設定
ジェスチャを使用するユーザは`input`グループに所属している必要があります。
`# gpassswd -a $USER input`などでユーザをグループに追加し、再起動してください。

設定ファイルは`/etc/libinput-gestures.conf`になります。手元のアサイン例を示します。
```
# 4本指で上にスワイプしてウィンドウの一覧、下にスワイプして仮想デスクトップの一覧を表示
gesture swipe up   4  xte "keydown Control_L" "usleep 50" "key F10" "keyup Control_L"
gesture swipe down 4  xte "keydown Super_L" "usleep 50" "key F8" "keyup Super_L"

# 3本指で左右にスワイプしてブラウザの戻る・進む
gesture swipe left  3  xte "keydown Alt_L" "usleep 50" "key Left" "keyup Alt_L"
gesture swipe right 3  xte "keydown Alt_L" "usleep 50" "key Right" "keyup Alt_L"

# 4本指で左右にスワイプして、仮想デスクトップの前後移動（KDE側の設定が必要）
# いわゆる「ナチュラルスクロール」になっているので注意
gesture swipe left  4  xte "keydown Alt_L" "keydown Control_L" "usleep 50" "key Right" "usleep 50" "keyup Control_L" "keyup Alt_L"
gesture swipe right 4  xte "keydown Alt_L" "keydown Control_L" "usleep 50" "key Left" "usleep 50" "keyup Control_L" "keyup Alt_L"

# 3本指で上下にスワイプして音量調節
gesture swipe up   3  qdbus org.kde.kglobalaccel /component/kmix org.kde.kglobalaccel.Component.invokeShortcut 'increase_volume'
gesture swipe down 3  qdbus org.kde.kglobalaccel /component/kmix org.kde.kglobalaccel.Component.invokeShortcut 'decrease_volume'

# 4本指を閉じてMission Control的な仮想デスクトップの一覧表示、開いてデスクトップを表示
# 本当はMacと同じく5本にしたかったが、認識しなかった…
gesture pinch in   4  xte "keydown Super_L" "usleep 50" "key w" "keyup Super_L"
gesture pinch out  4  xte "keydown Super_L" "usleep 50" "key d" "keyup Super_L"
```
:::note info
このファイルで設定可能なジェスチャの種類は以下を参照ください。
https://github.com/bulletmark/libinput-gestures#configuration
:::
:::note info
`xte`は引数に指定したキーやマウス操作を左から順に実行していくコマンドです[^2]。`usleep 数字`とするとマイクロ秒単位で待機します[^3]。使えるキーなどは`$ man xte`でマニュアルをご覧ください。
:::

::: note alert
`xte`で修飾キーを`keydown`で押した後は必ず`keyup`で引き上げてください。引き上げないと押されっぱなしになり、キーボード操作がほぼ不可能になります（二敗）。
:::

[^2]: この目的のツールでは`xdotool`も存在しますが、この環境では修飾キーをうまく押せずに失敗することが多々あったため、`xte`を使っています。
[^3]: キー入力の間で待たないと入力に失敗することがありました。この環境では`xkeysnail`を併用しているのでその影響もありそうです。

## KDE側の設定
1. `KDE システム設定`を開く。
1. `ワークスペース`カテゴリの`ワークスペースの挙動` から `仮想デスクトップ` を開き、適当にデスクトップを追加してください。
1. `ワークスペース`カテゴリの`ショートカット`から`ショートカット`→`Kwin`を選択します。
1. `デスクトップ1に切り替え` を `Alt + 1`にアサインし、デスクトップ2から4も同様にアサインする。もっと使う人は適宜増やしてください。
1. `次のデスクトップに切り替え` を `Ctrl + Alt + →`、`前のデスクトップに切り替え` を `Ctrl + Alt + ←` にアサイン

:::note warn
`Firefox`ユーザへ: デスクトップ間を移動する `Alt + 数字` はFirefoxのタブの移動と衝突するので、困る場合はどちらかの修飾キーをCtrlに変えたりして対応してください[^4]。
:::
[^4]: 個人的にはFirefox側をCtrlに修正するのが好きです。アドオン [Ctrl+Number to switch tabs](https://addons.mozilla.org/ja/firefox/addon/ctrl-number-to-switch-tabs/) などが使えます。

::: note info
`Import Scheme`機能から以下をインポートしても良いのかもしれませんが、動作は確認していないのでご注意ください。
```
[kwin][Global Shortcuts]
Switch to Desktop 1=Alt+1
Switch to Desktop 2=Alt+2
Switch to Desktop 3=Alt+3
Switch to Desktop 4=Alt+4
Switch to Next Desktop=Ctrl+Alt+Right
Switch to Previous Desktop=Ctrl+Alt+Left
```
:::

## 動作テスト
1. `Alt + 数字キー`で所定のデスクトップに移動できることを確認
1. `Ctrl + Alt + →および←`でデスクトップ間をスライド移動できることを確認
1. ターミナルで `libinput-gestures-setup start` を実行し、立ち上がることを確認 (`libinput-gestures-setup status`で、動作状況が確認できます。)
1. 上記で設定したトラックパッドジェスチャを実行し、動くことを確認
1. 問題がなければ、`libinput-gestures-setup autostart` でスタートアップに登録する。

:::note warn
ハマった際は以下を確認してください。
- 操作不能になった際は、おとなしく再起動しましょう。
- どのジェスチャも実行できないときは`xte`が動作するかを確認してください。
- 挙動が不安定なときは`usleep`の値を増やしてみるとショートカットとしての認識率が上がるかもしれません。
- キー入力ツールとして`xte`にこだわる必要はないので`xdotool`の利用も検討ください。
:::

## 注意事項
結構快適なのであまりありませんが。
- スリープした際の挙動が怪しい気がします。起こした後は`libinput-gestures-setup restart`で再起動してください。
- KDE側の問題ですが、「四本指で上」からの「四本指で下」ではうまく元の画面に戻ってくれません。ちょっとうっとうしいので対策を検討したい。

## 最後に
久しぶりに手足のようにトラックパッドが動いている気がする。好きなようにカスタマイズしてみなさんも楽しんでください。必要な操作を書き漏らしているようであればどうぞご指摘を。