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> が書きました。