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