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

関連記事:

エレコム トラックボール DEFT PRO

エレコム DEFT PRO

昨日、エレコムのトラックボールHUGEを卒業すると書いたので、早速本日、次のトラックボールを購入した。
もう狙いは付けてた。親指がすぐに疲れるので親指ボールタイプは嫌だしセンターボールタイプは苦手なのでこれまで同様に人差し指タイプのトラックボール。 で、Trackball Explorerに似たやつ。ボールは大きめ。こうなるともうアレしかない。またしてもエレコム。今度はDEFT PRO。それが上の画像のやつ。
DEFT PROより安いDEFT(無印)もあるが残念ながら小玉。DEFT PROでもTrackball Explorerより少し小さいくらいなのにDEFTはさらにひと回りふた回り小さいのでもう完全に好みから外れる。逆に中玉や大玉が苦手な人ならDEFTの方が合うかも。

エレコムは安い商品買うのでも勇気が要るが、DEFT PROは高いので「買うぞ」と決まっても勇気を振り絞らないと買えなかった。

エレコム DEFT PRO 1
DEFT PROのパッケージはこんなの。全体的に黒っぽい。

エレコム DEFT PRO 2
HUGEのパッケージより一回り小さい。

エレコム DEFT PRO 3
パッケージ正面はマグネットのフタになっていて開くと中が見える。これはHUGEも同じだった。

エレコム DEFT PRO 4
箱からひき出してみた。中身はトラックボール本体と説明書と有線接続用のUSBケーブルと電池。それと上の画像では見えないけどUSBの無線レシーバ。

エレコム DEFT PRO 5
USBの無線レシーバは電池の下に隠れてる。怪しい電池は使わないからということで電池外さずにそのまま捨てたらヤバい。

エレコム DEFT PRO 6
DEFT PROの裏面。右上の赤いところは指をここから突っ込むとボールが取れる。穴の大きさが十分なので良い、というか普通。ロジクールのMX ERGOが小さすぎて設計した人アタマおかしい。中段は左からDPI切り替えボタン、電源スイッチ兼パワーLow/High、Bluetoothのペアリングボタン。
その下が単3電池1本を入れる部分。フタは爪が弱い人は開けるの手こずるかも。
その下の四角い穴はマウスでもよく見かける持ち運び時等にUSBのレシーバを格納するところ。

エレコム DEFT PRO 7
ボールは左からDEFT PRO(直径44mm,53g)、Trackball Explorer(直径46mm,62g)、HUGE(直径52mm, 88g)。重量は怪しい計りで計測のため参考程度で。
この3つの中では大玉のHUGEは見た目にも明らかに大きい。球の大きさはHUGEが一番好みなんだがなぁ。
Trackball Explorerとボールの直径の差は僅かでも重量はDEFT PROのボールはかなり軽い。指の力が弱い人には良いかもしれないが、重い玉をゴロゴロさせるのが好きな人には合わないかも。

エレコム DEFT PRO 8
ボールを受けるカップ側。構造はHUGEと同じみたい。支持球の位置がちょっと違ってカップの縁近くに1つある。上の画像の中央上段にに白い点のようなのが見えてるのがそれ。HUGEと同じくカップが2分割される構造でその境に支持球が挟まるような形。なのでTrackball Explorerのように支持球を交換する際にカップの裏からドリルやリューターでが穴を開ける必要はないみたい。

エレコム DEFT PRO 9
ボールの側から見てみた。ボールの左側(上の画像ではボールの右側)はファンクション1(Fn1)ボタン。HUGEより大きくて軽いボタンになっていておそらく人差し指で押すことになる。HUGEではこの場所に小さくて堅いボタンが2つ(Fn1,Fn2)があったが、使いやすさではDEFT PROの方がまともそう。HUGEをセンターボールタイプのトラックボールのように持つならHUGEのFn1, Fn2も使い物になるかもしれない。
ボールの右側(上の画像ではボールの下側)が右ボタン。中指で操作することになる筈。
その隣(上の画像ではその左側)がファンクション2(Fn2)ボタン。このボタンはHUGEではFn3なのでボタン配置が違う。DEFT PROではFn2ボタンは薬指で操作することになる筈。

エレコム DEFT PRO 10
左からHUGE、DEFT PRO、Trackball Explorer。見たとおりでDEFT PROが一番本体が小さい。上の画像ではTrackball Explorerの左上の部分が一番高いように見えるが、実際はDEFT PROがTrackball Explorerより僅かに高いか同じ程度。つまりTrackball Explorerと同じような傾斜で人差し指が高く、小指が低くなるようになっている。

エレコム DEFT PRO 11
DEFT PROと手を離してみた。こんな感じ。見やすいように親指は上に上げている。握手ほどではないが掌の傾斜は自然な程度。ヘビーに使う人にはこれが重要。

エレコム DEFT PRO 12
普通に持つとこうなる。腕から手首は机の天板にしっかりと乗った状態。DEFT PROの上面に手を乗せて手の重量を全てDEFT PROに預ける。そして人差し指をボールの上に添える。このときに手首から人差し指の第2関節までがほぼ直線になれば疲れずに済む。DEFT PROは一応合格だと思う。
ただし、親指側は問題アリ。上の画像のように親指の力を抜くと親指が机の天板まで落ちてしまう。上の画像ではホイールの下のボタンが押しやすそうに見えるかもしれないが、実際は親指が机の天板の上にある状態だとボタンの下側のDEFT PROの縁が押せる程度。親指レストが無いのは何でかしら。HUGEには乗せ心地が悪いものの一応有るのに。他はかなりイイ線いってるのでこの点が凄く気になる。

エレコム DEFT PRO
ホイールはHUGEがほぼ無音で回転してカリカリ感が無いのに対してDEFT PROは音も感触もカリカリで連続して回すと重く感じる。もう少し軽い方が良いかな。ホイールのクリックも重いがとんでもなく重いわけでもない。ホイールの横方向(上の画像では上下方向)はあまり重くないので操作しやすい。ホイールの下が左クリック相当のボタン。ホイールの上は2分割されていてホイール左上が「進む」、ホイール右上が「戻る」。ここまではHUGEと同じ。DEFT PROでは左クリックボタンの右側にファンクション3(Fn3)ボタンがある。このボタンは小さいし場所も悪そうで使い物にならないかと思ったが、親指の第一関節の根本側あたりで押してやると使い物になるみたい。その下は無線2.4GHzとBluetooth4.0の切り替えスライドスイッチ。上の画像だと赤が見えているので無線2.4GHzになっている。
人差し指タイプのトラックボールは親指タイプと違ってボタン配置が特殊。これに慣れるのに場合によっては数日かかる。Trackball Explorerともボタン配置が違うので他の人差し指タイプからDEFT PROなら移行が楽かといえば必ずしもそうではない。

ここまで2.4GHzの無線で使ってみた。(ところで、Bluetoothも2.4GHzの無線だけどどう書けば良いのかしら?)
無線/Bluetoothで使う場合は電池駆動になるが連続動作時間(ひたすらトラックボールを操作し続けて)無線で134時間、Bluetoothで167時間となっている。(スイッチLow時)
仮にヘビーユーザーが1日15時間PCを触り、その1/5ほどがトラックボールを操作した時間とすると1日に3時間。すると無線では44日で電池が切れる計算になる。約1.5ヶ月。単3電池1本だから仕方ないかもしれないけど、ゲーマーなどはスイッチHighだろうし、使用時間も増えるだろうからもっと電池の持ちが悪いかも。全く触らないと待機時間は最長925日(2.5年)となっている。(この数字は意味ないけど)
電池交換が面倒ならDEFT PROはUSBケーブルで有線接続もできるのでありがたい。

先月購入したHUGEは個体不良だったらしくカップを削らないとボールがひっかかる状態だったが、今回購入したDEFT PROはさすがにハズレではなかったようで最初からボールの動きは軽い。ただ購入したばかりでボールの表面のコンディションが出来ていないので支持球との当たりがカスカスした感じ。脂が乗ってボールのコンディションができれば滑らかさが出る筈。
欲をいえば手の大きい人向けにあと5mm長い(人差し指を乗せる山部分から手首側方向が長い)バージョンが欲しい。

「Trackball Explorerの代わりを探している人に薦められるか?」と聞かれたら「HUGEはノーだがDEFT PROはイエス」と答えたい。ちょっと高いけど。

2019年6月19日追記
2.4GHzの無線で使っていて且つ毎日PCの電源をオフにする(電源オフでもUSBポートに電源を供給する機種の場合)と1週間〜9日ほどで(PCの電源オン & OS起動時に)トラックボールを認識しなくなる。その度にUSBドングルを抜き差しする。その次にトラックボールの電源をオフ・オンする。(順番逆はダメっぽい)
これが必要になるので面倒かも。PCの電源オフでUSBポートへの電源供給を停止する機種や24時間電源オンなら関係ないかも。

関連記事:
Up