トラックボールマウスを買い替えた
目次
経緯
パソコン始めた当初から使っていたトラックボールマウスが多分20年経ってクリックがオカシクなってきた。
3ボタンでもマウスホイールすらもなく、それでも不都合なく使い続けていたのだが、いよいよやばくなってきた。
なので買い替えた。

セットアップ
購入したもの

こちらを買ってみた。
ファンクションキーなるものがついている。
なにやら今のマウスはボタンたくさんついているのが多い。
これLinuxでちゃんと認識してくれるのか不安だったので売り場の端っこでGoogle Lens使って型番検索して評判を見た。
ボールが小さいのと思ったところにカーソルがいかないという些か嫌なレビューが書かれていたが、7,000円以上のマウスを買っても良かったのだが、まあそこまでは不要だろうと何故か変な自信があったのと、Ubuntuでファンクションキーを認識させる方法がありそうだったので安かったしこれに決めた。
結線式
さて家に戻り、早速挿してみたら普通に認識した。
が、LRとホイール以外のボタンはうんともすんとも。
ちゃんと認識させる
こちらのドライバを使えばカーネルモジュールとしてロードできるようだ。
久しぶりにカーネルモジュールなんでビルドしてみるか。
いやまて
先程のサイトを見たらUbuntuのやり方が書いている。
APTでインストールできるではないか。
Debianでも同じだろうとやってみたらエラー。ありゃ。
仕方ないからソースからビルドしてみるか。
ソースからビルド
以下の通りにやってみた。
$ cd $WORKDIR
$ git clone https://github.com/cpetrov/deft.git
Cloning into 'deft'...
remote: Enumerating objects: 39, done.
remote: Total 39 (delta 0), reused 0 (delta 0), pack-reused 39
Receiving objects: 100% (39/39), 20.54 KiB | 396.00 KiB/s, done.
Resolving deltas: 100% (4/4), done.
$ cd deft/driver
$ make
make -C /lib/modules/5.10.0-7-amd64/build SUBDIRS=$WORKDIR/deft/driver modules
make[1]: ディレクトリ '/usr/src/linux-headers-5.10.0-7-amd64' に入ります
/usr/src/linux-headers-5.10.0-7-common/Makefile:225: =============== ERROR ==============
/usr/src/linux-headers-5.10.0-7-common/Makefile:226: 'SUBDIRS' was removed in Linux 5.3
/usr/src/linux-headers-5.10.0-7-common/Makefile:227: Use 'M=' or 'KBUILD_EXTMOD=' instead
/usr/src/linux-headers-5.10.0-7-common/Makefile:228: ====================================
/usr/src/linux-headers-5.10.0-7-common/Makefile:229: *** .. 中止.
make[1]: *** [/usr/src/linux-headers-5.10.0-7-common/Makefile:185: __sub-make] エラー 2
make[1]: ディレクトリ '/usr/src/linux-headers-5.10.0-7-amd64' から出ます
make: *** [Makefile:9: modules] エラー 2
$
あら。あー、書き方が古いってことね。
$ cp Makefile{,.org}
$ sed -i -e 's/SUBDIRS=/M=/' ./Makefile
$ make
make -C /lib/modules/5.10.0-7-amd64/build M=$WORKDIR/deft/driver modules
make[1]: ディレクトリ '/usr/src/linux-headers-5.10.0-7-amd64' に入ります
CC [M] $WORKDIR/deft/driver/hid-deft.o
MODPOST $WORKDIR/deft/driver/Module.symvers
CC [M] $WORKDIR/deft/driver/hid-deft.mod.o
LD [M] $WORKDIR/deft/driver/hid-deft.ko
make[1]: ディレクトリ '/usr/src/linux-headers-5.10.0-7-amd64' から出ます
$ sudo make install
これでモジュール配置からdepmodまでやってくれているようだ。
$ lsmod |grep deft
hid_deft 16384 0
hid 147456 4 hid_elecom,usbhid,hid_generic,hid_deft
$
ちゃんとロードできているようだ。
ちゃんとボタンは認識しているのか確認する。
今回はxinputコマンドを使ってみる。
$ xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ ELECOM ELECOM TrackBall Mouse id=12 [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)]
↳ ARCHISS PTR66 ARCHISS PTR66 id=9 [slave keyboard (3)]
↳ ARCHISS PTR66 ARCHISS PTR66 System Control id=10 [slave keyboard (3)]
↳ ARCHISS PTR66 ARCHISS PTR66 Consumer Control id=11 [slave keyboard (3)]
↳ ELECOM ELECOM TrackBall Mouse id=13 [slave keyboard (3)]
$
なんかELECOMのマウスが2つある。なんでだろう。
よくわかんないけどどっちかのIDが本物のマウスだろう。
$ xinput get-button-map 12
1 2 3 4 5 6 7 8 9 10 11 12
$ xinput get-button-map 13
device has no buttons
$
ほほぉ。12がビンゴっぽい。
12個もボタンがあるらしい。そんなにあるかな?
ではでは本当に12なのか確かめてみる。
$ xinput query-state 12 # <-ここでマウスの左クリックしながらEnterキーを押下
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
・
・
・
$ xinput query-state 12 # <-ここではマウスには触らずにEnterキーを押下
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[1]がdown->upになっているので、このIDがマウスぽい。
同じ調子で他のボタンも触ってみる。
button0 : L
button1 : R
button2 : Wheel
button8 : Back
button9 : Forward
button10: F1
button11: F2
button12: F3
で、ここで気づく。ボタン8と9が現時点でブラウザの「戻る」「進む」になっていた。
なんと超便利。もうこれでファンクションキーはどうでもよい気になってきた。
ま、ここまで来たら更に便利にしようってことでなんかボタンを割り当ててみようと思う。
Functionキーになんか割り当てる
いろいろ考えたけど、3つボタンがあるので以下を思いついた。
- ボリューム操作(Increase/Mute/Decrease)
- 動画・音楽操作(Prev/Pause/Fwd)
- ページ操作(Home/Reload/End)
うーん、今メインPCとして使っているので、利用頻度から言ってボリュームが多いのかも。
てことで、今回はボリュームに割り当ててみることに。
どうすんの?
頭が昔の知識のままで止まっているので、ボリュームを操作するのってぱっと思いつくのって
- aumix
- amixer
とかを思い浮かべるが、今はPulseAudioが管理しているっぽい。
PulseAudioは音声の入出力を仮想デバイスと仮想ミキサーでユーザ権限で管理できるようだ。
すごい時代になったもんだ。
さて、デバイスはPulseAudioではsinkというらしい。
で、今回は非常に簡単でデフォルトのsinkに対して音量上げ下げとミュートができるようにするだけ。
コマンド操作はpactlを使う。ボタン管理はxbindkeysを使う。
設定
$ ls -l ~/.xbindkeysrc
ls: '.xbindkeysrc' にアクセスできません: そのようなファイルやディレクトリはありません
$ xbindkeys -d >./.xbindkeysrc
$ cat -n ~/.xbindkeysrc
1 # For the benefit of emacs users: -*- shell-script -*-
2 ###########################
3 # xbindkeys configuration #
4 ###########################
5 #
6 # Version: 1.8.7
7 #
8 # If you edit this file, do not forget to uncomment any lines
9 # that you change.
10 # The pound(#) symbol may be used anywhere for comments.
11 #
12 # To specify a key, you can use 'xbindkeys --key' or
13 # 'xbindkeys --multikey' and put one of the two lines in this file.
14 #
15 # The format of a command line is:
16 # "command to start"
17 # associated key
18 #
19 #
20 # A list of keys is in /usr/include/X11/keysym.h and in
21 # /usr/include/X11/keysymdef.h
22 # The XK_ is not needed.
23 #
24 # List of modifier:
25 # Release, Control, Shift, Mod1 (Alt), Mod2 (NumLock),
26 # Mod3 (CapsLock), Mod4, Mod5 (Scroll).
27 #
28
29 # The release modifier is not a standard X modifier, but you can
30 # use it if you want to catch release events instead of press events
31
32 # By defaults, xbindkeys does not pay attention with the modifiers
33 # NumLock, CapsLock and ScrollLock.
34 # Uncomment the lines above if you want to pay attention to them.
35
36 #keystate_numlock = enable
37 #keystate_capslock = enable
38 #keystate_scrolllock= enable
39
40 # Examples of commands:
41
42 "xbindkeys_show"
43 control+shift + q
44
45 # set directly keycode (here control + f with my keyboard)
46 #"xterm"
47 # c:41 + m:0x4
48
49 # specify a mouse button
50 #"xterm"
51 # control + b:2
52
53 #"xterm -geom 50x20+20+20"
54 # Shift+Mod2+alt + s
55 #
56 ## set directly keycode (here control+alt+mod2 + f with my keyboard)
57 #"xterm"
58 # alt + c:0x29 + m:4 + mod2
59 #
60 ## Control+Shift+a release event starts rxvt
61 #"rxvt"
62 # release+control+shift + a
63 #
64 ## Control + mouse button 2 release event starts rxvt
65 #"rxvt"
66 # Control + b:2 + Release
67 #
68
69 ##################################
70 # End of xbindkeys configuration #
71 ##################################
$
新規で設定ファイルを作成した。
次にF1〜F3キーにコマンドを割り当てるための設定をここに追記する。
67,76d66
< #
<
< "pactl set-sink-volume @DEFAULT_SINK@ +1000"
< b:10
<
< "pactl set-sink-volume @DEFAULT_SINK@ -1000"
< b:12
<
< "pactl set-sink-mute @DEFAULT_SINK@ toggle"
< b:11
これを追記してみる。
defaultのsinkは@DEFAULT_SINK@って書き方でよいらしい。
どのくらいのオーダーで音量を調節するかは好みによるが、実際に使ってみて1,000ぐらいが妥当ではないかと。
ミュートはtoggleするだけでよいので、こちらも簡単。
試してみる。
xbindkeysを実行する
$ xbindkeys -p
$
それぞれのボタンを押してみる。うん、できてる。
また便利になってしまった。
毎回これが実行されるように設定する。
$ echo "xbindkeys -p" >>~/.bashrc
最後に
思ったとおりのことはできたが、やはりトラックボールがうまく動いてくれないときがある。
慣れればよいのかもしれないが、繊細な動きは期待できないなと。