キーボードでマウスを操作するドライバ



改版履歴

2001 年 1 月 8 日
テンキーマウス部のバグフィクス
キーアサインの変更
2001 年 1 月 2 日
Ctrl, Shift, Alt キーにロック機能を付けてみる (カーネル 2.2.17 版のみ)
2000 年 8 月 11 日
2.4.0-test5 のドライバをアップロード
2000 年 8 月 7 日
恥ずかしいスペルミスを発見したので,名前を numpad mouse あたりに変えてみる
PAUSE キーが使えなかったのを修正
2.4.0-test5 に対応
2000 年 8 月 6 日
テンキーにマウスカーソルを割り当ててみる
ホイールなんかもサポートしてみる
マウスボタンをロックできるようにしてみる.一本指でドラッグ操作可能.
2000 年 8 月 5 日
初リリース.マウスボタンのみのサポートでした.

いきさつ

とある日,会社のアルバイトの若林くんが自分の VAIO ノートを分解していました. と,そのとき. マウスパッドのボタン部分のコネクタを壊してしまったのです. なんとかごまかしてつなごうとしたけれど,うまくいきません.

「ここらの使ってないキーがマウスボタンにならないかなぁ(ぼそ)」 途方に暮れた彼の一言.

というわけで,おもしろそうなので,作っちゃいました.

あと,vine-users メイリングリストに「ユーザ補助みたいのないかな」とかいうメイルが流れてたので,これも入れてみました(2.2.17 版).

概要

テンキーがマウスになります.

思いつく用途としては

フルキー左側の Cntl, Shift, Alt キーがロックするようになります(2.2.17 版のみ).

使用条件・配布条件

お題目,ですが.

このソフトウェアは無保証です. このソフトウェアの動作の正当性については作者は保証しませんし,使用によって生じたいかなる損害についても補償しません.

再配布については,linux カーネルに準じます.

動作原理

キーボードの入力を途中でこっそり盗んでいます.
swallow_kbd_event() という関数がそれです. handle_kbd_event() の中からスキャンコードをかすめ取って,マウスではないキーのスキャンコードのみ返しています. マウスデバイスの利用状況を見て,キーコードを盗むかどうか決定しています. マウスを使用していないときは,キーボードは普通に動作するはず.
マウスドライバ
PS/2 マウスドライバのルーチンを拝借していますが,一応,独立したドライバです. 最初は PS/2 に重畳させよかな,とも思ったけど面倒そうなので.

組み込み方

  1. linux/drivers/char/pc_keyb.c を以下のものと入れ替えます.
    2.2.17 用
    2.2.16 用
    2.4.0-test5 用
  2. カーネルを再構築します.
  3. デバイスファイルを作ります.
    mknod /dev/npmouse c 10 240
  4. X サーバのマウスの設定を変更します.
    プロトコルは IMPS/2 です.

使いかた

テンキーマウス部

テンキーマウスのキー割り当ては

F10
左ボタン
F11
中ボタン
F12
右ボタン
無変換
左ボタン
左ボタン(ロック付き)(2.2.17 版)
変換
中ボタン
中ボタン(ロック付き)(2.2.17 版)
カタカナ
右ボタン
右ボタン(ロック付き)(2.2.17 版)
NumLock
左ボタン(ロック付き)
テンキー [/]
中ボタン(ロック付き)
テンキー [*]
右ボタン(ロック付き)
テンキー [-]
ロック全解除
右 Ctrl
ロック全解除 (2.2.17 版)
テンキー[1][2][3][4][6][7][8][9]
カーソル移動
テンキー[+]/[Enter]
ホイール上/下
テンキー[0]
カーソル移動ステップを減らす
テンキー[.]
カーソル移動ステップを増やす
テンキー[5]
カーソル移動ステップを 1 にする
です.

(ロック付き)とあるキーは,

という動作をします. 例えば,X であるウィンドウをドラッグしたい場合は
  1. タイトルバーまでマウスカーソルを持っていく
  2. [NumLock] キーを押(して離)す
  3. マウスカーソルを操作し,ウィンドウを動かす
  4. もう一度 [NumLock] キーを押(して離)す
と操作できます.

フルキーシフトロック (2.2.17 版のみ)

フルキー部のキー割り当ては

左[Ctrl], 左[Shift], 左[Alt]
ロックするようになります.つまり,[CapsLock] キーのように,一度押すと有効となり,再度押すと無効になるような動作をします.
(注意)右側の [Ctrl], [Shift], [Alt] キーは従来の動作のままです.
CapsLock
[Ctrl], [Shift], [Alt] のすべてのロックを解除します.
となっています.

注意

(現段階では)ロックの状態が LED などに表示されません. このため,[-] や [CapsLock] キーを用意しています. 今,どのロックが有効かわからなくなってしまった場合は,このキーを押しましょう. (vi の ESC キーや emacs の C-g のようなものだと思ってください)

ヒント

他のマウスと併用する

他のマウスの入力と混ぜ合わせるプログラムとしては gpm と iMultiMouse があります. これらのプログラムを利用すると,必要に応じて好きなほうのマウスを使用することができます. テンキーマウスのほうのボタンロックの機能だけ使ってみる,というのもいいかもしれません.

iMultiMouse で 3 つ以上のマウスデバイスを使用する

iMultiMouse の配布形式のデフォルトの形態では同時に 2 つのマウスしか使用することができません. 3 つ以上のマウスが使用できるようにするには,Makefile の MICE = 2 の数を増やしてやります.

私の場合,ノート PC で

と混ぜ合わせて 3 デバイス同時使用可,なんて設定にしています.

カスタマイズ

キー割り当てを変える

マウスに割り当てるキーはテーブルになっています. numpad_lookup_noprefixが,1 つのスキャンコードだけを出力するキー,numpad_lookup_prefix が,頭に 0xe0 のスキャンコードを付けて出力するキーのテーブルです.

例えば,numpad_lookup_noprefix の最初から 0x1e 番目の要素で「押したときに 0x1e というスキャンコードを発生するキー」の動作を指定します.

numpad_lookup_prefix の最初から 0x1e 番目の要素は「押したときに 0xe0 0x1e というスキャンコードを発生するキー」です.

要素の名前のうち,わかりにくいものだけを説明すると,

NOP (No OPeration)
マウスには割り当てない.つまり,キーボードのキーとして扱われる.
NUMPAD_MOUSE1, NUMPAD_MOUSE2, NUMPAD_MOUSE3
マウス左ボタン, マウス中ボタン(ホイールのクリック), マウス右ボタン
です.

スキャンコードを調べるには,コンソール(X ではない,キャラクタ画面)で showkey -s と実行し,調べたいキーを押します.

バグ

カーソル移動ステップ変更の操作感がいまひとつかもしれません.
改良の余地あり,かしらん.アイディア求む.
デバイスのマイナー番号は正式なものではありません.
もし何かとかち合ったら適当に変更してください.
一部のキーが使えなくなります.
が,これらのキーが使えないと使えなくなるプログラムってあるのかな. ま,もし,そういう状況に遭遇したら,キー割り当てを適当に変えてちょうだい.
USB キーボードはサポートしていません.
keyboard.chandle_scancode() からキーをかすめ取るようにすると,対応することができると思います. やりたい人はどうぞ :-)
# そもそも,現時点では日本語 USB キーボード自体があまりうまく動作していないのですが.
2.4.0-test5 で,wait queue の使い方がよくわからん X-(
read_aux() を拝借しようとするが,Oops を吐いてしまう. Oops を見る限りでは,wait queue の操作がおかしいらしい. が,この関数を丸ごとコピーして read_numpad() として登録してやるとうまく動く. この関数,一見リエントラントのようだけど,そうじゃないのかしら.
2.2.17 版でシフトロック機能の切り替えができない
/proc 下のファイルを通じて on/off の設定ができるといいなぁ.

Linux のお部屋のもくじ
いまいくんのページのもくじ
2002 年 8 月 21 日更新
imai@jr0bak.homelinux.net