Kensington Expert Mouse 5 USBをX11で使う方法

トラックボールの名機と呼ばれるKensington Expert Mouse 5(EM5)をX11で使おうとしたが問題が発生した。

まず、EM5には4つのボタンがあり、それぞれのボタンはデフォルトでは以下のように割り当てられている:

.---------. .---------.
| Middle  | | Back    |
`---------' `---------'
.---------. .---------.
| Left    | | Right   |
`---------' `---------'

これら4つのボタンとホイールのX、Y軸それぞれの正方向、負方向のスクロールを合わせて8ボタンのマウスの扱いになる。

この割り当てを以下のように変更した上で、左クリックと右クリック同時押しで中央クリック、進むボタンを押しながらカーソル移動をスクロールに割り当てたい。

.---------. .---------.
| Middle  | | Forward |
`---------' `---------'
.---------. .---------.
| Left    | | Right   |
`---------' `---------'

これを実現するためにxorg.confでevdevの設定を以下のようにした:

Section "InputClass"
    Identifier "Kensington USB/PS2 Expert Mouse"
    MatchIsPointer "on"
    MatchProduct "Kensington USB/PS2 Expert Mouse"
    Driver "evdev"
    Option "ButtonMapping" "1 8 3 4 5 6 7 9 2"
    Option "Emulate3Buttons" "on"
    Option "Emulate3Button" "9"
    Option "EmulateWheel" "on"
    Option "EmulateWheelButton" "8"
    Option "EmulateWheelInertia" "10"
    Option "XAxisMapping" "6 7"
    Option "YAxisMapping" "4 5"
EndSection

しかし 8ボタンマウス として認識しているため、ButtonMapping の設定値で最後の 2 が無視されて 1 8 3 4 5 6 7 9 になってしまう。 そのため中央クリックのエミュレーションでボタン2(中央ボタン)ではなく、ボタン9(進むボタン)のイベントが送信されてしまう。

マッピングxinput コマンドで確認できる:

$ xinput get-button-map "Kensington USB/PS2 Expert Mouse"
1 8 3 4 5 6 7 9

今回これを回避するためにソースを編集してボタン数を btnmap の長さ(32)で決め打ちして回避した。

パッチを当てるとマッピングは以下のようになった:

$ xinput get-button-map "Kensington USB/PS2 Expert Mouse"                                 
1 8 3 4 5 6 7 9 2 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 0 

また、以前の記事でも、中央クリックのエミュレーションをマッピングの変更とともに使用するためのパッチを書いたが、これは中央ボタンの物理ボタン番号を指定する Emulate3Button の設定が実装されて不要になった。

なお、シリアルポート版のEM5をPS/2で使う場合はパッチは必要なく、以下の設定で同じ動作が可能:

Section "InputClass"
    Identifier "ThinkPS/2 Kensington ThinkingMouse"
    MatchIsPointer "on"
    MatchProduct "ThinkPS/2 Kensington ThinkingMouse"
    Driver "evdev"
    Option "ButtonMapping" "1 8 3 4 5 6 7 2 9"
    Option "Emulate3Buttons" "on"
    Option "Emulate3Button" "8"
    Option "EmulateWheel" "on"
    Option "EmulateWheelButton" "9"
    Option "EmulateWheelInertia" "10"
    Option "XAxisMapping" "6 7"
    Option "YAxisMapping" "4 5"
EndSection