ubuntu 16.04 にてマウスのリマップ
使っているKensingtonのマウスはWindowsやMacではドライバの設定を変更することで左手用にボタンの役割を変更することができます.
一方, ubuntuではマウスだけで簡単に設定できるような専用のドライバは存在しません. 調べてみると入力デバイスの設定ユーティリティであるxinputリマップさせるスクリプトを組んでブート時に実行させる事例が多いようです. しかし複数台でマウスやキーボードを共有させる場合は切り替える都度スクリプトが実行してくれないとリマップは有効になりません.
そこでデバイスの認識時にリマップさせるスクリプトを実行させ,快適に左手マウスを使えるようにしました.
■ xinputによるリマップ
リマップのスクリプトを組むまでの手順は以下.
- xinputのインストール
- マウスボタンの番号確認
- 実際にリマップしてみる
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=10
のKensington 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 ...
リマップ前は左図のようになっていました. これを右図のように,右側を主ボタン,左側を副ボタンとなるように変更します.
実際にリマップさせるコマンドは次.
$ xinput set-button-map "Kensington Expert Wireless TB" 3 3 1 4 5 6 7 1
1 2 3 ... と昇順になっていたのを変えてあげれば良いだけです. これで無事左手用にリマップされました.
しかし,これではPCの再起動やマウスの抜き差しをするたびにリセットされてしまいます. 再起動に対しては「自動起動するアプリケーションの設定」に追記すれば解決するのですが、抜き差しに対しては意味ありません。
そこで、マウスを認識したらコマンドが実行されるように工夫する必要があります。
■ udevによる認識時のリマップ
udevというデバイス管理ツールを使えば,マウスの認識時にリマップコマンドを叩かせることができます.
具体的な手順は以下.
- atのインストール
- ルールの作成
- スクリプトの作成
参考リンク6の内容をほぼそのまま使わていただきました.
1. atのインストール
sudo apt-get install at
2. ルールの作成
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行で書くというのも仕様なので注意してください.
3. スクリプトの作成
実際に実行させるスクリプトは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 の属性を表示
参考リンク
- Linux boxにUSBストレージを接続したとき勝手に同期するようにする | d.sunnyone.org
- udev の設定をカスタマイズする - いますぐ実践! Linuxシステム管理 / Vol.115
- udev の仕組みを理解する - いますぐ実践! Linuxシステム管理 / Vol.114
- udevに新しいルールを適応する - ktomoyaの日記
- Raspberry Pi 2 + systemd + udevで、USBデバイス挿入時にサービスを起動する - メモ的な思考的な
- UbuntuでBluetoothマウスの接続時に自動的に速度の設定を変更する方法 - うひょー(ブログ)
- udevルールの設定(Red Hat Enterprise Linux server 6以降の場合)
- udev - ArchWiki