2015/03/13

LinuxのX Window Systemでマウスボタンの割り当てを変更する

“たとえマウスの左右両方のボタンが壊れようと、私はこのマウスを使い続ける。” – kakurasan

GNU/LinuxのX Window Systemにおけるマウスボタンの割り当て変更の方法についてを扱う。

  1. マウスのボタンとその番号
  2. ボタン割り当て変更の概要
  3. xmodmapによる割り当て変更
    1. 割り当て変更の書式と記述例
      1. 割り当ての記述例
      2. 初期状態の割り当てを適用する記述
    2. 設定ファイルによる設定
    3. コマンド実行による設定
      1. 初期状態のボタン割り当てに戻すコマンド行
    4. 現在の設定を確認
  4. 2016/5/6追記:xinputによる割り当て変更

マウスのボタンとその番号

マウスボタンの割り当て変更をしていない状態では、ボタンの番号は以下のようになっている。

番号ボタン
1左ボタン
2中央ボタン
3右ボタン
4, 5上下ホイールのスクロール
6, 7左右ホイール(チルトホイール)のスクロール
8, 9多ボタンマウスのサイドボタン[1]
10以上多ボタンマウスの上記以外のボタン

しかし、手元の “5ボタン + チルトホイール” のマウスでは

  • チルトホイールの左右(6番と7番)が逆
  • サイドボタンの “戻る” “進む” (8番と9番)も逆

という挙動になっている。

ボタン割り当て変更の概要

X Window Systemでは、特定のコマンドを用いることでマウスボタンの割り当てを変更することができる。これにより

  • チルトホイールの左右の動作を逆にする
  • 追加ボタンの “戻る” “進む” の動作を逆にする

といったことをしたり、あるいはマウスの一部のボタンが寿命になってしまった(故障してしまった)ときに別の空いているボタンやチルトホイールの片方を割り当てたりしてその場をしのいだりできる。

実際、手元のマウスでは右ボタンが過去に故障してからサイドボタンの “戻る” で代用して年単位で使い、更に最近になって左ボタンまで壊れてしまったので3番(右クリック)をチルト右に移した上で1番(左クリック)をサイドボタンの “戻る” に割り当てて暫定的に使っている。[2]

(2016/8/25)ボタン割り当てを変更して使い続けたマウスは、その後右チルトホイールが壊れてこのボタンに割り当てた番号が超高速で連打されるような挙動をしだして作業にならなくなり、xinputの番号指定部分の中で(右チルトホイールに割り当てる番号として) “0” を指定することでキーボードのみの操作はできる状態にはなったが、今度は親指で押す場所に移動済みの左クリック(1番)のボタンの他、上下ホイールもうまく動かなくなってxAutoClickを駆使して何とか最低限のマウス作業をしていたのだが、Webブラウザでの操作がかなり不自由になってしまって我慢の限界となり、購入後9年半ほど経過した段階で使用を断念することになった。マウス交換によって左クリックを親指ではなく人差し指で,右クリックを中指で行う操作に戻ったのだが、この感覚がとても懐かしいような不思議な感じがする。

xmodmapによる割り当て変更

xmodmapコマンドが存在せずに実行できない場合は、ディストリの “xmodmap” というパッケージがあればそれをインストールし、Debian/Ubuntuでは “x11-xserver-utils” パッケージを検索・選択してインストールする。

割り当て変更の書式と記述例

xmodmapに渡すボタン割り当て変更の書式は

pointer = [1番として認識される物理ボタンの出力値] [2番として(以下同様)] [3番(略)] ...

で、初期状態の割り当てにおける出力値は

pointer = 1 2 3 4 5 6 7 8 9

のように表現される(認識ボタン数によって記述する値の数は異なり “見出し:現在の設定を確認” で確認可)。

割り当ての記述例

チルトホイールの左右の入れ替えのみを行う場合は

pointer = 1 2 3 4 5 7 6 8 9

のようにし、これに加えて追加ボタンの “戻る” “進む” を逆にする場合は

pointer = 1 2 3 4 5 7 6 9 8

のようにする。

初期状態の割り当てを適用する記述

初期状態の割り当てを適用するには

pointer = default

と記述する。

設定ファイルによる設定

上の “pointer =” の記述を含んだ内容をテキストファイルに保存し、その場所をxmodmapコマンドの引数に指定して実行することで設定は適用される。

(設定をファイルから読み込んで反映)
$ xmodmap [設定を記述したファイルの場所]

保存場所とファイル名については

[引用] xmodmap 1.0.8のmanページより
The filename specifies a file containing xmodmap expressions to be exe‐cuted. This file is usually kept in the user’s home directory with aname like .xmodmaprc.

とある通り、ホームディレクトリの下に.xmodmaprcなどの名前で配置してからxmodmapコマンドに渡すことになるが、ホームディレクトリの下に.Xmodmapという名前で保存するとデスクトップ環境などによってはログイン後に自動的に読み込まれることもある(確実ではない)。

コマンド実行による設定

設定は外部ファイルを指定する形だけではなくxmodmapの実行時に-eオプションを付けて記述することでも適用できる。

(設定を直接記述して反映)
$ xmodmap -e 'pointer = [値...]'

GUI環境にログインした際に自動実行されるように別途設定したスクリプトにこの記述を含めることで、確実にログイン時に自動的に設定を適用することができる。また、設定を試行錯誤する[3]際にもこの形での実行は便利(ファイルを編集・保存する必要がなく、端末内の操作のみで済む)。

初期状態のボタン割り当てに戻すコマンド行

設定値をミスした場合などには “見出し:初期状態の割り当てを適用する記述” の記述を用いて

(初期状態のボタン割り当てに戻す)
$ xmodmap -e 'pointer = default'

を実行することで簡単に初期状態の割り当てに戻すことができる。

現在の設定を確認

-ppオプションのみを付けてxmodmapコマンドを実行することで、現在のボタン認識数と割り当て設定を確認することができる。

(現在の割り当て状態を確認)
$ xmodmap -pp
There are 13 pointer buttons defined.

    Physical        Button
     Button          Code
        1              8
        2              2
        3              9
        4              4
        5              5
        6              3
        7              7
        8              6
        9              1
       10             10
       11             11
       12             12
       13             13

左の数字は認識されている順番のボタン(“見出し:マウスのボタンとその番号” の一覧と同じ)で、右の数字はそれに割り当てられている番号が表示される。左右の値が同じものは初期の割り当てと同じ。上の例では

  • 元々が1番のボタンが8番のボタンとして振る舞う
  • 元々が3番のボタンが9番…
  • 元々が6番のボタンが3番…
  • 元々が8番のボタンが6番…
  • 元々が9番のボタンが1番…

となっていることを示す。

2016/5/6追記:xinputによる割り当て変更

“xinput” パッケージが提供するxinputコマンドを用いることでもマウスボタンの割り当て変更ができる。xmodmapを使うと1番を別のボタンに割り当てた場合に自動連打ツールのxAutoClickを用いると自動的に押されるボタンの番号が変わる不具合が出るが、本ツールで割り当てを変更した場合は問題なく使用できる。ただし、事前にこのコマンドを--listオプション付きで実行することでマウスのデバイス名を取得した上で操作時にこれを指定する必要がある。

数字の並びの指定形式はxmodmapの “pointer =” の右側と同様[4]なので、xmodmapを使用して割り当てを変更していた場合は移行の際に数字部分をそのまま使える。

下の例は取得したマウスのデバイス名が “Foo Bar Mouse” としたものだが、実際にはxinputコマンドが出力したデバイス名を用いて操作を行う。

(マウスのデバイス名を取得)
$ xinput --list --name-only | grep ouse
Foo Bar Mouse

(現在のボタン割り当て設定を表示)
$ xinput get-button-map "Foo Bar Mouse"
1 2 3 4 5 6 7 8 9 10 11 12 13

(ボタン割り当て設定を変更)
$ xinput set-button-map "Foo Bar Mouse" 8 2 9 4 5 3 7 6 1

(変更後のボタン割り当て設定を表示)
$ xinput get-button-map "Foo Bar Mouse"
8 2 9 4 5 3 7 6 1 10 11 12 13

割り当て変更が自動的に適用されるようにしたい場合、GUI環境にログインした際に自動実行されるように別途設定したスクリプトの中で “set-button-map” の含まれるコマンド行を記述する。

使用したバージョン:
  • xmodmap 1.0.8 (x11-xserver-utils 7.7+2ubuntu1, 7.7+7)
  • xinput 1.6.2
[1]: マウスの脇にあるボタンで、Webブラウザやファイルマネージャなどの “戻る” “進む” として動作する
[2]: 新しいマウスは既に半年以上前に購入しているが、この記事が公開された時点ではまだ使うのが勿体無い/使う気になれないため、本記事公開時点では未開封
[3]: Xの端末アプリケーションからxevを実行し、出てきたウィンドウ内でボタンを押して端末に表示される “button [番号]” の値を見て動作を確認し、問題があれば設定を調整する、ということを繰り返す
[4]: ただし、割り当てを初期状態にするためには “1 2 3 4 5 …” の並びを指定する必要がある