How to use wheel mouse on FreeBSD

このページでは、FreeBSD で wheel マウスを使うための Tips をまとめています。

プラットホーム

準備するもの

設定編

まずは USB マウスを使えるように設定します。USBマウスでない方はXFree86の設定まで読み飛ばしてください。
FreeBSD 4.0 Release 以降であれば、default で USBマウスが使えるはずです。 もしカーネルがUSBマウスに対応していれば、マウスを接続した時に /var/log/messages
Jul 27 23:04:45 devil /kernel: ums0: ELECOM ELECOM image sensor mouse with wheel, rev 1.00/0.01, addr 2, iclass 3/1
Jul 27 23:04:45 devil /kernel: ums0: 3 buttons and Z dir.
このようなメッセージが出ているはずです。

カーネルの再構築

カーネルの設定ファイル/sys/i386/confの下にある設定ファイルに、 USB インターフェースと USB マウスの設定を書き加えます。
device          uhci            # UHCI PCI->USB interface
device          ohci            # OHCI PCI->USB interface
device          usb             # USB Bus (required)
device          ums             # Mouse
書き加えたら、
# config 設定ファイル名
を実行したのち、 make dependmake installを実行します。 コンパイルとカーネルのインストールに成功したらrebootします。 USB対応のカーネルは起動時に、USBインターフェースを認識すると思います。
uhci0: <Intel 82371AB/EB (PIIX4) USB controller> port 0x1820-0x183f irq 11 at device 6.2 on pci0
usb0: <Intel 82371AB/EB (PIIX4) USB controller> on uhci0
usb0: USB revision 1.0

usbdの設定

つぎに、USBマウスを接続したときに、 自動的に専用のmoused を立ち上げるように設定します。 これは /etc/usbd.conf に以下のような記述をしておくことで、 マウスの着脱に応じてmousedの立ち上げたり落したりすることができます。
device "Mouse"
        devname "ums[0-9]+"
        attach "/usr/sbin/moused -p /dev/${DEVNAME} -I /var/run/moused.${DEVNAME}.pid"
        detach "kill `cat /var/run/moused.${DEVNAME}`"

XFree86の設定

Xサーバに、マウスのボタンが5つあることを教える必要があります。 これは、 /etc/XF86ConfigPointer セクションを以下のように記述することが必要です。
Section "Pointer"
   Protocol        "PS/2"
   Device          "/dev/mouse"
   Resolution      100
   Buttons         5
   ZAxisMapping    4 5
EndSection
/etc/XF86Configを書き換えたら、 Xサーバを起動し直す必要があります。 これで、マウスのホイールの上下動に対して、 button4 と button5 がクリックされたのと同じXのイベントが発生するようになったはずです。 発生するイベントは、xevを使って確認できます。
ButtonPress event, serial 18, synthetic NO, window 0x4c00001,
    root 0x26, subw 0x0, time 2642778861, (49,133), root:(886,157),
    state 0x0, button 4, same_screen YES

ButtonRelease event, serial 18, synthetic NO, window 0x4c00001,
    root 0x26, subw 0x0, time 2642778861, (49,133), root:(886,157),
    state 0x800, button 4, same_screen YES

ButtonPress event, serial 18, synthetic NO, window 0x4c00001,
    root 0x26, subw 0x0, time 2642779077, (49,133), root:(886,157),
    state 0x0, button 5, same_screen YES

ButtonRelease event, serial 18, synthetic NO, window 0x4c00001,
    root 0x26, subw 0x0, time 2642779077, (49,133), root:(886,157),
    state 0x1000, button 5, same_screen YES

各種アプリケーションを対応させる

早速、button4 と button5 で各種アプリケーションがスクロール動作するように設定していきましょう。

Netscape 4.72

FreeBSD の ports でインストールした場合には、そのままで対応しています。

kterm

kterm のリソースに、以下の記述を加えます。
KTerm.vt100.translations: #override\n\
  <Btn4Down>:scroll-back(5)\n\
  <Btn5Down>:scroll-forw(5)\n\
  Shift<Key>space: begin-conversion(_JAPANESE_CONVERSION)
この色の部分はkinput2 を使う場合に、 一緒に設定するための部分です。
このscroll-back とscroll-forwというアクションの引数の5は、 5行移動するという意味です。 本来は、scroll-back(count,unit)というように、 unitを指定するのですが、unitを省略すると line を指定した事になります。このほかのunit としては、 page,halfpage, pixelがあります。 詳細については xterm のマニュアルを参照してください。

XEmacs

xemacs のスクロールは、 .emacs で以下のような関数をglobal-mapに定義してやります。
(define-key global-map 'button4
  '(lambda (&rest args)
     (interactive)
     (let ((curwin (selected-window)))
       (select-window (car (mouse-pixel-position)))
       (scroll-down 5)
       (select-window curwin)
       )))
(define-key global-map 'button5
  '(lambda (&rest args)
     (interactive)
     (let ((curwin (selected-window)))
       (select-window (car (mouse-pixel-position)))
       (scroll-up 5)
       (select-window curwin)
       )))

Gtkなアプリケーション

Gtkはそのままでも GtkVScrollbarなどは button4 と button5 でスクロールするのですが、 GtkTextなどもスクロールさせようとするとそのままでは、 スクロールできません。 そこで、button press event を key press event に変換するプログラムを導入することにします。

imwheelのインストール

imwheelは、 設定ファイルに記述することで、 ウインドウ毎に発生させるkey press eventを変えることができます。 FreeBSD の ports/x11にもありますので導入は簡単です。
ただ、 この imwheel は特に指定しないウィンドウへの button press event まで勝手に変更してしまうので、思わぬ影響が出る恐れがあります。 そこで私は、imwheel のソースを書き換えて、 default action を ungrabButtons()にしました。 これで、設定ファイルで特に指定したウィンドウ以外への影響は無くなります。
~/.imwheelrc の書き方については、 imwheel のマニュアルを参照してください。 ちなみに私の ~/.imwheelrc はこんな感じです。 また、/usr/X11R6/etc/imwheelrc は削除しました。
"^Message History:.*"
None,           Up,     Shift_L|Page_Up
None,           Down,   Shift_L|Page_Down       
これは、gtkicq のメッセージヒストリウィンドウ用の設定です。
Yukimitsu Izawa
Last modified: Fri Jul 28 02:35:16 JST 2000