結論
xmodmap が駄目なら xinput を使えばいいじゃない.
前提
私の場合はマウスのミドルクリックを頻繁に使うので,使い易い場所に配置したくなる.
今まで,Ubuntu上でremminaやVMを使っている場合にリモートやVM内でミドルクリックを入力する場合には,.Xmodmapでpointerを設定すれば良かった.
例えばKensingtonのEM-7でボタン8(右上のボタン)にミドルクリックを割り当てる場合は
pointer = 1 8 3 4 5 6 7 2 9 10 11 12
あとはX起動時にこのファイルを読み込めばよく,xmonadの場合はStartHookに
spawn "xmodmap ~/.Xmodmap"
とかでも良いし,.xprofileも読み込まれるので,こっちでも良い
xmodmap ~/.Xmodmap
課題
しかしながら,この記事→ HHKBをHHKモードでWindowsでもLinuxでも使う - hadacchi blog のキーボードマッピングのために RDP クライアントを remmina から rdesktop に変更したところ,xmodmap の設定が反映されず元のボタン配置での入力がリモートホストに届くようになってしまった.
対策
これではまずいので対処を調べたところ,xmodmap ではなく xinput を使う方法でもマウスの設定が可能なことが分かった.
設定はこんな感じ.
- まずデバイス名を調べる.
xinput --list --name-only | grep Kensington
ID を表示させて ID 番号で指定することも可能であるが,起動する度に変更される可能性があるのか不明なこと,ならばとコマンドで ID を抽出するともっと長くなることから,今回は名前でデバイス指定することにする.
ちなみに ID でどうしてもやりたかったら,ID の抽出はこんな感じ.
$ xinput --list | grep Kensington | cut -d= -f2 | cut -d' ' -f1 # スペースではなくタブ文字
- 現在の設定を表示させてみる.
ちなみに,EM-7はデバイス名にタブとかスペースが連続して幾つも入っていて,ちゃんと調べるのが面倒だったのでコマンドでそのまま送ることにした.
$ xinput get-button-map "$(xinput --list --name-only | grep Kensington)"
1 2 3 4 5 6 7 8 9 10 11 12
どうやら,うちの環境では xmodmap を適用していても xinput からは変更がないように認識されているようだった.
- 設定を変更してみる.
xmodmap の設定を消して再起動(再ログイン)するのを忘れずに.
$ xinput set-button-map "$(xinput --list --name-only | grep Kensington)" 1 8 3 4 5 6 7 2 9 10 11 12
VM でも rdesktop でも,もちろんホスト OS でも正しく動作したので,これで行くことにする.
- xmonad の設定 xmonad.hs に書くことにした.xmodmap の時みたく xprofile でも良いかも.
main = do
(略)
xmonad $ ewmh defaultConfig
{ (略)
, startupHook = myStartupHook
}
myStartupHook = do
(略)
spawn "xinput set-button-map \"$(xinput --list --name-only | grep Kensington)\" 1 8 3 4 5 6 7 2 9 10 11 12"