MOUSE(4) — NEWS-OS Programmer’s Manual
名称
mouse − NEWS マウスデバイスインターフェース
形式
device ms0 at iop0 priority 40
device ms0 at hb0 priority 40
/dev/mouse
#include <sys/time.h>
#include <newsiop/mouse.h>
解説
mouse は、NEWS のマウスデバイスのインターフェースです。
インターフェースには、 sample と event の 2 つのモードがあります。 event モードにおいて、インターフェースは、 マウスのイベントレポートのキューを保守します。 mouse がオープンされると、インターフェースは sample モードに設定され、マウスの座標位置は (0, 0) に設定されます。 モードは、次に記した ioctl() を使用して変えることができます。 mouse をクローズすると、インターフェースは sample モードにリセットされます。インターフェースのモードが event から sample モードへ設定されると、マウスのイベントキューはフラッシュされます。
sample モードにおいて、read() システムコールで返されるマウスデータは、 ヘッダファイル <newsiop/msreg.h> で定義されています。
struct ms_data {
intmd_sw;/∗ マウスボタン ∗/
#defineMS_BUTNL0x04
#defineMS_BUTNM0x02
#defineMS_BUTNR0x01
intmd_x;/∗ x 座標 ∗/
intmd_y;/∗ y 座標 ∗/
};
前記の md_sw は、マウスボタンステータスを符号化したもので、 ボタンが押されていると、’1’ と符号化されます (つまり md_sw & MS_BUTNL が真ならば、左ボタンが押されている。他も同様)。 マウスデータの個数は、sizeof(struct ms_data) の倍数です。 しかし、1 度に複数のマウスデータを要求することは、 このモードでは有益ではありません。
event モードにおいて、read() システムコールで返されるマウスデータは、 次のように定義されたマウスイベントレポートです。
/∗
∗ マウスイベントレポート
∗ イベントレポートは、mouse が event モードにあるとき、
∗ MSIOCSETEM ioctl() を使用することによってキューに入れられます。
∗/
struct ms_event {
struct ms_datamse_data;/∗ マウスの X, Y 座標とボタンステータス ∗/
charmse_trig;/∗ このイベントの起因 ∗/
#define MSE_MOTION0/∗ マウスの移動 ∗/
#define MSE_BUTTON1/∗ マウスのボタン ∗/
#define MSE_KEY2/∗ キーボードのキー ∗/
charmse_dir;/∗ キーまたはボタンの方向 ∗/
#define MSE_DOWN0/∗ 下 ∗/
#define MSE_UP1/∗ 上 ∗/
#define MSE_UNKNOWN2/∗ 未定義 ∗/
charmse_code;/∗ キーまたはボタンコード ∗/
#define MSE_BUTNR0/∗ 右ボタン ∗/
#define MSE_BUTNM1/∗ 中央ボタン ∗/
#define MSE_BUTNL2/∗ 左ボタン ∗/
struct timevalmse_time;/∗ イベントが起こった時刻 ∗/
};
read() システムコールで返されたマウスイベントレポートは、 sizeof(struct ms_event) の倍数です。 そのレポートがインターフェース中で保持されている数は、現在 128 です。 mse_data は、 sample モードと同じマウスデータです。 mse_trig は、イベントを起こした原因です。 マウスの移動 (MSE_MOTION)、マウスボタンステータスの変化 (MSE_BUTTON)、 そしてキーボードステータスの変化 (MSE_KEY) があります。 mse_dir は、マウスボタンやキーボードキーの押下/解放の変化を示します。 これは、 mse_trig が MSE_MOTION であるときは意味がありません。 mse_code は、マウスボタンのコード (mse_trig が MSE_BUTTON の時)か、キーボードのキー (mse_trig が MSE_KEY の時)です。 キーコードに関しては、<newsiop/mouse.h> を参照してください。 最後に、 mse_time はこのイベントが起きた時刻です。 時刻の形式は、<sys/time.h> で定義されています。
mouse に書き込みをすることで、マウスの動きをシミュレートすることができます。 マウス位置を指定するデータ形式は次のとおりです。
struct ms_coord {
int mc_x; /∗ x 座標 ∗/
int mc_y; /∗ y 座標 ∗/
}ms_coord;
IOCTL
MSIOCSETEM は、2 モードの切り替えとイベントマスクの定義を行います。
#define MS_EMEVENT 0x80 /∗ 1 −> event モード ∗/
#define MS_EMKEY0x40 /∗ キーボードのキー変化 −> event ∗/
#define MS_EMMOTION 0x10 /∗ 座標変化 −> event ∗/
#define MS_EMBUTNL 0x04 /∗ 左ボタン変化 −> event ∗/
#define MS_EMBUTNM 0x02 /∗ 中央ボタン変化 −> event ∗/
#define MS_EMBUTNR 0x01 /∗ 右ボタン変化 −> event ∗/
int eventmask;
ioctl(fildes, MSIOCSETEM, &eventmask);
MS_EMEVENT は、モードを制御します。MS_EMEVENT が OFF ならば、インターフェースは、 sample モードに設定されます。また、ON ならば、 event モードになります。 MS-EMEVENT が ON ならば、イベントが起こった原因を表す他のビットが示されます。
MSIOCGETEM イベントマスクを取り出します。
int eventmask;
ioctl(fildes, MSIOCGETEM, &eventmask);
MSIOCSETXY マウス位置を設定します。
struct ms_coord ms_coord;
ioctl(fildes, MSIOCSETXY, &ms_coord);
MSIOCFLUSH イベントキューをフラッシュします。
ioctl(fildes, MSIOCFLUSH);
MSIOCSETPARAM
マウスパラメータを設定します。パラメータには、 mp_delta と mp_mag の 2 つがあります。マウスが mp_delta より大きく動くと、超過した移動量は、 mp_mag倍されます。 mp_deltaの初期設定は5で、 mp_mag は 3 です。
/∗ 構造体 ms_param:
∗ マウスが mp_delta より大きく動くと、超過分の移動量
∗は map_mag(>0) 倍に拡大されます。
∗/
struct ms_param {
intmp_delta;/∗ 拡大のしきい値 ∗/
intmp_mag;/∗ 拡大の倍率 ∗/
};
struct ms_param ms_param;
ioctl(fildes, MSIOCSETPARAM, &ms_param);
関連ファイル
/dev/mouse
NEWS-OSRelease 4.2.1R