Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ mouse(4) — NEWS-os 3.3

Media Vault

Software Library

Restoration Projects

Artifacts Sought

MOUSE(4)  —  UNIX Programmer’s Manual

名前

mouse − NEWS マウスデバイスインタフェース

形式

ms0 at iop addr ffe550 intr 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 3.3

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026