SYSMOUSE(4) | FreeBSD Kernel Interfaces Manual | SYSMOUSE(4) |
名称
sysmouse — 仮想化されたマウスドライバ解説
マウスデーモン moused(8) と連動して、コンソールドライバは、 sysmouse ドライバを通して標準化された方法でマウスデータをユーザプロセスに供給します。このアレンジメント (処理) でコンソールと (X Window System などの) ユーザプロセスがマウスを共有することが可能になります。マウス操作を利用しようとしているユーザプロセスは、単に open(2) 呼び出しで /dev/sysmouse をオープンして、デバイスから read(2) によってマウスデータを読み込みます。確実に moused(8) を実行するようにしてください。そうでなければ、ユーザプロセスは、マウスから来るどんなデータも読み込めません。
操作レベル
sysmouse ドライバは、2 つの操作レベルがあります。現在の操作レベルは、 ioctl 呼び出しを通して参照、変更することができます。基本的なレベルである、レベル 0 は、ドライバがユーザプログラムへ基本的なサービスを提供する最も低いレベルです。 sysmouse ドライバは、次のような MouseSystems 形式で、マウスの水平垂直の移動と最大 3 個までのボタンの状態を与えます。
- バイト 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 を加えてください。
拡張レベルであるレベル 1 では、マウスデータは、 mouse(4) で定義されるような標準形式の MOUSE_PROTO_SYSMOUSE でエンコード (コード化) されます。
IOCTL
このセクションは、2 つのクラスの ioctl(2) コマンドについて説明します: sysmouse ドライバ自体のためのコマンド、およびコンソールとコンソール制御ドライバのためのコマンドです。sysmouse ioctl
マウスドライバのためのコマンドがいくつかあります。コマンドの概要は、 mouse(4) にあります。次は、 sysmouse ドライバ固有の機能です。
- MOUSE_GETLEVEL int *level
- MOUSE_SETLEVEL int *level
-
これらのコマンドは、マウスドライバの操作レベルを扱います。
- MOUSE_GETHWINFO mousehw_t *hw
-
次の構造体で、アタッチされた (取り付けられた) デバイスに関するハードウェア情報を返します。
iftype フィールドだけが、
sysmouse ドライバの現在の版において正しい値が入れられることが保証されます。
typedef struct mousehw { int buttons; /* ボタンの数 */ int iftype; /* I/F タイプ */ int type; /* マウス/トラックボール/パッド... */ int model; /* I/F 依存のモデル ID */ int hwid; /* I/F 依存のハードウェア ID */ } mousehw_t;
buttons フィールドは、ドライバによって検出されたボタンの数を保持します。
iftype は、常に MOUSE_IF_SYSMOUSE です。
type は、デバイスタイプを区別します: MOUSE_MOUSE, MOUSE_TRACKBALL, MOUSE_STICK, MOUSE_PAD または MOUSE_UNKNOWN です。
model は、操作レベル 0 で、常に MOUSE_MODEL_GENERIC です。それは、より高い操作レベルで MOUSE_MODEL_GENERIC または MOUSE_MODEL_XXX 定数の 1 つになります。
hwid は、常に 0 です。
- 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 フィールドは、マウスデータがユーザプログラムによって読み込まれるとき、デバイスの状態が返される形式を伝えます。それは、操作レベル 0 では、 MOUSE_PROTO_MSC です。操作レベル 1 では、 MOUSE_PROTO_SYSMOUSE です。
rate は、常に-1 に設定されます。
resolution は、常に-1 に設定されます。
accelfactor は、常に 0 です。
packetsize フィールドは、データパケットの長さを指定します。それは、操作レベルよって決まります。
- レベル 0
- 5 バイト
- レベル 1
- 8 バイト
配列 syncmask は、データパケットの最初のバイトを検出するためにビットマスクとパターンを保持します。 syncmask[0] は、1 つのバイトと論理積 (AND) を行うビットマスクです。結果が syncmask[1] と等しいなら、そのバイトは、データパケットの最初のバイトである可能性が高いです。最初のバイトを検出するこの方法が 100% の信頼性がないことに注意してください。したがって、単に助言的な手段として解釈すべきです。
- MOUSE_SETMODE mousemode_t *mode
-
このコマンドは、マウスドライバの現在の操作パラメータを
mode で指定されるように変更します。
level だけが修正できます。他のフィールドに値を設定することは、エラーも発生しませんし、効果もありません。
- MOUSE_READDATA mousedata_t *data
- MOUSE_READSTATE mousedata_t *state
-
これらのコマンドは、
sysmouse ドライバによってサポートされません。
- MOUSE_GETSTATUS mousestatus_t *status
- コマンドは、 mouse(4) で定義された構造体にボタンの現在の状態と移動数を返します。
コンソールと consolectl (コンソール制御) ioctls
ユーザプロセスは、マウスポインタを制御するために現在の仮想のコンソールにコンソール ioctl() 呼び出しを発行します。また、コンソール ioctl() は、ボタンが押されるとき signal(3) を受け取る方法をユーザプロセスに提供します。マウスデーモン moused(8) は、マウスの動きとボタンの状態を含むマウス動作をコンソールに通知するためにコンソール制御デバイス /dev/consolectl に ioctl() 呼び出しを使用します。
両方のクラスの ioctl() コマンドは、次の引数を取る CONS_MOUSECTL として定義されています。
struct mouse_info { int operation; union { struct mouse_data data; struct mouse_mode mode; struct mouse_event event; } u; };
- operation
-
これは、次の 1 つを取ります。
- MOUSE_SHOW
- マウスカーソルを有効にして表示します。
- MOUSE_HIDE
- マウスカーソルを無効にして隠します。
- MOUSE_MOVEABS
- マウスカーソルを u.data で指定された位置に移動します。
- MOUSE_MOVEREL
- 現在の位置に u.data で指定された位置を加えて移動します。
- MOUSE_GETINFO
- u.data に現在の仮想のコンソールの現在のマウス位置とボタンの状態を返します。
- MOUSE_MODE
- これは、ボタンが押されるとき現在のプロセスに配信されるように signal(3) を設定します。配信されるシグナルは、 u.mode に設定されます。
上記の操作は、仮想のコンソールに対するものです。以下で定義された操作は、コンソール制御デバイスに対するもので、マウスデータをコンソールドライバに渡すために moused(8) によって使用されます。
- MOUSE_ACTION
- MOUSE_MOTION_EVENT
- これらの操作は、 u.data に情報を取って、それに従って動作します。マウスデータは、ドライバがオープンされているなら sysmouse ドライバに送られます。また、 MOUSE_ACTION は、ボタンの押し下げ動作を処理して、要求されるならシグナルをプロセスに送るか、または現在のコンソールがテキストインタフェースであるならカットアンドペースト操作を実行します。
- MOUSE_BUTTON_EVENT
- u.data は、ボタンとそのクリック数を指定します。コンソールドライバは、要求されるなら、シグナル配信のために、またはコンソールがテキストモードであるなら、カットアンドペースト操作のためにこの情報を使用します。
MOUSE_MOTION_EVENT と MOUSE_BUTTON_EVENT は、新しいインタフェースであり、一緒に使用するように設計されます。それらは、 MOUSE_ACTION 単独で実行されている機能を置き換えるためのものです。
- u
-
この共用体は、次の 1 つを取ります。
- data
-
struct mouse_data { int x; int y; int z; int buttons; };
x, y と z は、それぞれの方向に沿っているマウスの動きを表します。 buttons は、ボタンの状態を伝えます。それは、ビット 0 からビット 30 までで最大 31 個のボタンをコード化します。ボタンが押されるなら、対応するビットが設定されます。
- mode
-
struct mouse_mode { int mode; int signal; };
signal フィールドは、プロセスに配信されるシグナルを指定します。それは、 < signal.h> で定義された値の 1 つでなければなりません。 mode フィールドは、現在、未使用です。
- event
-
struct mouse_event { int id; int value; };
id フィールドは、 u.data.buttons のようにボタン番号を指定します。 1 ビット/ボタンだけが設定されます。 value フィールドは、クリック数を保持しています: ユーザが連続してボタンをクリックした回数です。
関連ファイル
- /dev/consolectl
- コンソールを制御するデバイス
- /dev/sysmouse
- 仮想化されたマウスドライバ
- /dev/ttyv%d
- 仮想コンソール
歴史
sysmouse ドライバは、 FreeBSD 2.2 ではじめて登場しました。作者
このマニュアルページは、 <gurney_j@efn.org>と <yokota@FreeBSD.org>によって書かれました。January 16, 2010 | FreeBSD |