ubuntu 16.04 にてマウスのリマップ

f:id:htn_hs:20180716232848j:plain
マウスはキーボードの左側
 キーボードの右側は矢印やテンキーなどがあってマウスまでが遠いため, 右利きでもマウスは左手で操作しています.

 使っているKensingtonのマウスはWindowsMacではドライバの設定を変更することで左手用にボタンの役割を変更することができます.

 一方, ubuntuではマウスだけで簡単に設定できるような専用のドライバは存在しません. 調べてみると入力デバイスの設定ユーティリティであるxinputリマップさせるスクリプトを組んでブート時に実行させる事例が多いようです. しかし複数台でマウスやキーボードを共有させる場合は切り替える都度スクリプトが実行してくれないとリマップは有効になりません.

 そこでデバイスの認識時にリマップさせるスクリプトを実行させ,快適に左手マウスを使えるようにしました.


■ xinputによるリマップ

リマップのスクリプトを組むまでの手順は以下.

  1. xinputのインストール
  2. マウスボタンの番号確認
  3. 実際にリマップしてみる

1. xinputのインストール

$ sudo apt-get install xinput

xinputの動作を確認.

~$ xinput list # 認識されているデバイスのリストを表示
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Kensington Expert Wireless TB             id=10   [slave  pointer  (2)]
⎜   ↳ Gaming KB  Gaming KB                      id=11   [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)]
    ↳ Eee PC WMI hotkeys                        id=9    [slave  keyboard (3)]
    ↳ Gaming KB  Gaming KB                      id=12   [slave  keyboard (3)]

 今回はid=10Kensington Expert Wireless TBのマップを変更します.

 以降,Kensington Expert Wireless TBは目的のデバイス名に変更してください.

2. マウスボタンの番号確認

ボタンのマップを確認

$ xinput get-button-map "Kensington Expert Wireless TB"
1 2 3 4 5 6 7 8 9 10 11 12 13 

 1が主ボタン,3が副ボタン,...,とそれぞれの番号に役割が振られています.
デフォルトでは1から昇順になっています.

 どのボタンが何番目に対応するか確認

$ xinput test "Kensington Expert Wireless TB"
button press   1 
button release 1 
button press   3 
button release 3 
...

リマップ前は左図のようになっていました. これを右図のように,右側を主ボタン,左側を副ボタンとなるように変更します.

f:id:htn_hs:20180717201037j:plain:w200f:id:htn_hs:20180717201033j:plain:w200
ボタンマップ(左:変更前,右:変更後). 1は主ボタン,3は副ボタンを意味する.

 実際にリマップさせるコマンドは次.

$ xinput set-button-map "Kensington Expert Wireless TB" 3 3 1 4 5 6 7 1 

 1 2 3 ... と昇順になっていたのを変えてあげれば良いだけです. これで無事左手用にリマップされました.

 しかし,これではPCの再起動やマウスの抜き差しをするたびにリセットされてしまいます. 再起動に対しては「自動起動するアプリケーションの設定」に追記すれば解決するのですが、抜き差しに対しては意味ありません。

 そこで、マウスを認識したらコマンドが実行されるように工夫する必要があります。

■ udevによる認識時のリマップ

 udevというデバイス管理ツールを使えば,マウスの認識時にリマップコマンドを叩かせることができます.

具体的な手順は以下.

  1. .ルールの作成
  2. スクリプトの作成

参考リンク6の内容をほぼそのまま使わていただきました.

1. ルールの作成

 udevの動作は/etc/udev/rules.d配下に置かれたruleファイルで設定が可能です.

※正しいrulesファイルの書き方は参考リンク9をご覧ください.

$ sudo touch /etc/udev/rules.d/90-myrule.rules

mouse.rulesの中身を次のように編集します.

ACTION=="add", ATTRS{name}=="Kensington Expert Wireless TB", RUN+="/usr/local/bin/remap.sh"

 マウスが認識されたら/usr/local/bin/remap.sh を実行させるという内容です.
1行で書くというのも仕様なので注意してください.

2. スクリプトの作成

実際に実行させるスクリプトは2つ用意します.

$ sudo touch /usr/local/bin/remap.sh
$ sudo touch /usr/local/bin/remap_mouse.sh
$ sudo chmod 700 /usr/local/bin/remap.sh
$ sudo chmod 700 /usr/local/bin/remap_mouose.sh

remap.shの中身を次のように編集します.

#!/bin/sh
at now -f /usr/local/bin/remap_mouse.sh

remap_mouse.shの中身を次のように編集します.

#!/bin/sh
DISPLAY=":0.0"
USER="user_name" # ユーザー名に変更する
HOME=/home/$USER/
export HOME DISPLAY
DEVICE_NAME="Kensington Expert Wireless TB"

for i in `seq 0 9`
do
        if /usr/bin/xinput list | grep -q "$DEVICE_NAME"; then
                /usr/bin/xinput set-button-map "$DEVICE_NAME" 3 3 1 4 5 6 7 1
                break
        fi
        sleep 1
done                                                                                           

 user_nameは適宜自分のユーザー名に変えてください.

 remap.shが実行される瞬間はまだxinputがマウスを認識しないため,後の処理を進めつつ認識するまで10秒間待つようになっています(詳細は参考リンク6参照).

 環境変数が設定されていないのでコマンドは絶対パスで指定する必要があります. 環境変数DISPLAYやHOMEを設定しないと動かないので注意(なぜだろう?)・

 これでマウスが認識された時にリマップされるようになりました.

その他コマンド

その他役に立ちそうなコマンドを列挙しておきます.

$ lsusb # USB デバイスの情報を示す.
$ service udev status # udev サービスの状態を表示.ruleファイルのバグ確認用.
$ udevadm control --reload # ルールの適用.使わなくても大丈夫だった.
$ udevadm monitor --env # イベント環境を含めイベントを表示.
$ udevadm info -a -p $(udevadm info -q path -n /dev/video2) # dev/video2 の属性を表示

参考リンク

  1. Linux boxにUSBストレージを接続したとき勝手に同期するようにする | d.sunnyone.org
  2. udev の設定をカスタマイズする - いますぐ実践! Linuxシステム管理 / Vol.115
  3. udev の仕組みを理解する - いますぐ実践! Linuxシステム管理 / Vol.114
  4. udevに新しいルールを適応する - ktomoyaの日記
  5. Raspberry Pi 2 + systemd + udevで、USBデバイス挿入時にサービスを起動する - メモ的な思考的な
  6. UbuntuでBluetoothマウスの接続時に自動的に速度の設定を変更する方法 - うひょー(ブログ)
  7. udevルールの設定(Red Hat Enterprise Linux server 6以降の場合)
  8. udev - ArchWiki
  9. Writing udev rules