スポンサーリンク

MOUSE(4) FreeBSD/i386 カーネルインタフェースマニュアル MOUSE(4)

名称

mouse − マウス、ポインティングデバイス用ドライバ

書式

#include <machine/mouse.h>

解説

マウスドライバ mse(4), psm(4), sysmouse(4) はユーザプログラムにマウスの動 きやボタン状態の情報を提供します。現在のところ、バスマウス用、InPort マウ ス用、PS/2 マウス用の特有のデバイスドライバがあります。シリアルマウスは、 専用のドライバでは直接サポートされてはいませんが、シリアルデバイスドライ バを介して、あるいは moused(8)sysmouse(4) を経由してアクセスできま す。

ユーザプログラムでは、単純に open(2) 呼び出しでマウスデバイスをオープン し、 read(2) でデバイスからマウスのデータを読み取ります。動きとボタン状態 は通常、固定長のデータパケットにエンコードされます。マウスデバイスによっ ては、可変長のパケットでデータを送るかもしれません。それぞれのドライバが 実際に用いるプロトコル (データ形式) は大きく異なります。

マウスドライバは ‘‘非ブロッキング’’ 属性を持つことができます。その場合、 マウスデータが取得できなければドライバはすぐに戻ります。

マウスデバイスドライバは大抵いくつかのレベルの操作を提供します。現在の操 作レベルは ioctl(2) コマンドで調査、変更することができます。レベル 0 が最 も低いレベルであり、このときドライバはユーザプログラムに基本的なサービス を提供します。このレベルでは、ほとんどのドライバがマウスの水平移動と垂直 移動、および 3 つまでのボタンの状態を提供します。レベル 1 では、ドライバ がサポートしている場合、マウスデータは標準的な形式の MOUSE_PROTO_SYSMOUSE にエンコードされます。その形式は次の通りです:

       バイト 1

ビット 7
常に 1 です。
ビット 6..3
常に 0 です。
ビット 2
左ボタンの状態: 押されていればクリアされ、そうでなけ ればセットされます。
ビット 1
中ボタンの状態: 押されていればクリアされ、そうでなけ ればセットされます。デバイスが中ボタンを持たなけれ ば、常に 1 です。
ビット 0
右ボタンの状態: 押されていればクリアされ、そうでなけ ればセットされます。
バイト 2
水平移動量の前半部分の、2 の補数表現です。 -128 から 127 の範囲 になります。
バイト 3
垂直移動量の前半部分の、2 の補数表現です。 -128 から 127 の範囲 になります。
バイト 4
水平移動量の後半部分の、2 の補数表現です。 -128 から 127 の範囲 になります。水平移動量全体を得るには、バイト 2 とバイト 4 を足 してください。
バイト 5
垂直移動量の後半部分の、2 の補数表現です。 -128 から 127 の範囲 になります。垂直移動量全体を得るには、バイト 3 とバイト 5 を足 してください。
バイト 6
ビット 7 は常に 0 です。下位 7 ビットは Z 軸移動量の前半部分を 2 の補数表現でエンコードします。 -64 から 63 の範囲になります。
バイト 7
ビット 7 は常に 0 です。下位 7 ビットは Z 軸移動量の後半部分を 2 の補数表現でエンコードします。 -64 から 63 の範囲になります。 全体の Z 軸移動量を得るには、バイト 6 と バイト 7 を足してくだ さい。
バイト 8
ビット 7 は常に 0 です。ビット 0 から 6 はボタン 4 から 10 の状 態を表します。ボタンが押されていれば対応するビットがクリアさ れ、そうでなければセットされます。

この形式の最初の 5 バイトは MouseSystems 形式と互換になっています。残りの 3 バイトは、最上位ビットが常に 0 にセットされています。そのため、ユーザプ ログラムが MouseSystems データ形式を解釈できて、ビットパターン 10000xxxb を検出することでこのデータ形式の 1 バイト目を見つけ出そうとしている場合、 追加分のバイトを棄てることによって、 x, y および 3 つのボタンの状態を正し くデコードできます。

デバイスドライバが 2 以上の操作レベルを提供することもあります。詳しくは個 々のドライバのマニュアルページを参照してください。

IOCTL

次の ioctl(2) コマンドがマウスドライバ用に定義されています。サポートの状 況はドライバによって変わります。本セクションではコマンドの一般的な解説を 記します。特定のドライバの詳細については、個々のドライバのマニュアルペー ジを参照してください。

       MOUSE_GETLEVEL int *level

MOUSE_SETLEVEL int *level
これらのコマンドはマウスドライバの操作レベルを扱います。

MOUSE_GETHWINFO mousehw_t *hw
接続されているデバイスのハードウェア情報を次の構造体に返します。 iftype フィールド以外は、デバイスドライバが必ずしも正しい値で構造 体を埋めるとは限りません。サポートの詳細は個々のドライバのマニュア ルページを参照してください。

typedef struct mousehw {
int buttons; /* ボタン数 */
int iftype; /* I/F の型 */
int type; /* マウス/トラックボール/トラックパッド... */
int model; /* I/F 依存のモデル ID */
int hwid; /* I/F 依存のハードウェア ID */
} mousehw_t;

buttons フィールドはドライバが検出したボタン数を保持します。ドライ バが正確な数を検出できなければ、 2 などの適当な値がこのフィールド に代入されることもあります。

iftype はインタフェースの型で、 MOUSE_IF_SERIAL, MOUSE_IF_BUS, MOUSE_IF_INPORT, MOUSE_IF_PS2, MOUSE_IF_SYSMOUSE, MOUSE_IF_UNKNOWN のいずれかです。

type はデバイスの型を示し、 MOUSE_MOUSE, MOUSE_TRACKBALL, MOUSE_STICK, MOUSE_PAD, MOUSE_UNKNOWN のいずれかです。

model は MOUSE_MODEL_GENERIC か、あるいは定数 MOUSE_MODEL_XXX のう ちの 1 つです。

hwid はそのポインティングデバイスが返す ID 値です。これはインタ フェースの型に依ります。取りうる値については特定のマウスドライバの マニュアルページを参照してください。

       MOUSE_GETMODE mousemode_t *mode

本コマンドはマウスドライバの現在の操作パラメータを報告します。

typedef struct mousemode {
int protocol; /* MOUSE_PROTO_XXX */
int rate; /* 報告頻度 (秒単位) */
int resolution; /* MOUSE_RES_XXX、不明なら -1 */
int accelfactor; /* アクセラレーションの要素 */
int level; /* ドライバの操作レベル */
int packetsize; /* データパケットの長さ */
unsigned char syncmask[2]; /* 同期ビット */
} mousemode_t;

protocol フィールドは、ユーザプログラムがマウスデータを読み取る際 に、デバイスの状態が返される形式を示します。これは定数 MOUSE_PROTO_XXX のうちのひとつです。

rate フィールドは状態報告の頻度 (回/秒) であり、デバイスはこの頻度 でホストコンピュータに移動報告を送ります。不明かまたは適用できなけ れば -1 です。

resolution フィールドはポインティングデバイスの解像度を示す値を保 持します。正の値か、定数 MOUSE_RES_XXX のうちの 1 つです。

accelfactor フィールドは、アクセラレーション機能を制御するための値 を保持します。この値は 0 以上でなければなりません。 0 であればアク セラレーション機能は無効です。

packetsize フィールドは、固定サイズのデータパケットの長さまたは可 変長パケットの固定部の長さを示します。このサイズは、インタフェース の型、デバイスの型やモデル、ドライバのプロトコルや操作レベルに依存 します。

配列 syncmask は、データパケットの 1 バイト目を検出するためのビッ トマスクとビットパターンを保持します。 syncmask[0] はビットマスク で、データのバイトとの積 (AND) を取るためのものです。その結果が syncmask[1] に等しければ、おそらくそのバイトはデータパケットの 1 バイト目でしょう。但しこの 1 バイト目の検出法は 100% 信頼性がある とは言えません。ですので、単に補助的な手段だととらえてください。

       MOUSE_SETMODE mousemode_t *mode

本コマンドは、マウスドライバの現在の操作パラメータを mode で指定さ れる通りに変更します。変更可能なのは、 rate, resolution, level, accelfactor だけです。他のフィールドに値を代入しても、エラーは発生 しませんし、効果もありません。

あるフィールドの現在の設定を変更したくないときは、そのフィールドに -1 を入れてください。また resolution と rate には 0 を入れることも できます。そうすると、そのフィールドのデフォルト値が選択されます。

MOUSE_READDATA mousedata_t *data
本コマンドはデバイスから生のデータを読み取ります。

typedef struct mousedata {
int len; /* バッファ内のデータ数 */
int buf[16]; /* データ用バッファ */
} mousedata_t;

呼び出し元プロセスは、バッファに読み込まれるバイト数を len フィー ルドに入れておかなくてはなりません。本コマンドはすべてのドライバが サポートしているとは限りません。

       MOUSE_READSTATE mousedata_t *state

本コマンドはデバイスから生の状態データを読み取ります。上記と同じ構 造体を使用します。本コマンドはすべてのドライバがサポートしていると は限りません。

MOUSE_GETSTATE mousestatus_t *status
本コマンドは、現在のボタン状態と移動量を次の構造体に返します。

typedef struct mousestatus {
int flags; /* 状態変更フラグ */
int button; /* ボタン状態 */
int obutton; /* 以前のボタン状態 */
int dx; /* x 方向の移動 */
int dy; /* y 方向の移動 */
int dz; /* z 方向の移動 */
} mousestatus_t;

button フィールドと obutton フィールドは、マウスボタンの現在の状態 と以前の状態を保持します。ボタンが押されたとき、対応するビットが セットされます。マウスドライバは 0 から 31 までのビットを使って 31 個までのボタンをサポートできます。いくつかのボタンビットが MOUSE_BUTTON1DOWN から MOUSE_BUTTON8DOWN として定義されています。 最初の 3 つのボタンは、左ボタン、中ボタン、右ボタンに対応します。

前回の MOUSE_GETSTATE 呼び出しからボタンの状態が変わっていれば、 flags フィールドの対応するビットがセットされます。前回の呼び出しか らマウスが移動していれば、 flags フィールド中の MOUSE_POSCHANGED ビットもセットされます。

その他のフィールドは、前回の MOUSE_GETSTATE 呼び出しからの移動量を 保持します。本コマンドが呼び出された後に、毎回内部カウンタがリセッ トされます。

関連ファイル

       /dev/cuaa%d

シリアルポート
/dev/mse%d
バスマウス、InPort マウスデバイス
/dev/psm%d
PS/2 マウスデバイス
/dev/sysmouse
仮想マウスデバイス

関連項目

ioctl(2), mse(4), psm(4), sysmouse(4), moused(8)

作者

本マニュアルページは Kazutaka Yokota ⟨yokota@FreeBSD.org⟩ が書きました。

FreeBSD December 3, 1997 FreeBSD

スポンサーリンク