Linuxでマウス/トラックボールのボタン割当て変更

人差し指トラックボール
©いらすとや.

いまどきのマウスやトラックボールは多機能で多ボタンが多い。
Windows用にはマウスメーカーが提供するボタン割当変更ソフトなんてのが付いていたりウェブサイトで提供されてたりするが、Linuxでは大抵はメーカーからその手のアプリは提供されない。
それでも、多くは特に設定不要で左右ボタン「進む」「戻る」とホイール回転によるスクロール、ホイールの水平スクロールは機能する。問題はホイールクリックとマウス/トラックボールの機種固有のファンクションボタンへの機能割当て、それから割り当てられている機能を変更すること。

X Windowの現在の設定を見る

$ xinput list
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ ELECOM TrackBall Mouse DEFT Pro TrackBall id=12   [slave  pointer  (2)]
⎜   ↳ Logitech USB Keyboard                     id=15   [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)]
    ↳ Sleep Button                              id=9    [slave  keyboard (3)]
    ↳ UVC Camera (046d:0825)                    id=10   [slave  keyboard (3)]
    ↳ ELECOM TrackBall Mouse DEFT Pro TrackBall id=11   [slave  keyboard (3)]
    ↳ ELECOM TrackBall Mouse DEFT Pro TrackBall id=13   [slave  keyboard (3)]
    ↳ Logitech USB Keyboard                     id=14   [slave  keyboard (3)]

今回はELECOMのトラックボール DEFT PROを設定したいのだが、DEFT Proが3行表示されている。とりあえず右列のslave pointerの行を見てデバイスのIDを求める。今回はid=12になっていたので12がそれ。
xinput get-button-mapの後に求めたデバイスIDの12を指定して実行。同じデバイス名が複数表示されていない場合はデバイスのIDではなくそのデバイス名をクォーテーションで括って指定する。(その方がデバイスIDが変化した場合にも追随しやすい。特に設定ファイルに書く場合)

$ xinput get-button-map 12
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

1〜16の何かの操作可能な部分があるっぽい(当てにはならないが)。その割当ては数字が順に並んでいるだけなので機能の重複や入れ替えが既に行われているわけではなさそう。

マウス/トラックボールのボタンの無効化や入れ替え

マウス/トラックボールの何も押さずに実行

$ xinput query-state 12
2 classes :
ButtonClass
        button[1]=up
        button[2]=up
        button[3]=up
        button[4]=up
        button[5]=up
        button[6]=up
        button[7]=up
        button[8]=up
        button[9]=up
        button[10]=up
        button[11]=up
        button[12]=up
        button[13]=up
        button[14]=up
        button[15]=up
        button[16]=up
ValuatorClass Mode=Relative Proximity=In
        valuator[0]=426
        valuator[1]=16
        valuator[2]=5
        valuator[3]=-3748

button[1]〜button[16]の全てがup(押されていない)であることを確認。

次に、マウス/トラックボールの「左クリック」[L]ボタンを押しながら実行。

$ xinput query-state 12
2 classes :
ButtonClass
        button[1]=down
        button[2]=up
        button[3]=up
        button[4]=up
        button[5]=up
        button[6]=up
        button[7]=up
        button[8]=up
        button[9]=up
        button[10]=up
        button[11]=up
        button[12]=up
        button[13]=up
        button[14]=up
        button[15]=up
        button[16]=up
ValuatorClass Mode=Relative Proximity=In
        valuator[0]=407
        valuator[1]=14
        valuator[2]=5
        valuator[3]=-3748

これでbutton[1]=downになったので[L]ボタンはbutton[1]と解った。
同様に違うボタンを押してbutton[ID]を調べる。

調べた結果

button[1]: [L]
button[2]: ホイールクリック
button[3]: [R]
button[4]:
button[5]:
button[6]:
button[7]:
button[8]: [→](戻る)
button[9]: [←](進む)
button[10]: [Fn1]
button[11]: [Fn2]
button[12]: [Fn3]
button[13]:
button[14]:
button[15]:
button[16]:

ホイールの左倒し右倒しは機能するのにxinput query-stateでは検出されなかった。

個人的には特別なアプリを除いて通常はホイールクリックは要らない。また、DEFT PROでは右クリックが(若干)押しにくくその隣の薬指で押す[Fn2]に特に与えたい機能があるわけではなので[Fn2]も右クリックにしたい。

割当て変更はxinput set-button-mapで行う。
$ xinput set-button-map 12 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
これだと初期値だが、button[2]を無効にしてbutton[11]をbutton[3]と同じにしたいということになるので
$ xinput set-button-map 12 1 0 3 4 5 6 7 8 9 10 3 12 13 14 15 16
こうする。
人によってはホイールクリックに[Home]を当てる等したいということがあるかもしれない。その場合はbutton[2]は触る必要がないので
$ xinput set-button-map 12 1 2 3 4 5 6 7 8 9 10 3 12 13 14 15 16
(これは後で)

セット後すぐには有効にならないかもなので少し待ってから確認する。

$ xinput --get-button-map 12
1 0 3 4 5 6 7 8 9 10 3 12 13 14 15 16

これでホイールクリックをして何もなく、[Fn2]を押したときに右クリックと同じようにメニューウインドウが表示されれば割当変更は成功。

このままだとシステムを再起動するなどでxinputが未実行状態になるので起動時に自動実行されるようにする。先の設定コマンドxinput set-button-map ‥‥ 1行を自身のホームディレクトリの.profileファイルの末尾などに追記する。

上のxinput query-stateでボタンの対応確認は面倒なので、もしxevが使えるのであればその方が簡単かも。
Event Testerという窓が開くのでその上でマウスのボタンを押す。
コンソールの表示を見ながらマウス/トラックボールのボタンを操作する。

$ xev
Outer window is 0x4e00001, inner window is 0x4e00002

PropertyNotify event, serial 8, synthetic NO, window 0x4e00001,
    atom 0x27 (WM_NAME), time 3824318, state PropertyNewValue

PropertyNotify event, serial 9, synthetic NO, window 0x4e00001,
    atom 0x22 (WM_COMMAND), time 3824318, state PropertyNewValue

中略

マウスのボタンを押す

ButtonPress event, serial 40, synthetic NO, window 0x4e00001,
    root 0x140, subw 0x4e00002, time 4238242, (33,26), root:(33,1591),
    state 0x10, button 12, same_screen YES

押した瞬間の表示を見る。ボヤボヤしてるとログがどんどん流れるかも。
この場合は押したボタンが黄色部分(button 12)と認識された。

マウス/トラックボールのボタンに機能を割り当てる

X Window System用の仮想キーボードxvkbdをインストールする。(方法は省略)
キーバインドを変更するxbindkeysをインストールする。(方法は省略)

今回はDEFT PROのボール左側にあるFn1に[Ctrl]+[Ins](コピー)を、左クリックボタンの隣で親指の根本側にあるFn3に[Shift]+[Ins](ペースト)を割り当てる。何故[Ctrl]+[c]、[Ctrl]+[v]じゃないかというと、これらはLinuxでは別の役割のショートカットが割り当てられることが多いので[Ctrl]+[Ins](コピー)や[Shift]+[Ins](ペースト)の方が良いかなと思ったので。個人的にはこのショートカットをキーボードで使うし。ちなみにカットは[Shift]+[Del]ね。これらは右手だけで使えるショートカットなのでWindowsの人も覚えると役に立つと思う。

自身のホームディレクトリにxbindkeys用の設定ファイルを作成する。

~/.xbindkeysrc (新規ファイル)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Fn1: [Ctrl]+[Ins](Copy)
"xvkbd -xsendevent -text 'C[Insert]'"
b:10        #button[10]

# Fn3: [Shift]+[Ins](Paste)
"xvkbd -xsendevent -text 'S[Insert]'"
b:12        #button[12]

# Wheel Click: [Home]
"xvkbd -xsendevent -text '[Home]'"
b:2        #button[2]

設定ファイルは書き方とても簡単。
Cは[Ctrl]キー、Sは[Shift]キーの省略系。挿入キーはそのまま[Insert]と書く。(それぞれ前にバックスラッシュを付ける)

多くの場合は上の設定で問題無いようだが、一部のアプリだけでボタンが効かないということがあるみたい。試した範囲ではどうもxvkbdだとダメっぼい。そこでxvkbdの代わりにxteを使う設定も作ってみた。ついでにマウスボタンを押してリリースで発動に変更。xteがシステムに無い場合はxautomationをインストールする。(方法は省略)

~/.xbindkeysrc
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# Fn1: [Ctrl]+[Ins](Copy)  button[10]
#"xvkbd -xsendevent -text '[Control][Insert]'"
"xte 'keydown Control_R' 'key Insert' 'keyup Control_R'"
b:10 + Release

# Fn3: [Shift]+[Ins](Paste) button[12]
#"xvkbd -xsendevent -text '[Shift][Insert]'"
"xte 'keydown Shift_R' 'key Insert' 'keyup Shift_R'"
b:12 + Release

# Wheel Click: [Home]  button[2]
#"xvkbd -xsendevent -text '[Home]' "
"xte 'key Home'"
b:2 + Release
$ xbindkeys -s
設定内容が表示されること
$ xbindkeys   #xbindkeysを実行

先の方でやったようにホイールクリックを無効にしてたら[Home]キーの割当ては効かない。 このページの割当て変更はあくまで参考なので、使い易くないと思ったら自分に合うように好きに変えて欲しい。

このままだとシステムを再起動するなどでxbindkeys未実行状態になるので起動時に自動実行されるようにする。実行コマンドxbindkeys ‥‥ 1行を自身のホームディレクトリの.profileファイルの末尾などに追記する。先に記入したxinputの行の次あたりでOK.
本来はX Window起動後に実行するという意味で.xinitrcなどに書くのが筋だとは思うけど、.xinitrcはよく解らないで迂闊に触ると怖いので.profileに書くようにしている。どうせX Windowが起動してからでないとログインしないので通常は問題ない。

設定したら再ログインするなりシステムを再起動するなりしてマウス・トラックボールのボタンに割り当てた操作が効くことを確認する。

GUIで設定できるEasystrokeとかあるけど、結果的にこっちの方が簡単な気がする。

余談

人差し指タイプ、親指タイプ、センターボールタイプでそれぞれ1つずつ挙げたけど、これら3種類のトラックボールは「トラックボール」だといっても全く別物。それぞれマウスとトラックボールくらい違うと思って良い。利用環境や自分の手に合うタイプを考慮した上でさらに手にしっくりくるモデルを選ぶことが大事。例えば親指を動かすとすぐに疲れる人がいるが、そういう人が親指を酷使する親指タイプを選んだらダメだし、大画面とか複数画面で使う人が小玉タイプを選ぶのもダメ。間違って選ぶと後悔するので注意。

関連記事:

コメント: Linuxでマウス/トラックボールのボタン割当て変更

  1. すごくわかりやすかったです。
    わたしにもできた。

  2. おめでとうございます。
    マウスのボタンカスタムは需要が多いのでもっと簡単にできるようになると良いんですけどね。

コメントは締め切られています。