Linuxでのタッチパッドの誤動作の防止

概要
ThinkPad E-550にLinuxディストリビューションのUbuntu 20.04をインストールして使っている。
キーボードからキーを入力していると,親指の付け根あたりの手のひらがタッチパッド (touchpad) に接触し,勝手にマウスクリックされてしまうことに気付いた。入力中にカーソルが勝手に移動して,違う場所に入力されてしまう。非常にいらいらして作業効率が落ちるので,この誤動作・誤操作の解決策を調べた。
基本的に,「タッチパッドに手のひらが触れてカーソルが動くのを防止する – uchan note」に記されている内容に従えばいい。よくわからないところがあったので,そこを追加で調べて整理した。
設定プロパティ
まず,基本知識として,LinuxのGUIはXorgというX Window System version 11のリファレンス実装で実現されている。従って,GUIのインターフェイスであるタッチパッドやマウス,キーボードなどもXorgを介して処理される。
特に,Xorgの中でタッチパッドを制御するドライバーがsynapticsとなっている (参考: man 4 synaptics)。
したがって,タッチパッドの制御はXorgのsynapticsドライバーを経由して行う。
今回はタッチパッドの両端へのタッチを無効化することで,入力中の誤操作を防止する。
これに関する設定は以下の項目となる。
LeftEdge, RightEdge, TopEdge, BottomEdge: 対応するタッチパッドの境界の座標。AreaLeftEdge, AreaRightEdge, AreaTopEdge, AreaBottomEdge: 動作を無視する境界を指定する。この座標の外側のエリアでの操作を無視してくれる。
まず,LeftEdge, RightEdge, TopEdge, BottomEdge (以後*Edgeと表記) の4プロパティで現在のタッチパッドの領域が定義されている。デフォルトだと,タッチパッドの全面領域が指定されている。
続いて,AreaLeftEdge, AreaRightEdge, AreaTopEdge, AreaBottomEdge (以後Area*と表記) の4プロパティで可動領域を指定できる。デフォルトだとこの4プロパティは設定されていない。このプロパティを指定することで,両端だけタッチパッド操作を無効化できる。
ただし,このArea*プロパティは*Edgeプロパティの範囲内で指定する必要がある。なぜならば,Area*プロパティの範囲は*Edgeプロパティの範囲内にしないと,タッチパッド全面が可動領域となり,設定していないのと同じだからだ。
そのため,まずは*Edgeプロパティの値を把握する。
現在値の確認
synapticsドライバーの現在のプロパティはsynclientコマンドで確認できる。synclientコマンドはsynapticsドライバーのコマンドラインツールとなっている (参考: man 1 synclient)。このコマンドで,現在のプロパティを表示したり,設定できる。
以下のコマンドで今回関係あるプロパティのみを表示することができる。
synclient | grep Edge LeftEdge = 160
RightEdge = 3861
TopEdge = 128
BottomEdge = 2246
VertEdgeScroll = 0
HorizEdgeScroll = 0
AreaLeftEdge = 0
AreaRightEdge = 0
AreaTopEdge = 0
AreaBottomEdge = 0最初の4行にある通り,現在のタッチパッドは (160, 128), (3861, 2246) の領域となっている。
設定値の検討
現在のタッチパッドの領域 (*Edge) がわかったので,Area*プロパティによる無効化の範囲を調整する。
以下のコマンドのように,synclientコマンドの引数にプロパティと値を指定することで,即座に値を確認できる。
synclient AreaLeftEdge=500 AreaRightEdge=3500
設定を変更して,動作を確認して最適な値を検討する。
LeftEdge=160, RightEdge=3861だと,AreaLeftEdge=500 AreaRightEdge=3500が丁度よかったのでこの設定を今回は採用する。
設定の永続化
synclientコマンドの設定は,一時的なものとなっている。OS起動時に毎回実行してもいいのだが,Xorgの設定ファイルを使うと簡単に永続化できるので,こちらで永続化の設定を行う (参考: man 5 xorg.conf)。
システムにデフォルトでインストールされているsynapticsドライバーのXorgの設定は/usr/share/X11/xorg.conf.d/70-synaptics.confで指定されている。
Xorgの設定は少々小難しいので,こちらの設定ファイルを流用する。/usr/share配下はOSのパッケージマネージャーの管理下にあり,バージョンアップにより上書きされる。
そのため,設定ファイルの冒頭に記載されているコメントの通り,直接編集せずに,このファイルを/etc/X11/xorg.conf.d/にコピーして編集する。なお,ファイル名の先頭の70は読み込み順のためのものであり,それ以外に特に深い意味はない。拡張子が.confであればファイル名は何でも大丈夫だ。
sudo mkdir -p /etc/X11/xorg.conf.d
sudo cp /usr/share/X11/xorg.conf.d/70-synaptics.conf /etc/X11/xorg.conf.d/続いて,コピーした70-synaptics.confの設定ファイルを編集する。以下のように,最初のSectionブロックの末尾に,synclientコマンドで検討したプロパティと値を追記する。残りのSectionは使わないので削除する。
# Example xorg.conf.d snippet that assigns the touchpad driver
# to all touchpads. See xorg.conf.d(5) for more information on
# InputClass.
# DO NOT EDIT THIS FILE, your distribution will likely overwrite
# it when updating. Copy (and rename) this file into
# /etc/X11/xorg.conf.d first.
# Additional options may be added in the form of
# Option "OptionName" "value"
#
Section "InputClass"
Identifier "touchpad catchall"
Driver "synaptics"
MatchIsTouchpad "on"
# This option is recommend on all Linux systems using evdev, but cannot be
# enabled by default. See the following link for details:
# http://who-t.blogspot.com/2010/11/how-to-ignore-configuration-errors.html
MatchDevicePath "/dev/input/event*"
Option "AreaLeftEdge" "500"
Option "AreaRightEdge" "3500"
EndSection
以上で永続化の設定が完了となる。次回のOSの起動後から設定が反映される。
注意点
OSの更新などでタッチパッドの境界 (*Edge) が若干変わることがあるので,注意する。
例えば,先日OSを更新すると値が一時的に以下のようになっていた。
synclient | grep Edge LeftEdge = 1305
RightEdge = 4764
TopEdge = 2623
BottomEdge = 4666
VertEdgeScroll = 0
HorizEdgeScroll = 0
AreaLeftEdge = 500
AreaRightEdge = 3500
AreaTopEdge = 300
AreaBottomEdge = 0ただし,OSを再起動すると値が元に戻っていた。一度再起動して元に戻らなければ,新しい*Edge値に合わせてArea*を設定し直す。
結論
Linux (Ubuntu 20.04) でのタッチパッドの誤操作の防止方法を記した。
Linuxはデバイス周りでトラブルになりやすい。Xorgを介して設定するのだが,この設定はあまり普段編集しないので,慣れない。
今回はOSの更新時に境界の値が一時的に変更されていて,戸惑った。設定自体は何年前に行っていたのだが,この機会に自分でも整理した。
次回以降はこちらに記載した内容でスムーズに対応したい。
