この章の目次にもどる
前頁:1.6 ファイル管理にもどる
次頁:1.8 デバイス管理にすすむ

1.7 イベント管理

1.7.1 イベント管理機能の概要

イベント管理機能は、インタラクティブなヒューマンインタフェースを実現するため に、ユーザとの対話に使用するキーボード(KB)とポインティングデバイス(PD)の 操作を「イベント」という形で統一的に取り扱う機能であり、この機能により、柔軟な インタラクティブ操作を実現することが可能となる。

キーボードおよび、ポインティングデバイスの操作は「イベント」としてシステムで1つのイベントキューに順次格納され、アプリケーションはイベントキューからイベントを順次取り出し、それに対応するアクションを実行する「イベント駆動形式」の形態を取ることになる。

マルチプロセス環境の場合、ユーザとのインタラクティブ操作を必要とするプロセスはある時点では必ず1つであり、ユーザとの「入力受付状態」を複数のプロセス間で相互に受け渡していく形態をとる。

従って、ある時点で入力受付状態となっているプロセスのみがイベント管理機能を使用してイベントを取り出すというルールを前提としており、アプリケーションはこのルールに従った動作をしなくてはいけない。イベント管理機能自体では、このルールを保証する機構は特に提供しておらず、外殻レベルで提供することになる。

イベント管理機能には、イベントの管理以外にも、キーボード、およびポインティング デバイスの状態/属性の取出し、設定等の機能も含まれており、インタラクティブな入 力装置に対する統一的なインタフェースを提供している。

1.7.2 イベント

イベントの種類

以下のタイプのイベントが定義される。

ボタンダウンイベント ( EV_BUTDWN ):

ポインティングデバイスのボタンが押された時に発生する。

ボタンアップイベント ( EV_BUTUP ):

ポインティングデバイスのボタンが離された時に発生する。

キーダウンイベント ( EV_KEYDWN ):

シフトキー等の特殊キー(メタキー)以外の通常キーが押された時に発生する。

キーアップイベント ( EV_KEYUP ):

シフトキー等の特殊キー(メタキー)以外の通常キーが離された時に発生する。

自動リピートキーイベント ( EV_AUTKEY ):

自動リピートの対象となるキーが押され続けていた時に周期的に発生する。 自動リピートの対象となるキーを押してから、 最初に自動リピートキーイベントが発生するまでの時間(オフセット)、 およびその後の発生間隔(インターバル)は任意に設定可能である。

デバイスイベント ( EV_DEVICE ):

キーボード、ポインティングデバイス以外のデバイスのある種の操作に伴って発生する汎用的なイベントであり、その内容はデバイスに依存する。 フロッピーディスク等の取り外し可能メディアを装着した場合は、 このイベントが発生する。

ヌルイベント ( EV_NULL ):

対象とするイベントが発生していないことを示す擬似的なイベント。

アプリケーションイベント ( EV_APPL1 〜 EV_APPL8 ):

アプリケーションにより定義され使用されるイベントであり、 アプリケーション間での通信機能として使用される。 アプリケーションイベントのいくつかは外殻により、その意味が定義さ れる。

物理的なキーボードが存在しない場合は、イベント管理の段階では EV_KEYDWN, EV_KEYUP, EV_AUTOKEYは発生しない。ソフトキーボードのようなフロントエンドプロセスで、ボタンイベントが適当なキーイベントに変換されて、アプリケーションに渡される。

イベントのタイプは、0 〜 15 のタイプ番号で区別される。また各イベントタイプに 対応したタイプマスクが定義されており、このマスクにより、対象とするイベントの タイプを指定することができる。タイプマスクはビット対応となっており、"1"のビ ットに対応するタイプのイベントが対象とされる。ただし、ヌルイベントに対しては、その性質上マスクは定義されない。

    イベント    タイプ番号      タイプマスク
    EV_NULL     0       --------
    EV_BUTDWN   1       EM_BUTDWN (0x0001)
    EV_BUTUP    2       EM_BUTUP  (0x0002)
    EV_KEYDWN   3       EM_KEYDWN (0x0004)
    EV_KEYUP    4       EM_KEYUP  (0x0008)
    EV_AUTKEY   5       EM_AUTKEY (0x0010)
    EV_DEVICE   6       EM_DEVICE (0x0020)
    EV_RSV      7       EM_RSV    (0x0040) ( 予約 )
    EV_APPL1    8       EM_APPL1  (0x0080)
     ::                ::
    EV_APPL8    15      EM_APPL8  (0x4000)
なお、タイプマスクとしては以下の特殊なマスクも用意されている。
    EM_NULL 0x0000
    EM_ALL  0x7fff

イベントの構造

イベントは以下に示す構造体で定義される。

typedef struct {
    W   type;           /* イベントタイプ */
    UW  time;           /* イベント発生時刻 */
    PNT pos;            /* イベント発生時のPD位置 */
    EVDATA  data;       /* イベントの固有データ */
    UW  stat;           /* メタキー、PDボタン状態 */
} EVENT;
type:
イベントのタイプを示す 0 〜 15 の値である。
time:
イベント発生時刻を示すミリ秒単位の相対的な時刻であり、この値はイベントの発生順序、発生間隔を示しているもので絶対時刻としての意味は持たない。
内部的にイベントタイマーと呼ばれる、ミリ秒単位で加算される32ビットのタイマーが存在し、イベントが発生した時点のタイマーの値がイベント発生時刻としてセットされる。32ビットをオーバーフローした場合は単に上位ビットが捨てられる。イベントタイマーの分解能はインプリメントに依存する。
なお、アプリーションイベントでの time の意味はイベントの定義に依存する。
pos:
イベント発生時点のポインティングデバイスの座標位置を、スクリーンの左上を (0, 0) とした絶対座標値で示すもので、以下の PNT タイプの値である。
        typedef struct point {
            H   x;  /* 水平座標値 */
            H   y;  /* 垂直座標値 */
        } PNT;

なお、アプリーションイベントでの pos の意味はイベントの定義に依存する。

data:
イベントの固有データであり、イベントのタイプに依存した内容である。
    typedef union {
        struct {        /* EV_KEYUP,EV_KEYDWN,EV_AUTKEY */
            UH  keytop; /* キートップコード */
            TC  code;   /* 文字コード */
        } key;
        struct {        /* EV_DEVICE */
            H   kind;   /* デバイスイベント種別 */
            H   devno;  /* デバイス番号 */
        } dev;
        W   info;       /* その他のイベント用データ */
    } EVDATA;
EV_KEYDWN, EV_KEYUP, EV_AUTKEY の場合は、key が適用され、キーの物理的な位置を示すキートップコードと、エンコードされた文字コードからなる。
EV_DEVICE の場合は、dev が適用され、デバイスイベントの種別(kind)とイベントが発生したデバイスを示すデバイス番号(devno)からなる。イベントの種別は以下に示すものである。
        kind = DE_unknown  0       -- 未定義
            DE_MOUNT        0x01    -- メディア挿入
            DE_EJECT        0x02    -- メディア排出
            DE_ILLMOUNT     0x03    -- メディア不正挿入
            DE_ILLEJECT     0x04    -- メディア不正排出
            DE_REMOUNT      0x05    -- メディア再挿入
            DE_CARDBATLOW   0x06    -- カードバッテリ残量警告
            DE_CARDBATFAIL  0x07    -- カードバッテリ異常
            DE_REQEJECT     0x08    -- メディア排出要求
                            0x09〜  -- 予約
これらのデバイスイベントは、 デバイスドライバーからの事象通知により発生する。
EV_NULL, EV_BUTDWN, EV_BUTUP の場合は、この data は使用されず、info は常に 0 となる。
アプリーションイベント(EV_APPL1〜8) の場合は、イベントの定義に依存した内容となる。
stat:
イベント発生時点のメタキーとポインティングデバイスのボタンの状態をビット対応で示すものである。各ビットは、&auot;0&auot;が離されている(OFF)状態、"1" が押されている(ON)状態を意味する。
        ES_BUT      0x0001  -- PDのメインボタン状態
        ES_BUT2     0x0002  -- PDのサブボタン状態
        ES_ALPH     0x0004  -- 英語ロックキー状態
        ES_KANA     0x0008  -- カタカナロックキー状態
        ES_LSHFT    0x0010  -- 左シフトキー状態
        ES_RSHFT    0x0020  -- 右シフトキー状態
        ES_EXT      0x0040  -- 拡張シフトキー状態
        ES_CMD      0x0080  -- 命令シフトキー状態
    
ポインティングデバイスのサブボタン(メニューボタン)は、押されてもイベントは発生しない。また、上記のキーはメタキーであり、押されてもイベントは発生しない。
また、下記の状態を示す情報も含まれる。
        ES_LLSHFT   0x00000100  -- 左シフト簡易ロック
        ES_LRSHFT   0x00000200  -- 右シフト簡易ロック
        ES_LEXT     0x00000400  -- 拡張簡易ロック
        ES_LCMD     0x00000800  -- 命令簡易ロック
        ES_TLSHFT   0x00001000  -- 左シフト一時シフト
        ES_TRSHFT   0x00002000  -- 右シフト一時シフト
        ES_TEXT     0x00004000  -- 拡張一時シフト
        ES_TCMD     0x00008000  -- 命令一時シフト
        ES_HAN      0x00010000  -- 半角キー
        ES_NODSP    0x00200000  -- ポインタ非表示
        ES_PDSIM    0x00C00000  -- PDシュミレーション
これらの状態変化はイベントを発生しない。

イベントキュー

イベントキューは、システムに唯 1 つ用意されているイベント格納用のキューであり、イベントが発生順に格納される。キューに空きが無い場合は、新規に発生したイベント、即ち、一番新しいイベントはキューに入れられず、捨てられることになる。

イベントキューに格納されるイベントは、システムイベントマスクにより制限される。即ち、システムイベントマスクの "1" のビットに対応するタイプのイベントのみがイベントキューに入り、"0" のビットに対応するタイプのイベントはシステム全体として無視されて捨てられる。

システムのスタートアップ時点では、イベントキューは空、システムイベントマスクは 0 となっており、イベント管理機能は事実上動作していない状態であるため、必ずシステムイベントマスクを適当な値に設定する必要がある。

イベントには、そのタイプに応じた以下に示す優先度が付けられており、高い優先度のイベントから取り出される。同一優先度の場合は、発生順に取り出される。

    ( 1: 最高優先度 〜 6:最低優先度 )
    1. EV_APPL1〜4 
    2. EV_BUTDWN, EV_BUTUP, EV_KEYDWN, EV_KEYUP
    3. EV_AUTKEY
    4. EV_DEVICE, EV_RSV
    5. EV_APPL5〜8
    6. EV_NULL
ヌルイベント(EV_NULL)、および自動リピートキーイベント(EV_AUTKEY) は、実際にはイベントキューには入れられず、イベントの取り出し要求時に自動的に生成されることになる。
ヌルイベント(EV_NULL):
要求されたタイプのイベントが発生していない場合に生成されて取り出される。
自動リピートキーイベント(EV_AUTKEY):
以下の条件が満足された場合、生成されて取り出される。
  1. EV_AUTKEY は要求されたタイプの1つである。
  2. EV_AUTKEY に対応するシステムイベントマスクのビットは "1" である。
  3. EV_AUTKEY より優先度の高いイベントが発生していない。
  4. 最新の EV_KEYDWN の発生キーが押され続けられている。
  5. 最新の EV_KEYDWN の発生以降、設定されているオフセット時間、 またはインターバル時間が経過した。
  6. 自動リピートの対象キーである。
なお、1つのキーを押し続けている状態で、さらに別のキーを押し続けた場合は、最後に押したキーの自動リピートキーイベントのみが発生することになる。

1.7.3 キーボード

メタキー

TRONキーボードにおいて以下のキーはメタキーであり、押したり離したりした場合でもイベントは発生しないが、その状態はイベント内の stat フィールドにセットされ、また文字コードのエンコードに使用される。

メタキーは先に押された場合のみ文字のエンコードに対して有効となる。

自動リピートキー

自動リピートキーイベント(EV_AUTKEY) は、自動リピートの対象キーが押し続けられた場合に発生する。

自動リピートの対象キーはイベントを発生しないメタキーを除いて任意に設定可能であ り、システム立ち上げ時には、メタキーを除いたすべてのキーを自動リピートの対象と する。

押してから最初に発生するまでの時間(オフセット時間)と、その後の発生間隔(インタ ーバル時間)の設定/取出し用のシステムコールが提供されている。 この時間はミリ秒 単位である。

但し、自動リピートキーイベントの発生間隔はインプリメントに依存しており、オフ セット時間とインターバル時間は、イベント発生時刻の単位へ丸められる。

文字コード

キーイベントでは、キーの物理的位置を示すキートップコードと、エンコードされた文字コードを戻す。

キートップコードは、キーの物理的位置に応じた固定的な8ビットのコード ( 0 〜255 ) であり、メタキーの状態により異なった文字コードにエンコードされる。

文字コードへのエンコードは「文字コード変換表」を使用して行なわれる。通常、ユーザーの使用する言語、入力方式(ローマ字入力/かな入力等)に対応した変換表が、ユーザー毎に設定されることになる。

文字コード変換表は以下の構造を持つ。

typedef struct {
    W   keymax;         /* 実際の最大キー数 (1〜256) */
    W   kctmax;         /* 実際の変換表の数 (1〜64) */
    UH  kctsel[KCTSEL]; /* 変換表の番号 (0〜kctmax-1の値) */
    UH  kct[KCTMAX];    /* 変換表本体 (keymax×kctmax個の要素) */
} KeyTab;

キー状態

キーが押されているか否かの状態は、1つのキーを1ビットに対応させた以下に示す KeyMap 配列により定義され、この KeyMap 配列を取り出すためのシステムコールが提 供されている。

typedef UB  KeyMap[KEYMAX/8];       -- キー状態配列
キー状態 (KeyMap)
図 13 : キー状態 (KeyMap)

なお、この KeyMap 配列は、自動リピートの対象となるキーの設定 / 取出しにも使用される。この場合、"1 "のビットに対応するキーが自動リピートの対象となる。

キーボードID

現在接続されているキーボードの種類を知るために以下にように定義されるキーボードIDを取り出すことが可能である。

typedef struct {
    UH  kind;           /* キーボードタイプ */
    UH  maker;          /* メーカーID */
    UB  id[4];          /* メーカー依存キーボードID */
} KBD_ID;
kind:0000 000T TTTT TTMP
    P= 0          -- ポインティングデバイスがキーボードに内蔵されていない
       1          -- ポインティングデバイスがキーボードに内蔵されている
    M= 0          -- ロックキーは電子ロック式
       1          -- ロックキーはメカニカルロック方式
    T=0x00        -- 未定義キーボード
      0x01        -- TRON日本語キーボード
      0x02〜0x3F  -- 予約 (TRON 仕様のキーボード)
      0x40        -- IBM 101 系英語キーボード
      0x41        -- IBM 106 系日本語キーボード
      0x42〜0x7f  -- 予約 (TRON 仕様以外のキーボード)
    
maker:
メーカーを表わすIDであり、get_ver() で得られるメーカーの値と同じものである。
id[4]:
メーカーに依存したキーボードの種別を表わすIDで4バイトから構成される。

1.7.4 ポインティングデバイス

ポインティングデバイス

ポインティングデバイスは、スクリーン上に表示されているオブジェクトを選択するために使用され、その現在位置として、スクリーンの解像度に対応したレンジの絶対座標値を持つ。 絶対座標値とは、スクリーンの左上の点を ( 0, 0 )とし、スクリーン上の 1 ピクセルを単位とした座標値である。

ポインティングデバイスの動作タイプ

ポインティングデバイスは、その動作方式から以下の 2 種類に大きく分類される。

絶対動作タイプ:
電子ペン等のタブレットタイプのもので、ポインティングデバイスの 物理的な位置により、絶対的に座標値が決定されるもの。
相対動作タイプ(差動タイプ):
マウス等で、ポインティングデバイスの物理的な位置の移動により、 相対的に座標値が決定されるもの。

相対動作タイプの場合は、ポインティングデバイスの(基準)位置を任意に設定するこ とが可能であるが、絶対動作タイプの場合は、位置の設定は不可となる。

なお、ポインティングデバイスによっては、絶対/相対動作の両方の動作を切り換える ことが可能なものもある。

ポインティングデバイスの属性

ポインティングデバイスの属性として以下のものが定義され、取り出し/設定が可能である。

感度:
相対動作タイプの場合のみ定義され、ポインティングデバイスの移動 量と、座標値の移動量と比率を表わすもので、感度が高い程、ポイン ティングデバイスの移動量に対する、座標値の移動量が大きくなる。
最低感度(0)〜最高感度(15) の16段階で定義される。
スキャン速度
ポインティングデバイスの位置を取り出すことが可能な時間間隔を示 すものであり、スキャン速度が高速な程、時間間隔が狭まることになる。
最低速(0)〜最高速(15) の16段階で定義される。

1.7.5 データ/定数の定義

□ イベント固有データ

typedef union {
    struct {            /* EV_KEYUP,EV_KEYDWN,EV_AUTKEY */
        UH  keytop;     /* キートップコード */
        TC  code;       /* 文字コード */
    } key;
    struct {            /* EV_DEVICE */
        H   kind;       /* デバイスイベント種別 */
        H   devno;      /* デバイス番号 */
    } dev;
    W   info;           /* その他のイベント用データ */
} EVDATA;

□ イベント

typedef struct {
    W       type;           /* イベントタイプ */
    UW      time;           /* イベント発生時間(m sec) */
    PNT     pos;            /* イベント発生時のPD位置 */
    EVDATA  data;           /* イベントの固有データ */
    UW      stat;           /* メタキー、PDボタン状態 */
} EVENT;

□ イベントタイプ

#define EV_NULL     0       /* ヌルイベント */
#define EV_BUTDWN   1       /* ボタンダウン */
#define EV_BUTUP    2       /* ボタンアップ */
#define EV_KEYDWN   3       /* キーダウン */
#define EV_KEYUP    4       /* キーアップ */
#define EV_AUTKEY   5       /* 自動キーリピート */
#define EV_DEVICE   6       /* デバイスイベント */
#define EV_RSV      7       /* 予約 */
#define EV_APPL1    8       /* アプリケーションイベント#1 */
#define EV_APPL2    9       /* アプリケーションイベント#2 */
#define EV_APPL3    10      /* アプリケーションイベント#3 */
#define EV_APPL4    11      /* アプリケーションイベント#4 */
#define EV_APPL5    12      /* アプリケーションイベント#5 */
#define EV_APPL6    13      /* アプリケーションイベント#6 */
#define EV_APPL7    14      /* アプリケーションイベント#7 */
#define EV_APPL8    15      /* アプリケーションイベント#8 */

□ イベントマスク

#define EM_NULL     0x0000
#define EM_ALL      0x7fff
#define EM_BUTDWN   0x0001
#define EM_BUTUP    0x0002
#define EM_KEYDWN   0x0004
#define EM_KEYUP    0x0008
#define EM_AUTKEY   0x0010
#define EM_DEVICE   0x0020
#define EM_RSV      0x0040
#define EM_APPL1    0x0080
#define EM_APPL2    0x0100
#define EM_APPL3    0x0200
#define EM_APPL4    0x0400
#define EM_APPL5    0x0800
#define EM_APPL6    0x1000
#define EM_APPL7    0x2000
#define EM_APPL8    0x4000

□ メタキー、PDボタン状態(0: OFF、1:ON)

#define ES_BUT      0x00000001  /* PDメインボタン */
#define ES_BUT2     0x00000002  /* PDサブボタン */
#define ES_ALPH     0x00000004  /* 英語ロックキー */
#define ES_KANA     0x00000008  /* カタカナロックキー */
#define ES_LSHFT    0x00000010  /* 左シフトキー */
#define ES_RSHFT    0x00000020  /* 右シフトキー */
#define ES_EXT      0x00000040  /* 拡張キー */
#define ES_CMD      0x00000080  /* 命令キー */
#define ES_LLSHFT   0x00000100  /* 左シフト簡易ロック */
#define ES_LRSHFT   0x00000200  /* 右シフト簡易ロック */
#define ES_LEXT     0x00000400  /* 拡張簡易ロック */
#define ES_LCMD     0x00000800  /* 命令簡易ロック */
#define ES_TLSHFT   0x00001000  /* 左シフト一時シフト */
#define ES_TRSHFT   0x00002000  /* 右シフト一時シフト */
#define ES_TEXT     0x00004000  /* 拡張一時シフト */
#define ES_TCMD     0x00008000  /* 命令一時シフト */
#define ES_HAN      0x00010000  /* 半角キー */
#define ES_NODSP    0x00400000  /* ポインタ非表示 */
#define ES_PDSIM    0x00800000  /* PDシュミレーション */

□ 入力モード

#define IM_HIRA     0x0000          /* 日本語ひらがな */
#define IM_ALPH     (ES_ALPH)       /* 英語(小文字) */
#define IM_KATA     (ES_KANA)       /* 日本語カタカナ */
#define IM_CAPS     (ES_ALPH | ES_KANA) /* 英語(大文字) */
#define IM_MASK     (ES_ALPH | ES_KANA)
#define KIN_KANA    0x0000          /* かな入力モード */
#define KIN_ROMAN   0x0001          /* ローマ字入力モード */

□ デバイスイベント(EV_DEVICE)の種別(EVDATA.dev.kind)

typedef enum {
    DE_unknown      = 0,        /* 未定義 */
    DE_MOUNT        = 0x01,     /* メディア挿入 */
    DE_EJECT        = 0x02,     /* メディア排出 */
    DE_ILLMOUNT     = 0x03,     /* メディア不正挿入 */
    DE_ILLEJECT     = 0x04,     /* メディア不正排出 */
    DE_REMOUNT      = 0x05,     /* メディア再挿入 */
    DE_CARDBATLOW   = 0x06,     /* カードバッテリ残量警告 */
    DE_CARDBATFAIL  = 0x07,     /* カードバッテリ異常 */
    DE_REQEJECT     = 0x08      /* メディア排出要求 */
} DevEvtKind;

□ put_evt()

#define EP_NONE     0x0000      /* time,pos,stat はそのまま */
#define EP_POS      0x0001      /* pos に現在PD位置を設定 */
#define EP_STAT     0x0002      /* stat に現在メタキー状態を設定 */
#define EP_TIME     0x0004      /* time に現在時間を設定 */
#define EP_ALL      0x0007      /* pos,stat,time に現在値を設定 */

□ chg_pda()

#define PD_REV      0x1000      /* 左右反転 */
#define PD_ABS      0x0100      /* 絶対座標タイプ */
#define PD_REL      0x0000      /* 相対座標タイプ */
#define PD_SCMSK    0x00f0      /* スキャン速度 (マスク) */
#define PD_SNMSK    0x000f      /* 感度 (マスク) */

□ キーボード

typedef struct {
    UH  kind;           /* キーボードタイプ */
    UH  maker;          /* メーカーID */
    UB  id[4];          /* メーカー依存キーボードID */
} KBD_ID;

□ キーマップ

#define KEYMAX      256
typedef UB  KeyMap[KEYMAX/8];

□ キーテーブル

#define KCTSEL      64
#define KCTMAX      4000
typedef struct {
    W   keymax;             /* 実際の最大キー数 */
    W   kctmax;             /* 実際の変換表の数 */
    UH  kctsel[KCTSEL];     /* 変換表の番号 */
    UH  kct[KCTMAX];        /* 変換表本体 */
} KeyTab;

□ ctl_buz()

                    /* <取り出し> */
#define GET_BUZ_BEEP    0x0000      /* 音色:標準の警告音 */
#define GET_BUZ_PDON    0x0001      /* 音色:ボタンONのクリック音 */
#define GET_BUZ_PDOFF   0x0002      /* 音色:ボタンOFFのクリック音 */
#define GET_BUZ_KEYON   0x0003      /* 音色:キーONのクリック音 */
#define GET_BUZ_KEYOFF  0x0004      /* 音色:キーOFFのクリック音 */
#define GET_BUZ_VOLUME  0x0010      /* 音量 */
                    /* <設定> */
#define SET_BUZ_BEEP    0x0100      /* 音色:標準の警告音 */
#define SET_BUZ_PDON    0x0101      /* 音色:ボタンONのクリック音 */
#define SET_BUZ_PDOFF   0x0102      /* 音色:ボタンOFFのクリック音 */
#define SET_BUZ_KEYON   0x0103      /* 音色:キーONのクリック音 */
#define SET_BUZ_KEYOFF  0x0104      /* 音色:キーOFFのクリック音 */
#define SET_BUZ_VOLUME  0x0110      /* 音量 */

1.7.6 システムコール

get_evt
 
イベントの取得

【形式】

WERR    get_evt(W t_mask, EVENT* evt, W opt)

【パラメータ】

W       t_mask  対象イベントタイプマスク

EVENT*  evt     取得したイベントの格納領域

W       opt     取得属性
                ( CLR ‖ NOCLR )
                CLR    イベントキューから取り除く。
                NOCLR  イベントキューから取り除かない。

【リターン値】

≧0    正常(得られたイベントのタイプ)
<0    エラー(エラーコード)

【解説】

指定したタイプのイベントをイベントキューから取り出す。
指定したタイプのイベントが発生していないときは、EV_NULL が取り出される。

【エラーコード】

ER_ADR      : アドレス(evt)のアクセスは許されていない。
ER_IO       : 入出力エラーが発生した(何らかのデバイスエラーが発生した)。
ER_PAR      : パラメータが不正である(t_mask≦0、optが不正)。
ER_NOSPC    : システムのメモリ領域が不足した。
put_evt
 
イベントの発生

【形式】

ERR put_evt(EVENT* evt, W opt)

【パラメータ】

EVENT*  evt   発生するイベント

W       opt   発生属性
        ( EP_NONE ‖ EP_ALL ‖ ([ EP_POS ] | [ EP_STAT ] | [EP_TIME]) )
        EP_NONE   time, pos, stat は evt の内容のままとする。
        EP_ALL    time, pos, stat のすべてを設定する。
        EP_POS    pos に現在のポインティングデバイスの位置を設定する。
        EP_STAT   stat に現在のメタキー/ PD ボタン状態を設定する。
        EP_TIME   time に現在のイベントタイマーの値を設定する。

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

指定したイベントを発生させてイベントキューに入れる。
イベントキューに空きがない場合、または、EV_NULL および EV_AUTKEY の指定したときはエラーとなる。
システムイベントマスクで対象外のイベントは実際には発生せず無視される。
発生したイベントは time の値にかかわらず、本システムコールを実行したときに発生したものとみなされ、常にイベントキューの最後に入れられる。

【エラーコード】

ER_ADR      : アドレス(evt)のアクセスは許されていない。
ER_IO       : 入出力エラーが発生した(何らかのデバイスエラーが発生した)。
ER_NOSPC    : システムのメモリ領域が不足した。
ER_PAR      : パラメータが不正である(イベントのタイプが不正、optが不正)。
clr_evt
 
イベントのクリア

【形式】

ERR clr_evt(W t_mask, W last_mask)

【パラメータ】

W   t_mask      クリア対象イベントタイプマスク
                =EM_ALL    全イベントタイプ

W   last_mask   クリア終了イベントタイプマスク
                =EM_ALL    イベントを1つだけクリア
                =EM_ALL    対象はイベントキューの最後まで

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

発生済みのイベントをクリアする。
イベントキューに入っているイベントのうち、t_mask で指定したタイプのイベントを last_mask で指定したタイプのイベントの直前までクリアする。last_mask で指定したタイプのイベントはクリアされないが、last_mask = EM_ALL のときは、特別にイベントを1つだけクリアすることを意味する。
t_mask と last_mask の指定例を以下に示す。
    t_mask      last_mask   動作
    EM_ALL      EM_NULL     全てのイベントをクリア
      --        EM_ALL      t_mask で指定したイベントを1つだけクリア
    EM_ALL      EM_ALL      先頭のイベントを1つだけクリア

【エラーコード】

ER_PAR      : パラメータが不正である(t_mask≦0、last_mask<0)。
get_pdp
 
PD位置の取得

【形式】

WERR    get_pdp(PNT* pos)

【パラメータ】

PNT*    pos PD位置の格納領域

【リターン値】

≧0    正常(発生しているイベントのタイプ)
<0    エラー(エラーコード)

【解説】

現在のポインティングデバイスの位置を絶対座標値で取り出す。
同時に発生しているイベントのタイプを戻す。何のイベントも発生していないときは EV_NULL を戻す。
イベントキューの内容は一切変化しない。

【エラーコード】

ER_ADR      : アドレス(pos)のアクセスは許されていない。
ER_BUSY     : PDはビジー状態である。
ER_DEV      : デバイスに対しての操作は許されていない。
ER_ERDEV    : 装置異常が発生した。
ER_IO       : 入出力エラーが発生した。
ER_NODEV    : デバイスへのアクセスができない。
ER_NOSPC    : システムのメモリ領域が不足した。
set_pdp
 
PD位置の設定

【形式】

WERR    set_pdp(PNT pos)

【パラメータ】

PNT pos 設定するPD位置(絶対座標)

【リターン値】

=0    正常(PD位置設定可)
=1    正常(PD位置設定不可)
<0    エラー(エラーコード)

【解説】

指定した絶対座標位置を現在のポインティングデバイスの位置として設定する。
指定する位置はポインティングデバイスの座標レンジの範囲内でなくてはいけない。
位置の設定ができたときは関数値 "0" を戻し、ポインティングデバイスの動作が絶対動作タイプのため位置の設定ができなかったときは関数値 "1" を戻す。

【エラーコード】

ER_BUSY     : PDはビジー状態である。
ER_DEV      : デバイスに対しての操作は許されていない。
ER_ERDEV    : 装置異常が発生した。
ER_IO       : 入出力エラーが発生した。
ER_NODEV    : デバイスへのアクセスができない。
ER_PAR      : パラメータが不正である(pos が座標レンジ外)。
ER_NOSPC    : システムのメモリ領域が不足した。
get_etm
 
イベントタイマー値の取得

【形式】

ERR get_etm(UW* time)

【パラメータ】

UW  *time   イベントタイマー値の格納領域

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

イベントタイマーの現在の値を取り出す。
イベントタイマーはミリ秒単位の相対的な時間であるが、実際の分解能はインプリメントに依存する。
本システムコールは一般的にミリ秒単位の相対時間を取り出すために使用される。

【エラーコード】

ER_ADR      : アドレス(time)のアクセスは許されていない。
get_kmp
 
キー状態の取得

【形式】

ERR get_kmp(KeyMap keymap)

【パラメータ】

KeyMap  keymap  キー状態の格納領域

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

現在のキー状態を取り出す。

【エラーコード】

ER_ADR      : アドレス(keymap)のアクセスは許されていない。
ER_BUSY     : キーボードはビジー状態である。
ER_DEV      : デバイスに対しての操作は許されていない。
ER_ERDEV    : 装置異常が発生した。
ER_IO       : 入出力エラーが発生した。
ER_NODEV    : デバイスへのアクセスができない。
ER_NOSPC    : システムのメモリ領域が不足した。
chg_emk
 
システムイベントマスクの変更

【形式】

WERR    chg_emk(W mask)

【パラメータ】

W   mask    設定するシステムイベントマスク
            <0    変更しない(現在のシステムイベントマスクの取得)

【リターン値】

≧0    正常(変更前のシステムイベントマスク)

【解説】

システムイベントマスクを指定した値に変更し、変更前のシステムイベントマスクの値を関数値として戻す。
mask <0 のときは変更せずに現在のシステムイベントマスクの値を関数値として戻す。

【エラーコード】

発生しない。
set_krp
 
自動リピート間隔の設定

【形式】

ERR set_krp(W offset, W interval)

【パラメータ】

W   offset      自動リピート最初の発生までの時間(ミリ秒)

W   interval    自動リピート発生間隔(ミリ秒)

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

自動リピートキーイベント(EV_AUTKEY)の発生までの時間、および間隔を設定する。
設定する時間はミリ秒単位であるが、実際の分解能はインプリメントに依存する。

【エラーコード】

ER_PAR      : パラメータが不正である(offset≦0,interval≦0)。
get_krp
 
自動リピート間隔の取得

【形式】

ERR get_krp(W* offset, W* interval)

【パラメータ】

W   *offset     自動リピート最初の発生までの時間(ミリ秒)の格納領域

W   *interval   自動リピート発生間隔(ミリ秒)の格納領域

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

自動リピートキーイベント(EV_AUTKEY)の発生までの時間、および間隔を取り出す。

【エラーコード】

ER_ADR      : アドレス(offset,interval)のアクセスは許されていない。
set_krm
 
自動リピート対象キーの設定

【形式】

ERR set_krm(KeyMap keymap)

【パラメータ】

KeyMap  keymap  自動リピート対象キーマップ

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

自動リピートの対象となるキーを設定する。
指定したキーマップの "1" のビットに対応するキーを自動リピートの対象とし、"0" のビットに対 応するキーを自動リピートの対象としない。
イベントを発生しないメタキーは自動リピートの対象としても無視される。

【エラーコード】

ER_ADR      : アドレス(keymap)のアクセスは許されていない。
get_krm
 
自動リピート対象キーの取得

【形式】

ERR get_krm(KeyMap keymap)

【パラメータ】

KeyMap  keymap  自動リピート対象キーマップの格納領域

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

自動リピートの対象となるキーを取り出す。
取り出したキーマップの "1" のビットに対応するキーが自動リピートの対象で、"0" のビットに対応するキーは自動リピートの対象でない。

【エラーコード】

ER_ADR      : アドレス(keymap)のアクセスは許されていない。
get_kid
 
キーボードIDの取得

【形式】

ERR get_kid(KBD_ID* id)

【パラメータ】

KBD_ID* id  キボードIDの格納領域

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

キーボードIDを取り出す。

【エラーコード】

ER_ADR      : アドレス(id)のアクセスは許されていない。
ER_BUSY     : キーボードはビジー状態である。
ER_DEV      : デバイスに対しての操作は許されていない。
ER_ERDEV    : 装置異常が発生した。
ER_IO       : 入出力エラーが発生した。
ER_NODEV    : デバイスへのアクセスができない。
ER_NOSPC    : システムのメモリ領域が不足した。
get_ktb
 
文字コード変換表の取得

【形式】

WERR    get_ktb(KeyTab* keytab)

【パラメータ】

KeyTab* keytab      文字コード変換表の格納領域
                    NULL  格納しない

【リターン値】

≧0    正常(文字コード変換表の全体のバイトサイズ)
<0    エラー(エラーコード)

【解説】

現在設定されている文字コード変換表を取り出し、文字コード変換表全体のバイトサイズを関数値として戻す。
keytab = NULL は、文字コード変換表のバイトサイズを取り出すために使用する。

【エラーコード】

ER_ADR      : アドレス(keytab)のアクセスは許されていない。
ER_BUSY     : キーボードはビジー状態である。
ER_DEV      : デバイスに対しての操作は許されていない。
ER_ERDEV    : 装置異常が発生した。
ER_IO       : 入出力エラーが発生した。
ER_NODEV    : デバイスへのアクセスができない。
ER_NOSPC    : システムのメモリ領域が不足した。
set_ktb
 
文字コード変換表の設定

【形式】

ERR set_ktb(KeyTab* keytab)

【パラメータ】

KeyTab* keytab      設定する文字コード変換表

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

指定した文字コード変換表を設定する。

【エラーコード】

ER_ADR      : アドレス(keytab)のアクセスは許されていない。
ER_BUSY     : キーボードはビジー状態である。
ER_DEV      : デバイスに対しての操作は許されていない。
ER_ERDEV    : 装置異常が発生した。
ER_IO       : 入出力エラーが発生した。
ER_NODEV    : デバイスへのアクセスができない。
ER_PAR      : パラメータが不正である(keytab の内容が不正)。
ER_NOSPC    : システムのメモリ領域が不足した。
chg_pda
 
ポインティングデバイス属性の変更

【形式】

WERR    chg_pda(W atr)

【パラメータ】

W   atr ポインティングデバイス属性
        <0    変更しない(現在のポインティングデバイス属性の取得)

【リターン値】

≧0    正常(変更前のPD属性)
<0    エラー(エラーコード)

【解説】

ポインティングデバイスの属性を変更し、変更前の属性を関数値として戻す。
atr <0 のときは変更せずに現在のポインティングデバイス属性を関数値として戻す。
ポインティングデバイス属性は以下の通りである。
        xx..xx xxxV xxxA RRRR SSSS

        A: 動作タイプ ( 0: 相対座標タイプ、 1: 絶対座標タイプ )
        S: 感度 ( 0: 最低感度 〜 15: 最高感度 )
        R: スキャン速度 ( 0: 最低速 〜 15: 最高速 )
        V: 左右反転 ( 0: 右手モード、 1: 左手モード )
        x: 予約 ( = 0 )
動作タイプの変更が不可能の場合はエラー(ER_DEV)となる。

【エラーコード】

ER_BUSY     : PDはビジー状態である。
ER_DEV      : デバイスに対しての操作は許されていない。
ER_ERDEV    : 装置異常が発生した。
ER_IO       : 入出力エラーが発生した。
ER_NODEV    : デバイスへのアクセスができない。
ER_PAR      : パラメータが不正である(atr)。
ER_NOSPC    : システムのメモリ領域が不足した。
sig_buz
 
ブザー音の発生

【形式】

ERR sig_buz(W type)

【パラメータ】

W   type    ブザー音の種別
        = 0    標準の警告ブザー
        = -1  ブザーの停止
        0xTTTTHHHH

        TTTT≠0の場合
            HHHH≧0 の場合 (ブザー)
                T: 鳴らす時間 (1 〜 32767 msec)
                H: 鳴らす周波数 (0 〜 32767 Hz)

            HHHH<0 の場合 (メロディー)
                T: 繰り返し回数 (1 〜 32767)
                H: メロディー番号 (-1 〜 -100)

        TTTT= 0 の場合 (ブザー)
            type = 0x0000thhh
            t: 鳴らす時間 (100msec 単位)
            h: 鳴らす周波数 (10Hz 単位)

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

指定した種類のブザー音またはメロディーを発生する。
メロディーは beep ドライバーに登録しておく必要がある。メロディーの登録は、beep ドライバーへ直接行う。
beep ドライバーがメロディーに対応していない場合は、メロディーの機能は使用できない。

【エラーコード】

ER_DEV      : デバイスに対しての操作は許されていない。
ER_ERDEV    : 装置異常が発生した。
ER_IO       : 入出力エラーが発生した。
ER_NODEV    : デバイスへのアクセスができない。
ER_PAR      : パラメータが不正である。
ctl_buz
 
ブザー音の制御

【形式】

ERR ctl_buz(W kind, UW *val)

【パラメータ】

W   kind    制御操作の種別

UW  *val    制御操作の値

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

ブザー音に対して各種の制御操作を行う。
kind:   GET_BUZ_BEEP    音色:標準の警告音の取り出し
        GET_BUZ_PDON    音色:ボタンONのクリック音の取り出し
        GET_BUZ_PDOFF   音色:ボタンOFFのクリック音の取り出し
        GET_BUZ_KEYON   音色:キーONのクリック音の取り出し
        GET_BUZ_KEYOFF  音色:キーOFFクリック音の取り出し
        GET_BUZ_VOLUME  音量:取り出し
        SET_BUZ_BEEP    音色:標準の警告音の設定
        SET_BUZ_PDON    音色:ボタンONのクリック音の設定
        SET_BUZ_PDOFF   音色:ボタンOFFのクリック音の設定
        SET_BUZ_KEYON   音色:キーONのクリック音の設定
        SET_BUZ_KEYOFF  音色:キーOFFのクリック音の設定
        SET_BUZ_VOLUME  音量:設定

val:    音色:  DTTT TTTT TTTT TTTT HHHH HHHH HHHH HHHH
        D:0:有効、1:無効(音なし)
        H≧0 の場合 (ブザー)
            T:時間(msec)
            H:周波数(Hz)
        H<0 の場合 (メロディー)
            T:繰り返し回数
            H:メロディー番号

    音量:  LLLL LLLL LLLL LLLL RRRR RRRR RRRR RRRR
        L:左チャンネル音量 (無音=0 〜 最大=0xffff)
        R:右チャンネル音量 (無音=0 〜 最大=0xffff)
        音量は、すべての警告音、クリック音に共通である。

【エラーコード】

ER_PAR      : パラメータが不正である。
ER_ADR      : アドレス(val)のアクセスは許されていない。
req_evt
 
イベントメッセージ要求

【形式】

ERR req_evt(W t_mask)

【パラメータ】

W   t_mask  対象イベントタイプマスク

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

t_mask で指定したタイプのイベントが発生した場合に、そのイベントをメッセージとして自プロセス(req_evt をコールしたプロセス)に送信することを要求する。
ただし、EV_NULL、EV_AUTKEY はメッセージとして送信することはできない。
メッセージとして送信されても、そのイベントはイベントキューから取り除かれない。
メッセージ形式

struct {
    W       msg_type;   /* メッセージタイプ = MS_SYS5 */
    W       msg_size;   /* メッセージサイズ */
    EVENT   evt;        /* イベント */
    VB      info[];     /* 追加情報 */
}
msg_type は、MS_SYS5 固定となる。
メッセージには、標準では発生したイベントが evt に格納される。また、イベントの種類によって、追加情報が info に格納される場合がある。したがって、msg_size は最低で sizeof(EVENT) となり、追加情報があればそのサイズ分大きくなる。追加情報はその内容によりサイズが異なる。
デバイスイベント(EV_DEVICE)の場合に、追加情報が付加される。追加情報は、デバイスドライバからの事象通知の内容そのものとなる。
rcv_msg() によりメッセージを受信したときの送信プロセス ID は次のようになる。 t_mask に EM_NULL を指定することにより、イベントメッセージの要求が解除される。また、プロセスが終了したときにも自動的に解除される。
プロセスのメッセージキューが一杯で送信できなかった場合には、そのイベントメッセージは単に捨てられる。
イベントメッセージ要求を同時に行えるプロセスの最大数は、システムで制限される。

【エラーコード】

ER_PAR      : パラメータが不正である。
ER_LIMIT    : イベントメッセージ要求の登録数がシステムの制限を超えた。
las_evt
 
最終イベント発生からの経過時間の取得

【形式】

WERR    las_evt(W t_mask)

【パラメータ】

W   t_mask  対象イベントタイプマスク

【リターン値】

≧0    正常(最終イベント発生からの経過時間)
<0    エラー(エラーコード)

【解説】

t_mask で指定したタイプのイベントの内、最後に発生したイベントから現在までの経過時間をミリ秒単位で返す。
t_mask に EM_BUTDWN または EM_BUTUP が指定された場合には、ポインタの移動およびメニューボタンの操作もイベント発生と扱う。また、EM_KEYDWN または EM_KEYUP が指定された場合には、メタキーの状態変化もイベント発生と扱う。
t_mask に EM_NULL を指定することで、すべてのタイプのイベントの最終発生時刻に現在時刻がセットされる。

【エラーコード】

ER_PAR      : パラメータが不正である。

この章の目次にもどる
前頁:1.6 ファイル管理にもどる
次頁:1.8 デバイス管理にすすむ