HP EliteBook Folio G1 + Ubuntuでタッチパッドを改善する

# HP EliteBook Folio G1とは
HPが2016年6月に発売したMacBook Airのような薄型ノートPCです。
12.5型 + 1kg未満の重量でキーボードが打ちやすく、個人的にとても気に入っています。

# Folio G1 + Ubuntuの構成だとタッチパッドに難あり
Folio G1にUbuntu 16.04をインストール（Windowsと併用）してメインOSとして使っているのですが、
Ubuntuだとタッチパッドが下記の通り思うように動作してくれませんでした。

* 手のひら検出（PalmDetect）がまったく働かない。
* キーボードを打つときは右の手のひらが常にタッチパッドに触れている状態になるため、
たびたびカーソルが移動／クリックを誤検出してウィンドウフォーカスが飛びまくってしまい、
満足にキー入力ができない状態。。。

* Synapticsの設定を色々といじってもダメで、ドライバをlibinputに変えても効果なし
* Windowsだとまったく問題ないので、H/Wの問題ではなくLinuxのドライバの問題と判断

仕方がないのでキーボードを打つときは右の手のひらを上に上げてキーを打つか、タッチパッドを一時的に
無効化しておかないと正直使い物にならないような繊細な挙動でした。

そんな中、一応回避策らしきものを見つけましたので暫定対策（ワークアラウンド）として挙げておきます。
※こんなことをしなくてもいずれOS側が真っ当に対応してくれることを期待していますがそれまでの繋ぎとして。

# そもそも入力デバイスをどのように認識しているのか
端末上でxinputを実行した結果です。

```
$ xinput
⎡ Virtual core pointer                    	id=2	[master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer              	id=4	[slave  pointer  (2)]
⎜   ↳ ALP000F:00 044E:120C                    	id=9	[slave  pointer  (2)]
⎜   ↳ AlpsPS/2 ALPS DualPoint TouchPad        	id=12	[slave  pointer  (2)]
⎜   ↳ AlpsPS/2 ALPS DualPoint Stick           	id=13	[slave  pointer  (2)]
⎣ Virtual core keyboard                   	id=3	[master keyboard (2)]
    ↳ Virtual core XTEST keyboard             	id=5	[slave  keyboard (3)]
    ↳ Power Button                            	id=6	[slave  keyboard (3)]
    ↳ Video Bus                               	id=7	[slave  keyboard (3)]
    ↳ Sleep Button                            	id=8	[slave  keyboard (3)]
    ↳ Intel HID events                        	id=10	[slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard            	id=11	[slave  keyboard (3)]
    ↳ HP Wireless hotkeys                     	id=14	[slave  keyboard (3)]
    ↳ HP WMI hotkeys                          	id=15	[slave  keyboard (3)]
```

AlpsPS/2（id=12と13）はいいとして、ALP000F:00 044E:120C（id=9）という謎のデバイスがあります。
/var/log/Xorg.0.logを見るとこのデバイスはpointerの入力クラス（event10）として認識していました。

```
[  3674.947] (II) config/udev: Adding input device ALP000F:00 044E:120C (/dev/input/event10)
[  3674.947] (**) ALP000F:00 044E:120C: Applying InputClass "evdev pointer catchall"
```

なおid=12のほうはtouchpadの入力クラス（event8）として認識しているようです。

```
[  3674.950] (II) config/udev: Adding input device AlpsPS/2 ALPS DualPoint TouchPad (/dev/input/event8)
[  3674.950] (**) AlpsPS/2 ALPS DualPoint TouchPad: Applying InputClass "evdev touchpad catchall"
[  3674.950] (**) AlpsPS/2 ALPS DualPoint TouchPad: Applying InputClass "evdev touchscreen catchall"
[  3674.950] (**) AlpsPS/2 ALPS DualPoint TouchPad: Applying InputClass "touchpad catchall"
[  3674.950] (**) AlpsPS/2 ALPS DualPoint TouchPad: Applying InputClass "Default clickpad buttons"
```

/usr/share/X11/xorg.conf.d/の10-evdev.confと50-synaptics.confを見ると、
確かにこのように認識する設定になっていますね。

問題はタッチパッドを操作するとこのpointerのデバイスの入力とみなされてしまい、touchpadの入力に
ならないことです。端末上でlibinput-debug-eventsを実行してタッチパッドを操作するとevent10の
イベントしか上がってこないことが分かります。

```
$ sudo libinput-debug-events 
            〜途中ログ省略〜
event10	POINTER_MOTION    +0.94s	 -0.63/  0.63
event10	POINTER_MOTION    +0.95s	  0.00/  0.89
event10	POINTER_MOTION    +1.01s	  0.00/  0.93
event10	POINTER_MOTION    +1.02s	  0.00/  1.32
                ：
```

なのでSynapticsの設定をいくら変えても効果がないのは、タッチパッドの入力イベントが全てpointerとして
処理されてしまっているからのようです（Synapticsを止めてlibinputを導入してもまったく同じです）。

じゃあということでpointer入力クラスの設定を10-evdev.confからコメントアウトしたり、
関連しそうなドライバをアンロード（sudo rmmod i2c_hid）して該当デバイスを無効化してみたところ、
今度はタッチパッドがまったく動作せずにっちもさっちもいかない状態に。。。

# 回避策

そんな感じで途方に暮れつつも試行錯誤したところ、下記PS/2マウスのドライバをリロードし直すと
touchpadの入力イベント（event8）が上がってくることを発見！

```
$ sudo rmmod psmouse
$ sudo modprobe psmouse
```
```
$ sudo libinput-debug-events 
            〜途中ログ省略〜
event8 	POINTER_MOTION    +0.70s	 -0.94/ -6.67
event8 	POINTER_MOTION    +0.71s	 -7.78/-11.53
event8 	POINTER_MOTION    +0.73s	-14.47/-14.47
event8 	POINTER_MOTION    +0.74s	-17.61/-12.48
                ：
```

touchpadの入力イベントが上がるようになった理由は不明ですが、この状態だとSynapticsの設定が
有効になり、手のひらを誤検出しないような設定を入れたところ望んだ挙動になりました。

私はsynclientコマンドで下記のように設定しています。
（50-synaptics.confだとTapButtonの設定方法が分からなかったもので）

```
$ synclient TapButton1=1
$ synclient TapButton2=3
$ synclient TapButton3=0
$ synclient VertScrollDelta=-80
$ synclient HorizScrollDelta=-80
$ synclient PalmDetect=1
$ synclient AreaTopEdge=300 AreaRightEdge=3500
```

ひとまずこのやり方で現在も凌いでいます。
もっとうまいやり方を知っている方がいたらぜひ教えて下さい :confounded: