スポンサーリンク

SYSMOUSE(4) FreeBSD/i386 カーネルインタフェースマニュアル SYSMOUSE(4)

名称

sysmouse − 仮想化されたマウスドライバ

書式

#include <machine/mouse.h>
#include <machine/console.h>

解説

マウスデーモン moused(8) と一緒に使うことにより、コンソールドライバは、 sysmouse ドライバを通して、ユーザプロセスに標準的な方法でマウスのデータを 提供します。このように整理することで、 (

                                               X Window System などのような)ユーザプロセスとコンソールとでマウスを共有することができるようになります。
ユーザプロセスがマウス機能を利用しようとする場合、単に open(2) システムコールで /dev/sysmouse をオープンし、 read(2) システムコールを用いてマウスデータを読み込むだけでよいです。ここで、確実に moused(8) を実行しておいて下さい。さもないと、ユーザプロセスはマウスからデータを一切受け取ることができないでしょう。
機能レベル     sysmouse ドライバには 2 つの機能レベルがあります。現在の機能レベルはioctl システムコールにより参照、変更することができます。
レベル 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 でコード化されます。

IOCTL

この節では、2 種類の ioctl(2) コマンドについて説明します。 1 つは、 sysmouse ドライバそれ自体に対するコマンドで、もう 1 つは、コンソールとコ ンソール制御ドライバに対するコマンドです。

Sysmouse Ioctl

マウスドライバに対するコマンドがいくつかあります。このコマンド一般の説明 は、 mouse(4) にあります。以下では、 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) で定義 された構造体で返します。

コンソールとコンソール制御 Ioctl
ユーザプログラムは、現在の仮想コンソールに対してコンソール 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_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
仮想コンソール

関連項目

vidcontrol(1), ioctl(2), signal(3), mouse(4), moused(8)

歴史

sysmouse マニュアルページは、 FreeBSD 2.2 で初めて現れました。

作者

このマニュアルは John-Mark Gurney ⟨gurney_j@efn.org⟩ と
Kazutaka Yokota ⟨yokota@FreeBSD.org⟩ が書きました。

FreeBSD December 3, 1997 FreeBSD

スポンサーリンク