情報家電のための分散ソフトウェアプラットフォームの構築
(JCGプロジェクト)
5章 「GUIミドルウェア機能の利用方法」
目次にもどる|
4章へ|
付録へ
5.GUIミドルウェア機能の利用方法
「GUIミドルウェア機能」は、「イベント管理機能」「パネル管理機能」「パーツ管理機能」「文字入力管理機能」「データボックス管理機能」の5つの機能から構成されている。それぞれの機能の概要とシステムコールのAPI(Application Program Interface)は、以下の通りである。なお、パネル管理機能は機能が大きいため、描画編とシーン/パネル編に分けてある。
「GUIミドルウェア機能」はライブラリで提供される。このライブラリは、ユーザの開発したアプリケーションプログラムとリンクすることで実行プログラムとなり、ターゲットマシンにダウンロードして実行することができるようになる。
なお、パラメータ等の詳細については、「付録1 GUIミドルウェア機能の外部設計書」も合わせて参照されたい。
5.1 GUIミドルウェア機能の概要
5.1.1 イベント管理機能
イベントは、以下の構造体で示される。
typedef struct {
W type;
PNT pos;
TC key;
UW stat;
} EVENT;
typeはイベントの種類を示す。posは現在のPDの位置を示しており、keyはキーイベントのときにキーに対応する文字コードを示す。statは、上位16ビットにイベントの発生時刻が格納されている。
typeには以下の値が指定できる。
#define GE_NULL 0
#define GE_BUTDWN 1
#define GE_BUTUP 2
#define GE_KEYDWN 3
#define GE_KEYUP 4
#define GE_AUTKEY 5
GE_NULLはNULLイベントを示し、PDが移動した場合などに発生する。GE_BUTDWNはボタンが押されたときに発生する。GE_BUTUPはボタンが離されたときに発生する。これらのイベントでは、PDの座標がposに格納され、イベントの発生時刻がstatに格納される。keyの値は意味を持たない。
GE_KEYDWNは文字キーが押されたときに発生する。GE_KEYUPは文字キーが離されたときに発生する。GE_AUTKEYはキーリピートイベントで、文字キーが押され続けたときに連続的に発生する。これらのイベントでは、PDの座標がposに、キーに対応する文字コードがkeyに、イベントの発生時刻がstatに格納される。
5.1.2 パネル管理機能-描画編
パネル管理機能は、複数のタスク間でスクリーンを共有できるよう、スクリーンを描画環境として仮想化して提供している。描画環境にはスクリーンの一部が、他の描画環境と重ならないように割り当てられるため、複数のタスクから描画環境に書き込んだ場合に他のタスクに影響を与えるのを避けることができる。
座標はスクリーンの左上を{0, 0}とし、右方向にX座標が増加し、下方向にY座標が増加する。
描画環境にはIDが割り当てられており、描画環境を生成すると描画環境IDが得られるので、これを用いてアクセスする。描画環境には、描画オフセット、表示長方形、前置長方形配列、現在フォントが設定されている。描画オフセットは、描画要求として渡された座標に加算されて描画されるもので、同じ座標指定のままで描画する位置を変化させることができる。表示長方形は、この長方形領域の外には描画できないようにする機能である。前置長方形配列は、この配列に指定された長方形領域内部には描画できないようにする機能である。描画環境を生成した時点では、描画オフセットは{0, 0}に、表示長方形はスクリーン全体に、前置長方形配列は無に設定されている。GUIミドルウェアの一般的な使い方では、描画オフセットにはパネルの左上の座標が、表示長方形にはパネルの外枠の座標が、前置長方形配列には手前に位置するパネルの外枠の座標が、それぞれ設定される。
描画環境に図形を描画するために、色や模様を指定するためのパターンが用意されている。パターンはあらかじめ用意されているものを利用することも、ユーザーアプリケーションで新たに登録することもできる。パターンを登録するとパターンIDが得られるので、これを描画時に指定することでそのパターンによる描画をおこなうことができる。標準で用意されているパターンは、パターンID=0がピクセル値0の塗りつぶし、パターンID=1がピクセル値1の塗りつぶしである。
5.1.3 パネル管理機能-シーン/パネル編
パネル管理機能は、イベントを配送する対象として、シーン・パネルを管理する機能を提供している。シーンはスクリーン全体の大きさを持ち、複数のシーンのうちの高々1つが表示される。パネルは任意の大きさで、複数のパネルを同時に表示することができる。パネルはシーンの手前に重なった形で表示され、またパネルが複数ある場合にはパネル同士も重なった形で表示される。新たにパネルを表示した場合、そのパネルはもっとも手前に表示される。
シーン・パネルは、システム全体で高々1つが入力受け付け状態となり、イベントを独占的に受信する。パネルが1つでも表示されている場合には、もっとも手前に表示されているパネルが入力受け付け状態となり、パネルが表示されていない場合には、現在表示されているシーンが入力受け付け状態となる。通常は、入力受け付け状態のシーン・パネルの操作によってシーンの切り替え・パネルの表示・消去が起こるようにし、他のシーン・パネルに入力受け付け状態が遷移するようにする。シーン・パネルは、パーツの集まりとして定義する。パーツにはパーツ管理機能や文字入力管理機能で提供されるもののほか、パネル管理機能独自に持っているパーツや、ユーザープログラムで独自に作成したパーツも使用可能である。パネルの場合には、パネルのサイズも指定する必要がある。登録すると、シーンID・パネルIDが得られ、これをつかってシーン・パネルを操作することになる。
シーンを表示するには、gp_swi_scn()のシステムコールを使用する。これにより、今までシーンが表示されていれば消去され、指定されたシーンが表示される。このときパネルが表示されていなければ、このシーンが入力受け付け状態となる。パネルの表示はgp_app_pnl()で、指定されたパネルがもっとも手前に表示され、入力受け付け状態となる。パネルの消去はgp_dis_pnl()で、指定されたパネルが消去され、必要に応じて他のシーン・パネルに入力受け付け状態が遷移する。
入力受け付け状態のシーン・パネルでイベントを受け取るために、gp_act_scn()・gp_act_pnl()のシステムコールが用意されている。このシステムコールはシーンID・パネルIDを範囲で指定するようになっているため、複数のシーン・パネルのイベントを同時に受け付けることができる。入力受け付け状態のシーン・パネルのみがイベントを受け付けることができる。イベントがパーツ上で発生した場合には、パーツ管理機能を呼び出すことで、そのパーツの動作が起きる。
なお、文字入力管理機能のテキストボックスを利用する場合は、テキストボックスの座標をgp_kps_scn()・gp_kps_pnl()で指定する必要がある。これにより、発生したキーイベントはこの座標にあるテキストボックスに送られることになる。複数のテキストボックスに入力する場合には、テキストボックスでのプレスなどの契機でテキストボックスの座標を設定しなおす。
5.1.4 パーツ管理機能
パーツ管理機能は、さまざまなパーツを統一的に扱うための機能を提供する。パーツを生成するとパーツIDが得られる。これを利用して、パーツの表示・動作などをおこなうことができる。
パーツには、文字列と現在値が設定されており、文字列はパーツによっては異なる機能を持っている場合がある。現在値は選択状態を示す非負の値である。現在値=0は通常、無選択状態を示す。
パーツの動作は、gc_act_par()に、初期イベントを渡すことでおこなわれる。初期イベントは、パーツの動作のきっかけとなるイベントで、パーツによってはパーツの動作が完了するまでイベントを繰り返し受信し、パーツの動作が完了してからリターンするものがある。動作の結果、現在値が返る。
通常、パーツ管理機能はパネル管理機能内で呼び出されるため、アプリケーションから直接操作する必要がないこともある。
5.1.5 文字入力管理機能
文字入力管理機能では、テキストボックスのパーツを提供している。パーツ管理機能と類似した機能であるが、キーイベントを受け取るところが異なっている。
テキストボックスでは文字列の編集がおこなわれるため、文字の入力位置を示すカレットが表示されている。編集には、左右のカレットキーと一字消キーを使用することができる。
5.1.6 データボックス管理機能
データボックス管理機能は、メモリ上またはファイル上に用意したデータボックスを一括して登録する機能を提供する。登録できるのはシーン・パネルの定義データで、この中にパーツの定義データが含まれる。
5.2 GUIミドルウェア機能のシステムコール一覧
5.2.1 イベント管理機能のシステムコール
【形式と機能】 |
W err = ge_ini_evt(VOID *init)
|
|
イベントキュー管理機能を初期化する。他のイベント管理機能のシステムコールを呼ぶ前に、このシステムコールを一度だけ実行しなければならない。initにはNULLを指定する
|
【形式と機能】 |
W err = ge_put_evt(EVENT *evt)
|
|
イベントを発生させる。
|
【形式と機能】 |
W err = ge_get_evt(EVENT *evt, W tmout, W clr)
|
|
イベントを取得する。
|
【形式と機能】 |
W err = ge_clr_evt(W all)
|
|
イベントを消去する。
|
【形式と機能】 |
W err = ge_sus_evt(W sus)
|
|
イベントの取得を禁止する。sus=1とすると、ge_get_evt()システムコールはエラーとなり、イベントの取得ができなくなる。このシステムコールは、イベント受信待ちを中断させるために、パネル管理機能から呼び出される。
|
【形式と機能】 |
W err = ge_ini_inp(VOID *init)
|
|
入力機器管理機能を初期化する。他のイベント管理機能のシステムコールを呼ぶ前に、このシステムコールを一度だけ実行しなければならない。initにはNULLを指定する。
|
【形式と機能】 |
W err = ge_gen_evt(RAWEVT *evt)
|
|
生イベントを発生させる。
|
【形式と機能】 |
W err = ge_set_pda(PD_ATTR *attr)
|
|
PD属性を設定する。
|
【形式と機能】 |
W err = ge_get_pda(PD_ATTR *attr)
|
|
PD属性を取得する。
|
【形式と機能】 |
W err = ge_set_kya(KEY_ATTR *attr)
|
|
キー属性を設定する。
|
【形式と機能】 |
W err = ge_get_kya(KEY_ATTR *attr)
|
|
キー属性を取得する。
|
【形式と機能】 |
W err = ge_set_ktb(W size, TC *table)
|
|
キーテーブルを設定する。
|
【形式と機能】 |
W err = ge_get_ktb(W size, TC *table)
|
|
キーテーブルを取得する。
|
5.2.2 パネル管理機能-描画編のシステムコール
【形式と機能】 |
W err = gp_ini_env(BMP *screen)
|
|
パネル管理機能の描画機能を初期化する。他のパネル管理機能のシステムコールを呼ぶ前に、このシステムコールを一度だけ実行しなければならない。screenにNULLを指定した場合、内蔵のPC/AT用スクリーンドライバが動作する。screenにNULL以外を指定した場合、指定されたビットマップをスクリーンとみなして描画する。
|
【形式と機能】 |
W err = gp_set_ptr(W type, PNT *p)
|
|
ポインタの座標を設定する。設定された位置に、十字線のポインタが表示される。このシステムコールは、ポインタを移動させるために、イベント管理機能から呼び出される。
|
【形式と機能】 |
W gid = gp_cre_env(GENVPAR *par)
|
|
描画環境を生成する。
|
【形式と機能】 |
W err = gp_del_env(W gid)
|
|
描画環境を削除する。
|
【形式と機能】 |
W err = gp_set_off(W gid, PNT *p)
|
|
描画オフセットを設定する。
|
【形式と機能】 |
W err = gp_get_off(W gid, PNT *p)
|
|
描画オフセットを取得する。
|
【形式と機能】 |
W err = gp_set_vis(W gid, RECT *r)
|
|
表示長方形を設定する。
|
【形式と機能】 |
W err = gp_get_vis(W gid, RECT *r)
|
|
表示長方形を取得する。
|
【形式と機能】 |
W err = gp_set_fra(W gid, RECT *r, W cnt)
|
|
前置長方形配列を設定する。
|
【形式と機能】 |
W cnt = gp_get_fra(W gid, RECT *r, W cnt)
|
|
前置長方形配列を取得する。
|
【形式と機能】 |
W pid = gp_cre_pat(PAT *pat)
|
|
パターンを生成する。
|
【形式と機能】 |
W err = gp_del_pat(W pid)
|
|
パターンを削除する。
|
【形式と機能】 |
W err = gp_dra_lin(W gid, PNT s, PNT e, UW lattr, W pid, W mode)
|
|
直線を描画する。
|
【形式と機能】 |
W err = gp_fra_rec(W gid, RECT r, UW lattr, W pid, W mode)
|
|
長方形枠を描画する。
|
【形式と機能】 |
W err = gp_fra_rrc(W gid, W rh, W rv, RECT r, UW lattr, W pid, W mode)
|
|
角丸長方形枠を描画する。
|
【形式と機能】 |
W err = gp_fil_rrc(W gid, W rh, W rv, RECT r, W pid, W mode)
|
|
角丸長方形内部を描画する。
|
【形式と機能】 |
W err = gp_fra_ovl(W gid, RECT r, UW lattr, W pid, W mode)
|
|
楕円枠を描画する。
|
【形式と機能】 |
W err = gp_fil_ovl(W gid, RECT r, W pid, W mode)
|
|
楕円内部を描画する。
|
【形式と機能】 |
W sts = gp_pic_lin(PNT pt, PNT s, PNT e, W width)
|
|
直線のピッキングをおこなう。
|
【形式と機能】 |
W sts = gp_pic_rec(PNT pt, RECT r, W width)
|
|
長方形のピッキングをおこなう。width=0の場合は長方形内部のピッキングを、width>0の場合は長方形枠のピッキングをおこなう。
|
【形式と機能】 |
W sts = gp_pic_rrc(PNT pt, W rh, W rv, RECT r, W width)
|
|
角丸長方形のピッキングをおこなう。width=0の場合は角丸長方形内部のピッキングを、width>0の場合は角丸長方形枠のピッキングをおこなう。
|
【形式と機能】 |
W sts = gp_pic_ovl(PNT pt, RECT r, W width)
|
|
楕円のピッキングをおこなう。width=0の場合は楕円内部のピッキングを、width>0の場合は楕円枠のピッキングをおこなう。
|
【形式と機能】 |
W err = gp_dra_bmp(W gid, BMP *bmp, PNT p, W mode)
|
|
ビットマップの描画をおこなう。
|
【形式と機能】 |
W err = gp_set_fon(W gid, FONT *font)
|
|
フォントの設定をおこなう。
|
【形式と機能】 |
W err = gp_dra_stp(W gid, PNT p, TC *str, W len, W pid, W mode)
|
|
文字列の描画をおこなう。
|
【形式と機能】 |
W err = gp_get_str(W gid, TC *str, W len, RECT *r)
|
|
文字列領域の取得をおこなう。
VOID* p = gp_savescreen()
現在のスクリーンをメモリに保存し、そのアドレスを返す。このシステムコールは、パネル背景の保存のため、パネル管理機能から呼び出される。
|
【形式と機能】 |
W err = gp_restorescreen(VOID* p)
|
|
gp_savescreen()で得られたアドレスを渡すことで、メモリからスクリーンを復帰する。このシステムコールは、パネル背景の復帰のため、パネル管理機能から呼び出される。
|
5.2.3 パネル管理機能-シーン/パネル編のシステムコール
パネル管理機能の描画機能を初期化する。他のパネル管理機能のシステムコールを呼ぶ前に、このシステムコールを一度だけ実行しなければならない。initにはNULLを指定する。
【形式と機能】 |
W err = gp_ini_pnl(VOID *init)
|
|
パネル管理機能のシーン/パネル機能を初期化する。他のパネル管理機能のシステムコールを呼ぶ前に、このシステムコールを一度だけ実行しなければならない。initにはNULLを指定する。
|
【形式と機能】 |
W wid = gp_cre_scn(PARTS *parts, W nitem)
|
|
シーンの生成をおこなう。
|
【形式と機能】 |
W err = gp_del_scn(W wid)
|
|
シーンの削除をおこなう。
|
【形式と機能】 |
W cid = gp_set_scn(W wid, W item, PARTS *parts)
|
|
シーンの設定をおこなう。
|
【形式と機能】 |
W err = gp_swi_scn(W wid)
|
|
シーンの切り替えをおこなう。
|
【形式と機能】 |
W err = gp_vis_scn(W wid, RECT *r)
|
|
シーンの表示長方形の設定をおこなう。
|
【形式と機能】 |
W err = gp_kps_scn(W wid, PNT *p)
|
|
シーンのキー座標の設定をおこなう。
|
【形式と機能】 |
W sts = gp_act_scn(W wids, W wide, EVENT *evt, W* wid, W* item, W tmout)
|
|
シーンの動作をおこなう。
|
【形式と機能】 |
W wid = gp_cre_pnl(RECT *r, PARTS *parts, W nitem)
|
|
パネルの生成をおこなう。
|
【形式と機能】 |
W err = gp_del_pnl(W wid)
|
|
パネルの削除をおこなう。
|
【形式と機能】 |
W cid = gp_set_pnl(W wid, W item, PARTS *parts)
|
|
パネルの設定をおこなう。
|
【形式と機能】 |
W err = gp_app_pnl(W wid)
|
|
パネルの表示をおこなう。
|
【形式と機能】 |
W err = gp_dis_pnl(W wid)
|
|
パネルの消去をおこなう。
|
【形式と機能】 |
W err = gp_vis_pnl(W wid, RECT *r)
|
|
パネルの表示長方形を設定する。
|
【形式と機能】 |
W err = gp_kps_pnl(W wid, PNT *p)
|
|
パネルのキー座標を設定する。
|
【形式と機能】 |
W sts = gp_act_pnl(W wids, W wide, EVENT *evt, W* wid, W* item, W tmout)
|
|
パネルの動作をおこなう。
|
5.2.4 パーツ管理機能のシステムコール
【形式と機能】 |
W err = gc_ini_par(VOID *init)
|
|
パーツ管理機能の描画機能を初期化する。他のパーツ管理機能のシステムコールを呼ぶ前に、このシステムコールを一度だけ実行しなければならない。initにはNULLを指定する。 |
【形式と機能】 |
W cid = gc_cre_par(W gid, PARTS *parts)
|
|
パーツの登録をおこなう。
|
【形式と機能】 |
W err = gc_del_par(W cid)
|
|
パーツの削除をおこなう。
|
【形式と機能】 |
W err = gc_dsp_par(W cid, W mode)
|
|
パーツの表示をおこなう。
|
【形式と機能】 |
W err = gc_set_par(W cid, TC *str, W val)
|
|
パーツの設定をおこなう。
|
【形式と機能】 |
W val = gc_get_par(W cid, TC *str, W size)
|
|
パーツの取得をおこなう。
|
【形式と機能】 |
W val = gc_act_par(W cid, EVENT *evt)
|
|
パーツの動作をおこなう。
|
5.2.5 文字入力管理機能のシステムコール
【形式と機能】 |
W cid = gt_cre_par(W gid, PARTS *parts)
|
|
テキストボックスの生成をおこなう。
|
【形式と機能】 |
W err = gt_del_par(W cid)
|
|
テキストボックスの削除をおこなう。
|
【形式と機能】 |
W err = gt_dsp_par(W cid, W mode)
|
|
テキストボックスの表示をおこなう。
|
【形式と機能】 |
W err = gt_set_par(W cid, TC *str, W val)
|
|
テキストボックスの設定をおこなう。
|
【形式と機能】 |
W val = gt_get_par(W cid, TC *str, W size)
|
|
テキストボックスの取得をおこなう。
|
【形式と機能】 |
W val = gt_act_par(W cid, EVENT *evt)
|
|
テキストボックスの動作をおこなう。
|
5.2.6 データボックス管理機能のシステムコール
【形式と機能】 |
W cnt = gd_reg_dat(TC *data, W *id, W size)
|
|
データボックスの登録をおこなう。
|
【形式と機能】 |
W err = gd_wri_dat(TC *filename, TC *data)
|
|
データボックスのファイルへの書き出しをおこなう。
|
【形式と機能】 |
W cnt = gd_rea_dat(TC *filename, W *id, W size)
|
|
データボックスのファイルからの登録をおこなう。
|
5.3 評価用ドライバ
「GUIミドルウェア機能」を入れたライブラリには、評価目的で、PC/AT互換機用のスクリーンドライバが含まれている。また、生イベント受け付け用のメッセージハンドラも含まれており、別プログラムとして提供されているキーボード/PDドライバからの入力を受けつけることができる。これらは納品物ではないが、PC/AT互換機上での評価を容易にする目的で添付される。
評価用スクリーンドライバはGUIミドルウェアに組み込まれており、gp_ini_env(NULL)としてパネル管理機能のシステムコールを呼び出すことで機能する。解像度は640×480ドットで、白黒となる。ピクセル値0が白、ピクセル値1が黒である。
評価用キーボード/PDドライバは、106キーボードとPS/2マウスをサポートする。これらの情報は、生イベントを示すRAWEVT構造体を、ITRONのメッセージバッファを使用して送信される。
評価用キーボード/PDドライバからの生イベントを受け付けるには、GUIミドルウェアの側でinit_evtsvr(1)のシステムコールを発行する。これによりメッセージバッファに到着した生イベントを受け取ってイベント管理を呼び出すためのタスクが起動する。
なお、「GUIミドルウェア機能」の起動時には、評価用キーボード/PDドライバから、英大文字、一字消、カレットキーの入力を受け付けるようにキーテーブルが設定されている。
目次にもどる|
4章へ|
付録へ(作成中)