どせいたんさき。

ナスダヨー

Linux でトラックポイントまわりの挙動を細かく設定したい

目的

Ubuntu 14.04 に ThinkPadbluetooth キーボードを接続して使用している.トラックポイント + 中ボタンでマウスホイール操作によるスクロールをしようとするときに,トラックポイントでカーソルを動かすタイミングによってはミドルクリックのペーストが先に認識されてしまうことが度々ある.トラックポイントに関係する細かいプロパティを設定することで,ミドルクリックペーストが暴発しないようにしたい.

解決方法

xinput から細かいプロパティを設定できる.

まずは以下のコマンドで自分が使っているデバイスについて確認する.

xinput list

自分の環境では以下のような出力が得られた.

⎡ Virtual core pointer                      id=2  [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4  [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=11  [slave  pointer  (2)]
⎜   ↳ TPPS/2 IBM TrackPoint                     id=13  [slave  pointer  (2)]
⎜   ↳ ThinkPad Compact Bluetooth Keyboard with TrackPoint  id=14  [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)]
    ↳ Power Button                              id=8  [slave  keyboard (3)]
    ↳ Integrated Camera                         id=9  [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=10  [slave  keyboard (3)]
    ↳ ThinkPad Extra Buttons                    id=12  [slave  keyboard (3)]

トラックポイントデバイスは id=13 と id=14 のエントリである.ここでは bluetooth 接続のキーボードを対象にするため id=14 のエントリについて詳細設定を確認する.

"ThinkPad Compact Bluetooth Keyboard with TrackPoint" の設定を確認する.

xinput list-props 14

ずらずらと設定項目が列挙される.マウスホイールに関係する設定項目を以下にまとめる.

  Evdev Wheel Emulation (386):  1
  Evdev Wheel Emulation Axes (387):  6, 7, 4, 5
  Evdev Wheel Emulation Inertia (388):  10
  Evdev Wheel Emulation Timeout (389):  200
  Evdev Wheel Emulation Button (390):  2

このうち "Evdev Wheel Emulation Timeout" がミドルクリックからスクロール操作へ移行するまでのタイムラグを表している.おそらくミリ秒だと思われる.

この値を大きくするとスクロール操作に移行するまで時間がかかるようになる.移行するまでのあいだにトラックポイントを動かしてしまうと瞬間的にミドルクリックとみなされペーストが暴発するようである.逆に,この値を小さくするとミドルクリックだと判定されるタイミングが相当シビアになる. 50 以下の値に設定したときにはまともにミドルクリックだと判定されなかった.

いくつか値を試してみたところ,自分には 100 くらいの値がちょうどよかった.

xinput set-prop 14 "Evdev Wheel Emulation Timeout" 100

再び設定を list-prop してきちんと設定されているかを確認する.

xinput list-props 14
  Evdev Wheel Emulation (386):  1
  Evdev Wheel Emulation Axes (387):  6, 7, 4, 5
  Evdev Wheel Emulation Inertia (388):  10
  Evdev Wheel Emulation Timeout (389):  100
  Evdev Wheel Emulation Button (390):  2


ただしこの方法だと bluetooth 接続をやり直すたびにリセットされるはず.恒常的に有効にするためには接続時に読み込まれるファイルに適切なオプションを書き込む必要がある. Ubuntu 14.04 では /usr/share/X11/xorg.d.conf/ に設定ファイルがある.自分の環境では 11-evdev-trackpoint.conf という名前だった.ここの設定を参考にして以下のオプションを設定した.

--- 11-evdev-trackpoint.conf.orig  2015-03-09 07:12:09.499310550 +0900
+++ 11-evdev-trackpoint.conf  2015-03-09 07:13:02.119311744 +0900
@@ -1,13 +1,14 @@
 # trackpoint users want wheel emulation

 Section "InputClass"
   Identifier  "trackpoint catchall"
   MatchIsPointer  "true"
   MatchProduct  "TrackPoint|DualPoint Stick"
   MatchDevicePath  "/dev/input/event*"
   Option  "Emulate3Buttons"  "true"
   Option  "EmulateWheel"  "true"
   Option  "EmulateWheelButton"  "2"
+  Option  "EmulateWheelTimeout" "150"
   Option  "XAxisMapping"  "6 7"
   Option  "YAxisMapping"  "4 5"
 EndSection