この章の目次にもどる
前頁:2.2 ディスプレイ・ライブラリ定義にもどる
次頁:2.4 テキスト入力ポートにすすむ

2.3 ウィンドウイベント

□ ウィンドウイベント

IMPORT  WEVENT  wevt;

□ ウィンドウ情報レコード

typedef struct {
    W   wid;        /* ウィンドウID */
    W   chgmod;     /* ウィンドウ属性 */
                    /* 0x10+(W_MOVE/W_MOVEC/WHOLD):全面モード可 */
                    /* 0x20 : ドラッグ変形禁止 */
                    /* 0x40 : ドラッグ移動禁止 */
    RECT    limit;  /* 変形リミット */
    W   pid[3];     /* スクロールバーパーツID */
    W   info[2];    /* アプリケーション用 */
} WINFOREC;
typedef WINFOREC *WINFOPTR;

□ ウィンドウイベント関数テーブル

typedef struct {
    W       (*bgfn)(void);              /* バックグラウンド処理 */
    VOID    (*idlefn)(void);            /* idle 処理 */
    W       (*msgfn)(MESSAGE *msg);     /* 一般メッセージ処理 */
    W       (*menufn)(void);            /* メニュー処理 */
    VOID    (*dspfn)(W ix, W mode, RECT *new);  /* 表示処理 */
    VOID    (*stsfn)(W ix, W sts);      /* 状態変化処理 */
    W       (*keyfn)(void);             /* キー入力処理 */
    W       (*presfn)(W ix);            /* PDプレス処理 */
    W       (*finfn)(W ix, W mode);     /* 終了処理 */
    W       (*pastefn)(W ix, PNT pos);  /* 張り込み処理 */
    W       (*respfn)(W ix, W cmd);     /* 応答処理 */
    VOID    (*scrlfn)(W ix, W type, W diff);    /* スクロール処理 */
    VOID    (*devfn)(TC *devname);      /* デバイスイベント処理 */
    VOID    (*vobjfn)(W ix);            /* 仮身要求イベント処理 */
} WFUNCREC;
typedef WFUNCREC    *WFUNCPTR;
IMPORT  FUNCP       p_oprc_dev;
evt_loop
 
イベントループ処理

【形式】

W   evt_loop(WFUNCPTR wf, WINFOPTR wi)

【パラメータ】

WFUNCPTR    wf  ウィンドウイベント関数テーブルへのポインタ
WINFOPTR    wi  ウィンドウ情報レコードへのポインタ

【リターン値】

= 0    処理継続
≠ 0    処理終了

【解説】

イベントループ処理を実行する。 アプリケーションは処理対象とするファイル ( 実身 ) をオープンして必要な情報を取り出し、 ウィンドウを開いた後に、この関数を実行してイベントループ処理に入る。

各イベント処理関数で戻された値を返す。

イベントループ処理では、順次ウィンドウ・イベントを取り出し、取り出したイベントに対応した関数を実行する。

wi は、使用するウィンドウに関する属性を示す、 以下のウィンドウ情報レコード配列へのポインタである。

typedef struct {
    W           wid;    -- ウィンドウID(0は最後、< 0 は無効)
    W        chgmod;    -- ウィンドウ属性
    RECT      limit;    -- 変形リミット
    W        pid[3];    -- スクロールバー・パーツID
    W       info[2];    -- アプリケーション情報
} WINFOREC;
    typedef WINFOREC  *WINFOPTR;

ウィンドウ情報レコード配列は、 使用するウィンドウの個数 + 1 の要素が必要であり、 最後の要素の wid は 0 でなければならない。 ウィンドウ情報レコード配列の内容は、evt_loop() を実行した後も、イベント処理関数の中で動的に変更することが可能である。 従って、ウィンドウの数自体が動的に変化する場合は、 あらかじめ 最大数 + 1 の要素のウィンドウ情報レコード配列を用意しておき、 無効なウィンドウに対しては,wid として負の値を設定しておくことになる。

ウィンドウ情報レコード配列上でのインデックス値 ( 0 〜 ) は、 対象ウィンドウの識別のために使用され、evt_loop() 関数の中から起動されるイベント処理の関数にも、 このインデックス値が、 イベントの対象となったウィンドウの識別情報として渡される。

ウィンドウ属性は、ウィンドウの移動 / 変形 / 全面モードの可否を示す以下の値である。

XXXX XXXX XMSF XXmm
M
= 0 : ウィンドウ枠のドラッグによるウィンドウの移動許可
= 1 : ウィンドウ枠のドラッグによるウィンドウの移動禁止
S
= 0 : ハンドルのドラッグによるウィンドウの変形許可
= 1 : ハンドルのドラッグによるウィンドウの変形禁止
F
= 0 : ハンドルのダブルクリックによる全面モード禁止
= 1 : ハンドルのダブルクリックによる全面モード許可
m
: 全面モード許可の場合に、 wchg_wnd()mode パラメータの値であり、 W_MOVEW_MOVECW_HOLDのいずれかの値F = 0 の場合は意味を持たない。
X
: 未使用

変形リミットは、ウィンドウ属性の S=0 の場合にのみ意味を持ち、 ウィンドウのドラッグ変形の最小 / 最大サイズを示し、 wrsz_drg() のパラメータとしてそのまま使用される。 ただし、変形リミットをすべて 0 とした場合には、 wrsz_drg()limit パラメータは NULL とされる。

スクロールバー・パーツ ID は、以下の 3 つのスクロールバーのパーツIDであり、 最初の evt_loop() 実行時に自動的に設定されるため、 特にアプリケーション側で設定する必要はない。

    pid[0]  -- 右スクロールバー ( < 0 は未設定を意味する)
    pid[1]  -- 下スクロールバー ( < 0 は未設定を意味する)
    pid[2]  -- 左スクロールバー ( < 0 は未設定を意味する)

ただし、evt_loop()実行後にアプリケーションによってウィンドウを追加した場合、 その追加したウィンドウの情報に対しては自動的に設定されないので、 アプリケーションの側で設定しなければならない。 (スクロールバーを持つ場合は対応するスクロールバー・パーツIDを設定し、 スクロールバーを持たない或いは対応するスクロールバーがない場合は、 負の値を設定しなければならない)

アプリケーション情報は、 アプリケーション側で任意に使用できるデータであり、 evt_loop() 関数では、 参照も変更もしないデータである。

wf は、ウィンドウ・イベントに対応する関数を示す、 ウィンドウ・イベント関数テーブルへのテーブルへのポインタである。 この内容も、evt_loop() 実行後に動的に変更することが可能である。 これらの関数ポインタは、 使用しない場合には NULL として良いものもあるが、 いくつかの関数は必ず設定しなくてはいけない。

typedef struct {
    W       (*bgfn)(void);              /* バックグラウンド処理 */
    VOID    (*idlefn)(void);            /* idle 処理 */
    W       (*msgfn)(MESSAGE *msg);     /* 一般メッセージ処理 */
    W       (*menufn)(void);            /* メニュー処理 */
    VOID    (*dspfn)(W ix, W mode, RECT *new);  /* 表示処理 */
    VOID    (*stsfn)(W ix, W sts);      /* 状態変化処理 */
    W       (*keyfn)(void);             /* キー入力処理 */
    W       (*presfn)(W ix);            /* PDプレス処理 */
    W       (*finfn)(W ix, W mode);     /* 終了処理 */
    W       (*pastefn)(W ix, PNT pos);  /* 張り込み処理 */
    W       (*respfn)(W ix, W cmd);     /* 応答処理 */
    VOID    (*scrlfn)(W ix, W type, W diff);    /* スクロール処理 */
    VOID    (*devfn)(TC *devname);      /* デバイスイベント処理 */
    VOID    (*vobjfn)(W ix);            /* 仮身要求イベント処理 */
} WFUNCREC;

typedef WFUNCREC *WFUNCPTR;

取り出したウィンドウ・イベントは、 以下の外部変数に格納されるので、 イベント処理関数で直接使用することができる。

    IMPORT WEVENT wevt;

イベントループ処理では、 基本的に、 イベントの取り出しとイベントのタイプに応じた各処理の関数の呼び出しを行うが、以下に示す定型的な処理も行っているため、 アプリケーションは、基本的に、 このライブラリ関数を使用してイベントループ処理を行う必要がある。

● バックグラウンド処理: W (*bgfn)(void);

ウィンドウが入力受付状態でない場合のバックグラウンド処理のための関数であり、 wf->bgfn= NULL の場合は、 ウィンドウ・イベントは WAIT モードで取り出される。NULL でない場合は、ウィンドウ・イベントは NOWAIT モードで取り出され、EV_NOMSG が得られた場合、 この関数が実行される。

関数値 ≠ 0 の場合は、evt_loop() からリターンし、 evt_loop() の関数値は、bgfn() の関数値となる。

● IDLE処理: VOID (*idlefn)(void);

EV_NULL が得られた場合に実行される。
通常は、ポインタ形状の変更 ( 自ウィンドウ内にポインタがある時 )、 カレット / 選択領域のチラツキ処理等を行う。
wf->idlefn = NULL の場合は何もしない。

● 一般メッセージ処理: W (*msgfn)(MESSAGE *msg);

EV_MSG が得られた場合に実行される。 msg は、 得られた一般メッセージの先頭 4 バイトが格納されている領域へのポインタである。

この関数では、rsv_msg() によりメッセージを取り出して対応する処理を行なうことになる。

関数値≠ 0 の場合は、evt_loop() からリターンし、 evt_loop() の関数値は、msgfn() の関数値となる。

wf->msgfn = NULL の場合は得られたメッセージを取り出して捨てる。

● メニュー処理: W (*menufn)(void);

EV_MENU が得られた場合に実行される。 実行時にはポインタ形状は「選択指」の形状に変更されているため、 関数の中ではポインタ形状を設定する必要はない。

関数値≠0 の場合は、evt_loop() からリターンし、 evt_loop() の関数値は、menufn() の関数値となる。

wf->menufn = NULL の場合は何もしない。

● 表示処理: VOID (*dspfn)(W ix, W mode, RECT *new);

ウィンドウの表示用の関数であり、 ix は対象ウィンドウのウィンドウ情報レコード配列のインデックス ( 0 〜) を示し、 mode は、以下の再表示要因を示す。

  再表示の要否newの値
mode= -1 : 初期表示要求NULL
= 0 : 再表示要求イベントNULL
= 1 : ドラッグ移動 NULL
= 2 : ドラッグ変形 新作業領域
= 3 : ドラッグ変形 新作業領域
= 4 : 通常モード切換 新作業領域
= 5 : 全面モード切換 新作業領域
= 6 : 通常モード切換 新作業領域
= 7 : パネル削除 NULL
= 8 : 配置変更 新作業領域
= 9 : 配置変更 新作業領域

初期表示要求は、evt_loop() を実行した場合に、 最初の一回目だけウィンドウ情報レコード配列に登録してあるウィンドウに対して発生する。

パネル削除は、パネルが削除された場合に、 パネルに隠れていたウィンドウに対して呼び出されるもので、 パネル表示中にウィンドウの内容を変更した場合に再表示を行なう必要がある。 ウィンドウの内容を変更していない場合は、 再表示を行なう必要はない。 この要求は、WA_BGDSP 属性を持つウィンドウでかつ、 bgfn≠NULL の場合のみ発生する。

配置変更は、ウィンドウの配置が変更された場合に発生する。

再表示が必要な場合は、wsta_dsp()wend_dsp() により、 再表示の必要な領域を取り出して、速やかに再表示を行なう必要がある。

wf->dspfn = NULL であってはいけない。

ウィンドウの配色などが変更された場合、以下の外部変数に 1 が設定されて、 再表示要求イベントが発生する。
ウィンドウ情報レコードからパターンや色の情報を取り出して使用している場合には、 再表示処理で、この外部変数が 1 に設定されている場合は、ウィンドウ情報レコード を再度取り出して処理する必要がある。

	IMPORT	W   wcolor_changed;	/* ウィンドウ配色変更	*/

● 状態変化処理: VOID (*stsfn)(W ix, W sts);

ウィンドウの状態変更に対して実行される関数であり、 ix は対象ウィンドウのウィンドウ情報レコード配列のインデックス ( 0 〜 ) を示し、 sts は、以下の状態変更要因を示す。

sts= 0: EV_INACT が発生 ( 他ウィンドウへの切り換え)
= 1: EV_SWITCH または EV_RSWITCH が発生
= 2: W_SWITCH が発生 (他ウィンドウからの復帰)
= 0x100: EV_INACT が発生 (パネルへの切り換え)
= 0x102: W_SWITCH が発生 (パネルからの復帰)
< 0: W_CLOSED が発生 (クローズした wid-sts となる)

EV_RSWITCH が発生した場合は、 まず dspfn() が実行され、 その後、stsfn() が、sts = 1 で実行され、 最後に PD のプレス位置に応じて presfn() 等が実行される。

EV_SWITCH が発生した場合は、 stsfn()sts = 1 で実行され、 次に PD のプレス位置に応じて presfn() 等が実行される。

sts = 2(W_SWITCH) の場合は、 stsfn() の実行後に、PDのプレスに対応する処理が実行されるので、 stsfn() では状態変更の処理のみを行なうことになる。

sts=0x100 (EV_INACT)0x102(W_SWITCH) は、 それぞれパネルがオープンされた場合、 および、クローズされた場合に発生する。 パネルの場合は、表示イメージは保存 / 復帰されるため、 原則として表示を変更する処理を行ってはいけない。

sts = 0,1,2 および sts < 0 のときは、 ウィンドウ内のパーツはすべて P_ACT 状態、 かつ P_NODISP 状態に設定されるため、 パーツの再表示を行う必要がある。

また、sts = 0 の時は、 ウィンドウ内のパーツはすべて P_INACT 状態、 かつ P_NODISP 状態に設定されるため、 パーツの再表示を行う必要がある。

wf->stsfn = NULL であってはいけない。

● キー入力処理: W (*keyfn)(void);

EV_KEY, EV_AUTKEY が発生した場合に実行される関数である。

関数値 ≠ 0 の場合は、evt_loop() からリターンし、 evt_loop() の関数値は、keyfn() の関数値となる。

wf->keyfn = NULL の場合は何もしない。

● PDプレス処理: W (*presfn)(W ix);

ウィンドウの作業領域内での PD プレスに対して実行される関数であり、 ix は対象ウィンドウのウィンドウ情報レコード配列のインデックス ( 0 〜 ) を示す。

関数値≠ 0 の場合は、 evt_loop() からリターンし、 evt_loop() の関数値は、presfn() の関数値となる。

wf->presfn = NULL の場合は何もしない。

● 終了処理: W (*finfn)(W ix, W mode);

ウィンドウの終了要求に対して実行される関数であり、 ix は対象ウィンドウのウィンドウ情報レコード配列のインデックス ( 0 〜 ) を示し、mode は、以下の終了要求要因を示す。

mode= 0: ピクトグラムのダブルクリックによる終了要求
= 1: W_DELETE 要求イベントによる終了要求
= 2: W_FINISH 要求イベントによる終了要求

mode = 0 の場合、 関数値≠ 0 の時は、evt_loop() からリターンし、 その関数値は finfn() の関数値となる。

mode=1 (W_DELETE 要求) の場合、 アプリケーションは編集中の内容に変更があれば、 パネルを表示せずに、その内容を保存した後、 ウィンドウを閉じてできる限り迅速に処理を終了しなくてはいけない。

mode=2 (W_FINISH 要求)の場合、 アプリケーションは編集中の内容を廃棄して即座にウィンドウを閉じて処理を終了しなくてはいけない。

mode = 1, 2で、 終了要求を受け入れる場合は、関数値≠0 を戻すことにより、 要求を発したプロセスに W_ACK レスポンスが戻され、 evt_loop() からリターンし、 その関数値は finfn() の関数値となる。 終了要求を受け入れられない場合は、 関数値 = 0を戻すことにより、 要求を発したプロセスに W_NAK レスポンスが戻され、 evt_loop() は続行される。 終了要求の応答は即座に戻す必要があるため、 finfn() では、受け入れの可否のみを判断し、 実際のウィンドウのクローズ処理等は finfn() を終了した後に行う必要がある。

wf->finfn = NULL であってはいけない。

● 貼り込み処理: W (*pastefn)(W ix, PNT pos);

ウィンドウへのドラッグによる貼り込み要求 ( W_PASTE 要求イベント ) に対して実行される関数であり、 ix は対象ウィンドウのウィンドウ情報レコード配列のインデックス ( 0 〜 ) を示し、pos は貼り込み位置 ( 相対座標 ) を示す。

pos は通常、貼り込まれるデータ領域の左上の位置を示すものとする。 従って W_PASTE 要求イベントを送信する側のアプリケーションは、 pos として貼り込むデータ領域の左上の座標値を、 貼り込み先のウィンドウの相対座標値で設定する必要がある。

さらに、要求イベントを送信する側のアプリケーションは、 貼り込んだ時点のポインタの座標値を、 貼り込み先のウィンドウの相対座標値で、 wevt.s.time に次の形式で設定しておく必要がある。
ビッグエンディアンの CPU の場合:( pt.x << 16 | pt.y )
リトルエンディアンの CPU の場合:( pt.y << 16 | pt.x )
通常は、エンディアンに関係なく wevt.s.time = PNTtoUW(pt) のように記述するとよい。

貼り込みの処理では、pos で指定されるデータ領域の左上の位置、 もしくはwevet.s.time で示されるポインタの位置のいずれかを使用することになる。

関数値 = W_ACK の場合は ACK レスポンスが戻され、 関数値 ≠ W_ACK の場合は NAK レスポンスが戻される。

アプリケーションによっては、 すべての貼り込みは複製として取り扱いたいケースがあり、 そのような場合は、W_ACK の関数値を戻す前に、 wevt.s.pos.x = wevt.s.pos.y = 0x8000 に設定しておく。 貼り込んだ側のアプリケーションは W_ACK の応答が得られたとき、 wevt.s.pos.x == wevt.s.pos.y == 0x8000 の場合は、 移動ではなく常に複写として取り扱わなくてはいけない。

貼り込みに伴う再表示等に時間がかかる場合は、 貼り込み元でのタイムアウトとなる可能性があるため、 できるだけ早く、pastefn() を終了し、 別途、再表示を行う必要がある。

wf->pastefn = NULL の場合は何もせずに、NAK レスポンスが戻される。

● 応答処理: W (*respfn)(W ix, W cmd);

何らかの応答イベントを受信した場合に実行される関数であり、 ix は対象ウィンドウのウィンドウ情報レコード配列のインデックス ( 0 〜 ) を示し、cmd は受信した応答イベントの cmd を示す。 cmd には W_ACK または W_NAK が必ずセットされている。 関数値≠0 の場合は、evt_loop() からリターンし、 evt_loop() の関数値は、respfn() の関数値となる。

wf->respfn = NULL の場合は何もしない。

● スクロール処理: VOID (*scrlfn)(W ix, W type, W diff);

ウィンドウのスクロール要求に対して実行される関数であり、 ix は対象ウィンドウのウィンドウ情報レコード配列のインデックス ( 0 〜 ) を示し、 type はスクロールの種類を示す以下の値である。

XXXX XXXX XXCC TTDD
CC =
0 : 右スクロールバー
1 : 下スクロールバー
2 : 左スクロールバー
TT =
0 : スムーススクロール
1 : エリアスクロール
2 : ジャンプスクロール
DD =
0 : 上スクロール
1 : 下スクロール
2 : 左スクロール
3 : 右スクロール
X
: 未使用(0)

diff はジャンプスクロールの場合、 ( ジャンプスクロール前の clo の値 ) - ( ジャンプスクロール後の clo の値) となる。
スムースクロールの場合、 この値は連続したスムーススクロール中のスクロール処理関数の呼び出しカウント ( 最初は 0 ) を示す値となる。
ページスクロールの場合、この値は意味を持たない。

アプリケーションは対応するスクロール処理を行なった後、 スクロールバー表示に更新を行なう必要がある。

ウィンドウにスクロールバーが存在する場合は、 wf->scrlfn = NULL であってはいけない。 スクロールバーが存在しない場合は、wf->scrlfn = NULL でよい。

なお、ユーザ環境設定によってスクロール動作が追従して表示されるよう設定されている場合は、 対応するスクロールバーに対してcchg_par( PID, P_DRAGBREAK) によって、 追従スクロールへの対応がアプリケーションの側からも宣言されている場合に限り、 追従スクロールを行うことができる。

● デバイス・イベント処理: VOID (*devfn)(TC *devname);

EV_DEVICE が発生した場合に、 実身 / 仮身マネージャの oprc_dev() 関数を実行した後に、 実行される関数であり、devname には、EV_DEVICE の対象となる論理デバイス名へのポインタが渡される。

ディスク挿入による EV_DEVICE の場合は、 実身/仮身マネージャの処理により、 すでにディスクは接続されており、 その接続名は論理デバイス名と同一である。 ただし、システムディスクの接続名は "SYS"となる。

実身/仮身マネージャの oprc_dev() の代わりに特殊な関数を実行させたい場合は、 evt_loop() を実行する前に、 関数ポインタ p_oprc_devoprc_dev() と互換の特殊な関数を設定しておくことにより、 設定した特殊な関数を oprc_dev() の代わりに実行させることができる。

wf->devfn = NULL の場合は何もしない ( 実身 / 仮身マネージャの処理は実行される )。

● 仮身要求イベント処理: VOID (*vobjfn)(W ix);

仮身要求イベント ( W_VOBJREQ ) が発生した場合に実行される関数であり、 ix は対象ウィンドウのウィンドウ情報レコード配列のインデックス ( 0 〜 ) を示す。

仮身要求イベントは、 実身/仮身マネージャから発行される cmd = W_VOBJREQ の要求イベントであり、 wevt.g.data[2] により、 その要求のタイプが示される。いずれの場合も応答イベントは戻されない。

wevt.g.data[2] = 0名称変更された
1処理状態になった
2処理状態が解除された
3虚身状態になった
4虚身状態が解除された
5虚身ウィンドウになった
6虚身ウィンドウが解除された
7〜14(予約)
15仮身の変更通知
16仮身の挿入要求(ファイルシステム接続)
17仮身の挿入要求(新規実身への保存)
18〜(予約)
128編集内容の一時ファイルへの格納要求
wevt.g.data[3] = 対象仮身ID ( vid)
ただし、虚身ウィンドウの場合は、 ウィンドウの生成元の仮身ID ( vid )
要求タイプ = 0 〜 4 の場合
対象の仮身の再表示を速やかに行う必要がある。
要求タイプ = 5, 6 の場合
そのウィンドウに含まれる仮身に対する再表示要求は発生しないため、 そのウィンドウに含まれるすべての仮身を再表示する必要がある。 この場合、ウィンドウのタイトルは自動的に虚身状態表示、 または虚身状態表示解除となっているため、 アプリケーションはウィンドウ・タイトルの表示を更新する必要はない。
要求タイプ = 15
対象の仮身/付箋の固有データ、状態、 デフォールトアプリケーションが oend_prc() の結果、 または実身管理情報パネルで変更された場合に送信される。 従って、アプリケーションはこのイベントを受信した場合は、 登録した仮身/付箋の内容が変更されているため、 保存時には、仮身/付箋の状態と取り出して保存する必要がある。
要求タイプ = 16
ファイルシステムの接続に伴って生成された新規デバイス仮身の挿入を要求するもので、 実行環境ウィンドウに対してのみ送信される。
生成されたデバイス仮身は、既に自ウィンドウに登録されており、 wevt.g.data[3] にその仮身IDが入っているので、 その仮身の情報を取り出して自プロセスの管理下に置く必要がある。 登録された仮身はウィンドウの右上に位置しているが、 必要に応じて位置を移動してもよい。
要求タイプ = 17
新規実身への保存に伴って生成された新規仮身の挿入を要求するもので、 仮身を含むすべてのウィンドウに対して送信される可能性がある。 生成された仮身は、既に自ウィンドウに登録されており、 wevt.g.data[3] にその仮身 ID が入っているので、 その仮身の情報を取り出して自プロセスの管理下に置く必要がある。 登録された仮身は元の仮身の上または下に位置しているが、 必要に応じて位置を移動してもよい。
要求タイプ≧128
他のアプリケーションから oreq_prc() により送信された仮身要求イベントであり、 これを受けた場合は、必ず orsp_prc() により応答を戻さなくてはいけない。
要求タイプ = 128
編集内容の一時ファイルへの格納要求であり、 速やかに一時ファイルを生成し、 現在の編集内容を格納しなくてはいけない。 生成した一時ファイルのリンクを orsp_prc() により、応答として戻す必要がある。

wf->vobjfn = NULL の場合は、 要求タイプ < 128 の場合は何もせず、 要求タイプ ≧ 128 の場合は、ER_NOSPT エラー応答を orsp_prc() により戻す。 仮身を含むウィンドウの場合は、NULL であってはいけない。

unget_wevt
 
ウィンドウ・イベントの戻し


【形式】

W   unget_wevt(void)

【パラメータ】

なし

【リターン値】

= 0    正常終了
< 0    戻したイベント数が 16 以上 ( EX_NOSPC )

【解説】

wevt に格納されているウィンドウ・イベントを戻して、 次に実行される、evt_loop() または evt_proc() 関数で取り出すウィンドウ・イベントとする。

最大16個のウィンドウ・イベントをスタック上に戻すことができる。

この処理は 1 つのプロセス内で行なわれるため、 戻したイベントは、 他のプロセスには影響しない点に注意が必要である。

この関数は、 パーツやパネルの処理で期待外のイベントが得られた場合、 そのイベントを一旦戻して、evt_loop()、または evt_proc() により、 後で処理するために使用される。

なお、この関数では、wugt_evt(&wevt) を実行しているだけである。

evt_proc
 
イベント処理

【形式】

W   evt_proc(void)

【パラメータ】

なし

【リターン値】

=0    処理継続
≠0    処理終了

【解説】

ウィンドウ・イベントを取り出し、evt_loop() 関数により登録された、 WINFOREC, WFUNCREC に基づいたイベント処理を実行して戻る。

evt_loop() は、 この evt_proc() を以下のように連続して実行するものである。

    while ((ret = evt_proc()) == 0);

この関数は、パーツやパネルの処理で期待外のイベントが得られた場合、 そのイベントを単発的に処理するために使用される。

関数値は各イベント処理関数で戻された値である。

update_sbar
 
スクロールバーの表示更新処理

【形式】

W   update_sbar(W ix, W cmd, W *ptr)

【パラメータ】

W     ix    ウィンドウ指定
W    cmd    スクロールバーの位置
W   *ptr    スクロールバーを設定する値の配列

【リターン値】

= 0(ER_OK) : 正常終了
< 0         : エラー  (関数値はエラーコード)

【解説】

ix で指定したウィンドウの cmd で指定したスクロールバーの値を ptr で指定した領域に格納されている ( clo, chi, lo, hi ) の 4 word の値に変更する。

cmd は、スクロールバーの位置を示す以下の値である。

cmd =0 : 右スクロールバー
1 : 下スクロールバー
2 : 左スクロールバー

ptr = NULL の時は何もせずに関数値 0 を戻す。

chk_scroll
 
表示スクロール量のチェック処理


【形式】

PNT chk_scroll(W type, W diff, W unit, RECT view, RECT frame)

【パラメータ】

W       type    スクロールのタイプ
W       diff    ジャンプスクロールの移動量
W       unit    スムーススクロール時の移動量
RECT    view    現在の表示領域
RECT    frame   データ全体の領域

【リターン値】

表示スクロール必要量

【解説】

evt_loop()scrlfn() に渡された type, diff に対応して必要とされる表示スクロール量をチェックして、 関数値として戻す。

各パラメータは以下の意味を持つ。

type : スクロールのタイプ
( scrlfn() に渡された値そのもの)
diff : ジャンプスクロールの移動量
viewframe と同一の単位の値でなくてはいけない。 スクロールバーの設定値が、viewframe と同一単位の場合は、scrlfn() に渡された値そのものとなる。
unit : スムーススクロールの時の移動量 ( > 0 )
ページスクロールの場合の重複量ともなる。
view : 現在の表示領域
この領域の幅、または ( 高さ - unit ) がページスクロールの場合の移動量となる。
frame : データ全体の領域
この領域をはみでたスクロールは行われない。view と同一の座標系でなくてはいけない。

関数値は、PNT 型の以下の値となる。

result.x: 水平方向のスクロール必要量
( > 0 左、< 0 : 右、= 0 : 不要)
result.y: 垂直方向のスクロール必要量
( > 0 上、< 0 : 下、= 0 : 不要)

この章の目次にもどる
前頁:2.2 ディスプレイ・ライブラリ定義にもどる
次頁:2.4 テキスト入力ポートにすすむ