SYSMOUSE
Section: Devices and Network Interfaces (4)
Updated: i386
索引
jman
BSD mandoc
FreeBSD
索引
名称
sysmouse
- 仮想化されたマウスドライバ
索引
書式
Fd #include <machine/mouse.h>
Fd #include <machine/console.h>
索引
解説
マウスデーモン
moused(8)
と一緒に使うことにより、コンソールドライバは、
ドライバを通して、ユーザプロセスに標準的な方法でマウスのデータを提供します。
このように整理することで、
Po X Window System
などのような
Pc ユーザプロセスとコンソールとでマウスを共有することができるようになります。
ユーザプロセスがマウス機能を利用しようとする場合、単に
open(2)
システムコールで
/dev/sysmouse
をオープンし、
read(2)
システムコールを用いてマウスデータを読み込むだけでよいです。
ここで、確実に
moused(8)
を実行しておいて下さい。さもないと、ユーザプロセスはマウスからデータを
一切受け取ることができないでしょう。
機能レベル
ドライバには 2 つの機能レベルがあります。現在の機能レベルは ioctl
システムコールにより参照、変更することができます。
レベル 0 は最も低いレベルで、基本的なレベルでもあります。このレベルでは、
ドライバは、ユーザプログラムに対して基本的なサービスを提供します。
ドライバは、マウスの水平垂直の動きと、最大で 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
でコード化されます。
索引
IOCTL
この節では、2 種類の
ioctl(2)
コマンドについて説明します。
1 つは、
ドライバそれ自体に対するコマンドで、もう 1 つは、コンソールと
コンソール制御ドライバに対するコマンドです。
Sysmouse Ioctl
マウスドライバに対するコマンドがいくつかあります。このコマンド一般の説明は、
mouse(4)
にあります。
以下では、
ドライバ固有の機能を説明します。
- 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
フィールドには、ドライバが検出したボタンの数が保持されています。
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
-
これらのコマンドは
ドライバではサポートされません。
- MOUSE_GETSTATE mousestatus_t *status
-
このコマンドはボタンの現在の状態と動きのカウントを
mouse(4)
で定義された構造体で返します。
コンソールとコンソール制御 Ioctl
ユーザプログラムは、現在の仮想コンソールに対してコンソール
Fn ioctl
システムコールを発行し、マウスポインタを制御します。コンソール
Fn ioctl
はまた、ボタンが押された時に
signal(3)
を受け取る手段をユーザプロセスに提供します。
マウスデーモン
moused(8)
は、
コンソール制御デバイス
/dev/consolectl
に対して
Fn ioctl
システムコールを用いることにより、
マウスの動きとボタンの状態を含むマウスの動作をコンソールに通知します。
両方のクラスの
Fn 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
に情報を取り、その上で動作します。
ドライバがオープンされている場合、マウスデータは
ドライバに送られます。
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
フィールドは、プロセスに送るシグナルを指定します。この値は
Ao Pa signal.h Ac
で定義された値のうちのひとつである必要があります。
mode
フィールドは現在は使用されていません。
- event
-
struct mouse_event {
int id;
int value;
};
id
フィールドは、
u.data.buttons
と同じように、ボタン番号を指定します。
1 ビット/ボタンだけを設定できます。
value
フィールドは、クリック数を保持しています。これは、ユーザがボタンを
連続して押した回数です。
索引
関連ファイル
- /dev/consolectl
-
コンソールを制御するデバイス
- /dev/sysmouse
-
仮想化されたマウスドライバ
- /dev/ttyv%d
-
仮想コンソール
索引
関連項目
vidcontrol(1),
ioctl(2),
signal(3),
mouse(4),
moused(8)
索引
歴史
マニュアルページは、
Fx 2.2
で初めて現れました。
索引
作者
このマニュアルは
An John-Mark Gurney Aq gurney_j@efn.org
と
An Kazutaka Yokota Aq yokota@FreeBSD.org
が書きました。
索引
Index
- 名称
-
- 書式
-
- 解説
-
- 機能レベル
-
- IOCTL
-
- Sysmouse Ioctl
-
- コンソールとコンソール制御 Ioctl
-
- 関連ファイル
-
- 関連項目
-
- 歴史
-
- 作者
-
Time: 07:07:25 GMT, January 12, 2009