Linuxでキーボード入力中に外部トラックパッドを無効化

## 外部トラックパッドでDisable While Typing (DWT)が効かない問題

Gnomeの設定などでDisable while typingの項目があり、これを有効にするとタイピング中にトラックパッドが一時的に無効化され、トラックパッドの誤タッチを防止できる。

しかし、これはラップトップ備え付けのトラックパッドでのみ有効である場合がほとんどで、Apple Magic Trackpadなどの外部トラックパッドには適用されない。
そのため、外部キーボードの手前に外部トラックパッドを配置するスタイルでは割と頻繁に誤タッチが発生してしまう問題があった。

こんな感じの配置:

https://www.wow-creators.com/news-try/bird-electron-new-palmrest-review/

どうやらLinuxにおいてlibinputやらの入力レイヤーでは、キーボードおよびトラックパッドがinternalかexternalかで処理を切り替えているらしく、externalなトラックパッドに対してはDWTが適用されないようだ。

`libinput`コマンドで外部トラックパッドの設定（ここではApple Magic Trackpad）を確認してみる:
```console
$ libinput list-devices
...
Device:           Apple Inc. Magic Trackpad
Kernel:           /dev/input/eventXX
Group:            6
Seat:             seat0, default
Size:             162x115mm
Capabilities:     pointer gesture
Tap-to-click:     disabled
Tap-and-drag:     enabled
Tap drag lock:    disabled
Left-handed:      disabled
Nat.scrolling:    disabled
Middle emulation: disabled
Calibration:      n/a
Scroll methods:   *two-finger edge
Click methods:    button-areas *clickfinger
Disable-w-typing: n/a
Accel profiles:   flat *adaptive
Rotation:         n/a
...
```

`Disable-w-typing`の値が`n/a`になっていることが分かる。

ここで、`/dev/input/eventXX`の`XX`の部分の番号（環境依存）を覚えておく（以下で使うので）。

## 解決方法

ワークアラウンド的ではあるが、外部キーボードとトラックパッドの両方をinternalとして認識させることで解決できる。

まずは外部トラックパッドをinternalとして認識するように設定を変更する。

ファイル`/etc/udev/hwdb.d/71-touchpad-local.hwdb`を新たに作成して編集:
```sh
sudo vim /etc/udev/hwdb.d/71-touchpad-local.hwdb
```

`/etc/udev/hwdb.d/71-touchpad-local.hwdb`の内容:
```
touchpad:usb:v05acp030e:*
touchpad:usb:v05acp0265:*
touchpad:bluetooth:*
 ID_INPUT_TOUCHPAD_INTEGRATION=internal
```

元の設定ファイルは`/usr/lib/udev/hwdb.d/70-touchpad.hwdb`にある。詳細はそのファイルのコメント参照。

`/etc/udev/hwdb.d/71-touchpad-local.hwdb`を保存後、以下を実行:
```sh
sudo systemd-hwdb update
sudo udevadm trigger /dev/input/eventXX
```

`/dev/input/eventXX`の`XX`は外部トラックパッドの番号で置換。

これでApple Magic Trackpad (1および2）、bluetooth接続のトラックパッドがinternalとして認識されるようになる。

次にlibinput側で外部キーボード、外部トラックパッドをinternalとして認識するよう設定する。

ファイル`/etc/libinput/local-overrides.quirks`を作成、編集:
```sh
sudo mkdir -p /etc/libinput
sudo vim /etc/libinput/local-overrides.quirks
```

`/etc/libinput/local-overrides.quirks`の内容の例:
```
[Magic Trackpad 2]
MatchVendor=0x004C
MatchProduct=0x0265
AttrKeyboardIntegration=internal

[HHKB]
MatchVendor=0x04FE
MatchProduct=0x0022
AttrKeyboardIntegration=internal
```

あくまで私の環境の例なので、適宜`MatchVendor`や`MatchProduct`を変更して環境のキーボード、トラックパッドにマッチさせることが必要。

`/dev/input/eventXX`のvendor ID、product IDの調べ方:
```console
$ sudo udevadm info --query=property --name=/dev/input/eventXX | grep DEVPATH
DEVPATH=/devices/virtual/misc/uhid/WWWW:XXXX:YYYY.ZZZZ/input/inputYY/eventXX
```

`XXXX`がvendor ID、`YYYY`がproduct IDに相当するはず。もしかしたら環境によって違うかもしれない。

`/etc/libinput/local-overrides.quirks`を保存したら再起動し、`Disable-w-typing`が`enabled`になっていることを確認:
```console
$ libinput list-devices
...
Device:           Apple Inc. Magic Trackpad
Kernel:           /dev/input/eventXX
Group:            6
Seat:             seat0, default
Size:             162x115mm
Capabilities:     pointer gesture
Tap-to-click:     disabled
Tap-and-drag:     enabled
Tap drag lock:    disabled
Left-handed:      disabled
Nat.scrolling:    disabled
Middle emulation: disabled
Calibration:      n/a
Scroll methods:   *two-finger edge
Click methods:    button-areas *clickfinger
Disable-w-typing: enabled
Accel profiles:   flat *adaptive
Rotation:         n/a
...
```

## 試した環境

- OS: Pop!_OS 22.04
- libinput: 1.20.0
- Trackpad: Apple Magic Trackpad 2
- Keyboard: HHKB (bluetooth)

## 注意

- 設定は私の環境で上手くいったものをメモとして載せているだけなので、minimalな設定かどうかは確認していません。
- 強制的にinternalな入力デバイスとして認識させることには副作用があるかもしれません。たとえばラップトップの蓋を閉じると無効化されてしまう等。

## References

- [DWT not working on Sway with Apple BT Trackpad + wireless keyboard - libinput/libinput](https://gitlab.freedesktop.org/libinput/libinput/-/issues/524)
    - libinputのGitLab issue。ここにあった解決方法を採用。
    - 残念ながらlibinputでは外部トラックパッドに対するDWTは公式にはサポートされない模様
- [How to Diagnose Disable-While-Typing Issues](https://linuxtouchpad.org/libinput/2022/05/07/disable-while-typing.html)
    - 外部トラックパッドの話ではないが、DWTが効かない場合の対処法
- [Device quirks - libinput documentation](https://wayland.freedesktop.org/libinput/doc/latest/device-quirks.html)
    - libinputにおけるquirks（internal/externalなど）の設定方法