uchan note

プログラミングや電子工作の話題を書きます

タッチパッドに手のひらが触れてカーソルが動くのを防止する

タイピング中に手のひらがタッチパッドに触れて、マウスカーソルが動いてしまったりクリックしてしまうことがある。それを防ぐために、タッチパッドの両端を無効化する方法を説明する。Ubuntu 15.04 で動作確認しているが、その他の Linux でも同様の方法が使えるはず。

タッチパッドを改善する方法

MacBook を使ったことがある方ならタッチパッドMac の世界ではトラックパッドと呼ぶ)の精度がとても高いことを知っているだろう。まだ触ったことがないなら家電量販店で試してみよう。MacBook のそれが他の PC に比べて 如何に気持よく操作できるか が分かるから。

だが、我々が使いたいのは Linux である。ハードとソフトをまとめて開発し、GUI の操作性に他の何よりもこだわっている Mac のような精度は期待できない。それでも、タイピング中にタッチパッドに手のひらが触れて誤動作するのを防ぐ方法はある。大きく 2 種類のやり方が考えられる。(他に良いやり方があれば是非教えてください)

タッチパッドを無効化する作戦

タッチパッドの無効化は syndaemon を使って達成できる。例えばこんな記事があった:Xfce4.4にてタイピング中のタッチパッドDisable設定

試してみたところ、期待通りにキーボード入力から一定時間、マウスカーソルが動かなくなった。ただし、syndaemon はデフォルトでポーリングにより動作しており、ときどき判定をすり抜けてマウスカーソルが動くことがある。-R オプションを付けてイベント駆動にするのが良さそうだ。最終的に次のコマンドに落ち着いた。

$ syndaemon -i 0.5 -R

これをシステムの起動時に自動起動させれば良い。ただし、X 環境が立ち上がってから実行しないと can't open display というエラーになるので、X が立ち上がるまで待つスクリプトを書くなど工夫が必要だ。(そんなに難しくはない)

感知範囲を制限する作戦

無効化作戦は、キー入力の後一定時間はタッチパッドの操作が効かなくなる微妙な欠点がある。やりたかったのは手のひらによる誤動作を防ぐことであって、タッチパッドを無効化すること ではない

そこで、タイピング中にタッチパッド 全体 を無効化するのではなく、常に 両端だけ を無効化してみる。ホームポジションに構えたとき、手のひらが当たるのは両端だけだから、これで上手く行きそうだ。参考にした記事:XPS 13 (もちろん、スプートニク!)でタッチパッドを無効にして誤動作を防ぐベストな方法

手のひら全体がタッチパッドに当たるような変則的なホームポジションを使っている、もしくはタッチパッドの位置が横にずれているなら、この方法は使えなさそうだ。その場合は手のひら検出が有効かもしれない。

話をもどし、両端を無効化するには、まずタッチパッドのサイズを知る必要がある。なぜなら、設定はタッチパッド左上からの座標 で指定するからだ。

$ grep range /var/log/Xorg.0.log

これで X 軸(と Y 軸)の範囲が分かる。筆者の環境では x-axis range 0 - 2880 だった。

Ubuntu 18.04 ではどうやらこのログファイルが存在しないようだ。Ubuntu 18.04 でのタッチパッドのサイズの調べ方を本文最後に付け足した。

次に、synclient コマンドで無効化の範囲を調整する。

$ synclient AreaLeftEdge=200 AreaRightEdge=2600

これで 0-200 と 2600-2800 の範囲が反応しなくなるはずだ。右端は X 軸の最大値から無効化したい幅を引いた値にする。

起動時に自動的に設定する

synclient による設定は一時的に実験するには便利だが、再起動により失われてしまう。永続化するには X11 の設定ファイルに記述すればよい。

/etc/X11/xorg.conf.d/50-synaptics.conf

    Section "InputClass"
            Identifier "touchpad catchall"
            Driver "synaptics"
            MatchIsTouchpad "on"
            MatchDevicePath "/dev/input/event*"

            Option "AreaLeftEdge" "200"
            Option "AreaRightEdge" "2600"
    EndSection

大事なのは 2 つの Option だ。その他の行は 元のまま変更しない でおく。

設定ファイルが /etc/X11/xorg.conf.d に無い場合(またはディレクトリさえ無い場合)には次のようにコピーしてから編集するとよい。なぜなら、/usr/share/X11/xorg.conf.d にある設定ファイルはシステムアップデートなどで勝手に変更されることがあるからだ。同じ設定項目は /etc/X11/xorg.conf.d にある方が優先される。参考:Where did /usr/lib/X11/xorg.conf.d/10-synaptics.conf go?

$ sudo mkdir -p /etc/X11/xorg.conf.d
$ sudo cp /usr/share/X11/xorg.conf.d/50-synaptics.conf /etc/X11/xorg.conf.d

関係ないが、bash の場合は cp の行を省略して次のように書ける。

$ sudo cp /{usr/share,etc}/X11/xorg.conf.d/50-synaptics.conf

この設定を行えば、システムを再起動させてもタッチパッドの両端が無効になるはずだ。

Ubuntu 18.04 でのタッチパッドのサイズの調べ方

Ubuntu 18.04 では /var/log/Xorg.0.log が存在せず、上記の方法だとタッチパッドのサイズを知ることができない。そんなときは synclient コマンドの出力からタッチパッドのサイズを推測できる。

    LeftEdge                = 112
    RightEdge               = 2688
    TopEdge                 = 98
    BottomEdge              = 1722

synclient の出力の中に上記の行があるはずだ。確信はないが、112 - 2688 が、横方向で指定できる値の範囲だと思われる。信憑性は定かではないが Ubuntu の質問サイトにもそのように書いてあった