総合手引 | セクション 4 | English | オプション |
ユーザプロセスがマウス機能を利用しようとする場合、単に open(2) システムコールで /dev/sysmouse をオープンし、 read(2) システムコールを用いてマウスデータを読み込むだけでよいです。 ここで、確実に moused(8) を実行しておいて下さい。さもないと、ユーザプロセスはマウスからデータを 一切受け取ることができないでしょう。
レベル 0 は最も低いレベルで、基本的なレベルでもあります。このレベルでは、 ドライバは、ユーザプログラムに対して基本的なサービスを提供します。 sysmouse ドライバは、マウスの水平垂直の動きと、最大で 3 個までのボタンの状態を、 以下に示す MouseSystems 形式で通知します。
Byte 1 | |
bit 7 | 常に 1 です。 |
bit 6..3 | |
常に 0 です。 | |
bit 2 | 左ボタンの状態です。押し下げられている状態でビットクリア、そうでなければ ビットセットです。 |
bit 1 | 中ボタンの状態です。押し下げられている状態でビットクリア、そうでなければ ビットセット。中ボタンを持たない機器の場合は常に 1 です。 |
bit 0 | 右ボタンの状態です。押し下げられている状態でビットクリア、そうでなければ ビットセットです。 |
Byte 2 | 水平の動きのカウントを 2 の補数形式で表した値の先頭半分です。 -128 から 127 までの値。 |
Byte 3 | 垂直の動きのカウントを 2 の補数形式で表した値の先頭半分です。 -128 から 127 までの値。 |
Byte 4 | 水平の動きのカウントを 2 の補数形式で表した値の後ろ半分です。 -128 から 127 までの値。水平の動きのカウントを得るには、 byte 2 と byte 4 を足して下さい。 |
Byte 5 | 垂直の動きのカウントを 2 の補数形式で表した値の後ろ半分です。 -128 から 127 までの値。垂直の動きのカウントを得るには、 byte 3 と byte 5 を足して下さい。 |
レベル 1 は拡張レベルで、マウスのデータは mouse(4) で定義された標準形式 MOUSE_PROTO_SYSMOUSE でコード化されます。
MOUSE_GETLEVEL int *level
MOUSE_SETLEVEL int *level | |
これらのコマンドは、マウスドライバの機能レベルを操作します。
| |
MOUSE_GETHWINFO mousehw_t *hw | |
以下の構造体で、接続された機器のハードウェア情報を返します。現在の
バージョンの
sysmouse
ドライバでは、
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 フィールドには、ドライバが検出したボタンの数が保持されています。 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] はビットマスクで、調べるバイトと AND を取ります。この結果が syncmask[1] と等しい場合、そのバイトはデータパケットの先頭バイトらしいと言えます。 この方法で先頭バイトを検出するやり方は 100% 確実とは言えません。 よって、これは参考扱いにするべきと注意をしておきます。
MOUSE_SETMODE mousemode_t *mode | |
このコマンドは、マウスドライバの現在の機能パラメータを
mode
で指定した値に変更します。
level
だけが変更可能です。他のフィールドに値を設定してもエラーは出ませんが、
何の効果も及ぼしません。
| |
MOUSE_READDATA mousedata_t *data
MOUSE_READSTATE mousedata_t *state | |
これらのコマンドは
sysmouse
ドライバではサポートされません。
| |
MOUSE_GETSTATE mousestatus_t *status | |
このコマンドはボタンの現在の状態と動きのカウントを mouse(4) で定義された構造体で返します。 | |
マウスデーモン 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_MOTIONEVENT | |
これらの機能は u.data に情報を取り、その上で動作します。 sysmouse ドライバがオープンされている場合、マウスデータは sysmouse ドライバに送られます。 MOUSE_ACTION はボタン押し下げ動作を一緒に行ない、要求がある場合はシグナルを送ります。 現在のコンソールがテキストインタフェースを持つ場合、カットアンドペースト 処理を行ないます。 | |
MOUSE_BUTTONEVENT | |
u.data で、ボタンの種類とそのクリックカウント数を指定します。コンソールドライバは その情報を用い、要求がある場合はシグナルを送り、コンソールが テキストインタフェースを持つ場合は、カットアンドペースト処理を行ないます。 | |
MOUSE_MOTIONEVENT と MOUSE_BUTTONEVENT は、新しいインタフェースで、この 2 つを一緒に使うことを想定して 作られています。これらは MOUSE_ACTION ひとつで行なわれている機能を置き換えるためのものです。
u |
この共用体は、以下のいずれかです。
|
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 > で定義された値のうちのひとつである必要があります。 mode フィールドは現在は使用されていません。
|
event |
struct mouse_event { int id; int value; }; id フィールドは、 u.data.buttons と同じように、ボタン番号を指定します。 1 ビット/ボタンだけを設定できます。 value フィールドは、クリック数を保持しています。これは、ユーザがボタンを 連続して押した回数です。
|
/dev/consolectl | |
コンソールを制御するデバイス | |
/dev/sysmouse | 仮想化されたマウスドライバ |
/dev/ttyv%d | 仮想コンソール |
FreeBSD | SYSMOUSE (4) | December 3, 1997 |
総合手引 | セクション 4 | English | オプション |
このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.
“ | … one of the main causes of the fall of the Roman Empire was that, lacking zero, they had no way to indicate successful termination of their C programs. | ” |
— Robert Firth |