ELECOMマウスをDebianで使う

06/19

トラックボールマウスを買い替えた

目次

経緯

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

これ使ってた

セットアップ

購入したもの

ELECOM M-DT1URBK

こちらを買ってみた。
ファンクションキーなるものがついている。
なにやら今のマウスはボタンたくさんついているのが多い。
これ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つボタンがあるので以下を思いついた。

  1. ボリューム操作(Increase/Mute/Decrease)
  2. 動画・音楽操作(Prev/Pause/Fwd)
  3. ページ操作(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

最後に

思ったとおりのことはできたが、やはりトラックボールがうまく動いてくれないときがある。
慣れればよいのかもしれないが、繊細な動きは期待できないなと。


コメント: