MOUSE(4) | FreeBSD Kernel Interfaces Manual | MOUSE(4) |
名称
mouse — マウスとポインティングデバイスのドライバ書式
#include < sys/mouse.h>解説
マウスドライバ mse(4), psm(4), ums(4) と sysmouse(4) は、マウスに関する動きとボタンの状態の情報をユーザプログラムに提供します。現在のところ、バス、InPort、PS/2 と USB マウスのための固有のデバイスドライバがあります。シリアルマウスは、専用のドライバによって直接サポートされませんが、シリアルデバイスドライバを介して、または 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 バイトは、最上位ビット (MSB) が常に 0 に設定されています。したがって、ユーザプログラムが MouseSystems データの形式を解釈できて、ビットパターン 10000xxxb を検出することによって形式の最初のバイトを見つけようとするなら、追加バイトを捨てて、その結果、正しく 3 つのボタンの x、y と状態をデコード (復号化) できます。
デバイスドライバは、1 より高い操作レベルを提供することができます。詳細については、個々のドライバのマニュアルページを参照してください。
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_USB, 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 定数のうちの 1 つです。
rate フィールドは、デバイスが移動報告をホストコンピュータに送るときの、状態の通知レート (通知/秒) です。不明か、または適用できないなら -1 です。
resolution フィールドは、ポインティングデバイスの解像度を指示する値を保持します。それは、正の値か MOUSE_RES_XXX 定数のうちの 1 つです。
accelfactor フィールドは、アクセラレーション (加速) 機能を制御するために値を保持します。それは 0 以上でなければなりません。それが 0 であるなら、アクセラレーション (加速) は、無効にされます。
packetsize フィールドは、固定サイズのデータパケットの長さか、または可変長のパケットの固定部の長さを伝えます。サイズは、インタフェースタイプ、デバイスタイプとモデル、ドライバのプロトコルおよび操作レベルに依存します。
配列 syncmask は、データパケットの最初のバイトを検出するためにビットマスクとパターンを保持します。 syncmask[0] は、1 つのバイトと倫理積 (AND) を行うビットマスクです。結果が syncmask[1] と等しいなら、そのバイトは、データパケットの最初のバイトである可能性が高いです。最初のバイトを検出するこの方法が 100% の信頼性がないので、単に助言的な手段として解釈すべきであることに注意してください。
- MOUSE_SETMODE mousemode_t *mode
-
このコマンドは、マウスドライバの現在の操作パラメータを
mode で指定されるように変更します。
rate,
resolution,
level と
accelfactor だけが修正できます。他のフィールドに値を設定することは、エラーも発生しませんし、効果もありません。
フィールドの現在の設定を変更したくないなら、そこに -1 を入れてください。また、利用者は、 resolution と rate に 0 を入れることができ、そうするとフィールドのデフォルト値が選択されます。
- MOUSE_READDATA mousedata_t *data
-
コマンドは、デバイスから生の (raw) データを読み込みます。
typedef struct mousedata { int len; /* バッファ中のデータ数 */ int buf[16]; /* データバッファ */ } mousedata_t;
呼び出しプロセスは、バッファに読み込まれるバイト数を len フィールドに入れておかなければなりません。このコマンドは、すべてのドライバによってサポートされているとは限りません。
- MOUSE_READSTATE mousedata_t *state
-
コマンドは、デバイスから生の (raw) 状態データを読み込みます。それは、上記と同じ構造体を使用します。このコマンドは、すべてのドライバによってサポートされているとは限りません。
- MOUSE_GETSTATUS 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_GETSTATUS 呼び出しからボタンの状態が変化したなら、 flags フィールドに対応するビットが設定されます。すぐ前の呼び出しからマウスが移動していれば、 flags フィールド中の MOUSE_POSCHANGED ビットも設定されます。
その他のフィールドは、すぐ前の MOUSE_GETSTATUS 呼び出しからの移動数を保持します。このコマンドの呼び出しの後で、毎回内部のカウンタは、リセットされます。
関連ファイル
- /dev/cuau%d
- シリアルポート
- /dev/mse%d
- バスマウスと InPort マウスデバイス
- /dev/psm%d
- PS/2 マウスデバイス
- /dev/sysmouse
- 仮想マウスデバイス
- /dev/ums%d
- USB マウスデバイス
作者
このマニュアルページは、 <yokota@FreeBSD.org>によって書かれました。December 3, 1997 | FreeBSD |