typedef struct {
UW mode; /* 動作モード (入出力) */
W lpitch; /* 行送り (入力) */
W left; /* 表示領域の左端 (入力) */
W right; /* 表示領域の右端 (入力) */
COLOR frcol; /* 表示領域枠の色 (入力) */
COLOR tgcol; /* 対象文節の文字色 (入力) */
PNT spos; /* 表示開始位置 (入力) */
PNT epos; /* 表示終了位置 (出力) */
W bgpat; /* 変換領域背景パターン (入力) */
W height; /* 表示領域の表示高さ (出力) */
W n_cnv; /* 確定文字数 (出力) */
W n_in; /* 確定よみ文字数 (出力) */
W n_cl; /* 確定文節数 (出力) */
W *cl_cnv; /* 確定文節情報 (出力) */
TC *cnv; /* 確定文字列 (出力) */
W *cl_in; /* 確定よみ文節情報 (出力) */
TC *in; /* 確定よみ文字列 (出力) */
CARET *car; /* カレット構造体へのポインタ (出力) */
} TEXTPORT;
typedef TEXTPORT *TEXTPTR;
#define TXT_FIX 0x0000 /* 固定領域表示 */ #define TXT_INS 0x1000 /* 挿入表示 */ #define TXT_OVER 0x2000 /* オーバーライト表示 */
#define TXT_WAIT 0 /* イベントの取り出しを行う */ #define TXT_NOWAIT 1 /* イベントの取り出しを行わない */ #define TXT_POS 2 /* 表示領域の終了位置が変化でリターン */ #define TXT_KEY 4 /* 不要なキーイベントの場合リターン */ #define TXT_EVT 8 /* 未確定文字列を確定せずにリターン */ #define TXT_NOHAN 0x100 /* 半角未サポート */ #define TXT_DISP 0x8000 /* 変換領域の再表示を行う */
#define TXT_NONE 0 /* 状態の変化なし */ #define TXT_OUT 1 /* 確定文字列が発生した */ #define TXT_SCRL 0x10 /* 表示全体のスクロールが必要である */ #define TXT_CNV 0x100 /* 未確定文字列が残っている */ #define TXT_NOIMG 0x200 /* イメージの復帰ができなかった */
|
W open_text(W wid, W mode, TEXTPORT **text)
W wid ウィンドウID W mode 変換モード TEXTPORT **text オープンしたテキスト入力ポートを戻す領域へのポインタ
≧0 : 正常終了(関数値はオープンしたTIPのID) <0 : エラー (関数値はエラーコード)
wid で指定したウィンドウ上に、
mode で指定した変換モードのテキスト入力ポートをオープンし、
そのポインタを *text で指定した領域に格納する。
mode ::= ( TIP_DIRMD ‖ TIP_CNVMD ) | ( TIP_AUTO ‖ TIP_MANUAL )
| (TXT_FIX ‖TXT_INS ‖ TXT_OVER)
TIP_DIRMD 0x100 直接モード(変換なし)
TIP_CNVMD 0 変換モード
TIP_AUTO 0 自動変換モード
TIP_MANUAL 1 指定(マニュアル)変換モード
TXT_FIX 0x0000 固定領域表示
TXT_INS 0x1000 挿入表示
TXT_OVER 0x2000 オーバーライト表示
TIP_AUTO / TIP_MANUAL の指定は、
TIP_DIRMD の場合は意味を持たず無視される。
wid は、未確定文字列を表示するウィンドウのIDの指定である。
この関数は、 TIP を mode で指定したモードでオープンし、
TEXTPORT 構造体をプロセスのローカル・メモリ中に生成し、
そのポインタを戻す ( TEXTPORT 構造体の内容は、
read_text() 関数の説明を参照のこと)。
|
VOID close_text(TEXTPORT *text)
TEXTPORT *text テキスト入力ポート
なし
text で指定したテキスト入力ポートをクローズする。
text で指定した TEXTPORT の領域は解放され、
対応する TIP もクローズされる。
表示に関しては、何も行わない。
|
W flush_text(TEXTPORT *text)
TEXTPORT *text テキスト入力ポート
≧0 : 正常終了(関数値は確定状態(TXT_OUT / TXT_NONE)) <0 : エラー (関数値はエラーコード)
text で指定したテキスト入力ポートをフラッシュして、
残っていた未確定文字列をすべて確定する。
関数値として、確定文字列が発生した場合は、
TXT_OUT ( 1 ) が戻り、
確定文字列が発生しなかった場合は、TXT_NONE ( 0 ) が戻る。
この関数は、read_text() で、
「入力終」のキーイベントが入った場合と同一の動作を行う。
|
W read_text(TEXTPORT *text, WEVENT *evt)
TEXTPORT *text テキスト入力ポート WEVENT *evt 入力するキーイベント
≧0 : 正常終了(関数値はリターン状態コード) <0 : エラー (関数値はエラーコード)
text で指定したテキスト入力ポートからテキストを読み込む。
evt は、入力するキーイベントの指定であり、
終了時には、最後に得られたイベントまたは EV_NULL が格納されて戻る。
evt で指定した入力イベントのタイプが、
EV_NULL の場合は、wget_evt()
の WAIT モードにより取り出したイベントを入力イベントとする。
text は、open_text() で得られた、
以下に示す TEXTPORT 構造体へのポインタである。
typedef struct {
UW mode; /* 動作モード (入出力) */
W lpitch; /* 行送り (入力) */
W left; /* 表示領域の左端 (入力) */
W right; /* 表示領域の右端 (入力) */
COLOR frcol; /* 表示領域枠の色 (入力) */
COLOR tgcol; /* 対象文節の文字色 (入力) */
PNT spos; /* 表示開始位置 (入力) */
PNT epos; /* 表示終了位置 (出力) */
W bgpat; /* 変換領域背景パターン (入力) */
W height; /* 表示領域の表示高さ (出力) */
W n_cnv; /* 確定文字数 (出力) */
W n_in; /* 確定よみ文字数 (出力) */
W n_cl; /* 確定文節数 (出力) */
W *cl_cnv; /* 確定文節情報 (出力) */
TC *cnv; /* 確定文字列 (出力) */
W *cl_in; /* 確定よみ文節情報 (出力) */
TC *in; /* 確定よみ文字列 (出力) */
CARET *car; /* カレット構造体へのポインタ (出力) */
} TEXTPORT;
以下に構造体の内容を示す。 座標位置は、すべてテキスト入力ポートのウィンドウの相対座標である。
mode :
open_text() では、
TXT_WAIT に初期化される。
mode ::= (TXT_WAIT ‖ TXT_NOWAIT) | (TXT_POS) | (TXT_KEY) |
(TXT_EVT) | (TXT_DISP) | (TXT_NOHAN) | (TXT_JPN)
TXT_WAIT (0)
*evt で指定されたイベントの処理を行った結果、
状態の変化が無かった時は、wget_evt() の WAIT
モードにより次のイベントを取り出し、
処理を続行する。
取り出したイベントが、EV_NULL または EV_KEYUP の場合は、
evt_loop() 関数で定義された IDLE 処理関数を実行し、
カレットの点滅を行った後、再度イベントを取り出す。
TXT_NOWAIT (1)
*evt で指定されたイベントの処理を行った後、
次のイベントの取り出しを行わずにリターンする。
TXT_POS (2)
TXT_INS
モードでテキストポートをオープンした場合は、
必ずこの指定を行わなくていけない。
この指定は、TXT_NOWAIT 指定の場合は意味を持たない。
TXT_KEY (4)
TXT_WAIT 指定時は、
処理を続行し、TXT_NOWAIT 指定時は、状態変化無しとしてリターンする。TXT_KEY の指定に無関係にリターンする。
TXT_EVT (8)
TXT_NOHAN (0x100)
TXT_JPN (0x200)
TXT_DISP (0x8000)
read_text() の処理の結果として未確定文字列が表示されなかった場合に、
次の read_text() で未確定文字列の再表示を行うために自動的にセットされる場合がある。TXT_DISP を除いて、
未確定文字列が存在する状態で変更してはならない ( 変更した場合の動作は保証しない )。
lpitch :
TXT_FIX モードの場合は意味を持たず無視される。
open_text() では、0 に初期化される。TXT_INS、 または TXT_OVER モードの場合、
変換領域が表示領域右端を越えた場合、
次の行に表示する。次の行の水平座標値は表示領域左端となり、
垂直座標値は lpitch で指定した値だけ下にずらした位置、
すなわち ( spos.c.v + P ) となる。lpitch < 0 の場合は、上の行に表示されることになる。left :
TXT_FIX モードの場合は意味を持たず無視される。
open_text() では、0に初期化される。right :
open_text() では、
0 に初期化されるので、アプリケーションが必ず設定しなくてはいけない。frcol :
open_text() では、
黒に初期化される。変換領域の表示枠の色は、
対象文節の背景色にも使用される。tgcol :
open_text() では、
白に初期化される。変換領域中で、
対象文節の背景色は frcol で指定した色となるため、
アプリケーションは、対象文節の文字色を、frcol と区別できる色と設定する必要がある。bgpat :
open_text() では、0 ( 白 ) に初期化される。TXT_FIX、および TXT_INS モードでは、
変換領域が小さくなった場合、縮小した領域はこの背景パターンでクリアされる。spos :
open_text()では、(0,0)に初期化されるので、
アプリケーションが必ず設定しなくてはいけない。epos :
spos に等しくなる。
height :
TXT_OVER モードの場合は、
文字の高さ + 2 となり、
TXT_FIX、TXT_INS モードの場合は、文字の高さ + 2 となる。
n_cnv :
n_in :
n_cl :
cl_cnv :
n_cl+1 個のワード配列へのポインタであり、
各文節の先頭文字の文字位置が入っている。
先頭の要素は、常に 0 であり、(n_cl+1) 番目の要素は、
確定文字列の次の文字位置、すなわち n_cnv の値となる。
cnv :
n_cnv 数の文字が確定した文字列となる。
文字列の最後は 0 で終わっていない。
cl_in :
n_cl+1 個のワード配列へのポインタであり、
各文節の先頭文字の文字位置が入っている。
先頭の要素は、常に 0 であり、(n_cl+1)番目の要素は、
確定「よみ」文字列の次の文字位置、すなわち n_in の値となる。
in :
n_in 数の文字が確定した文字列となる。
文字列の最後は 0 で終わっていない。
n_cnv 〜 in は、テキスト入力プリミティブ ( TIP )
から戻される情報そのものとなる。
cl_cnv, cnv, cl_in, in のポインタで示される内容は、
TIP 内部に取られたバッファへのポインタであり、
その内容を変更してはいけない。
car :
TEXTPORT と同時にローカルメモリに獲得されたカレット構造体へのポインタであり、
変換領域表示のカレット表示に使用される。
関数値として、以下の状態を示すコードが戻る。
関数値 ::= (TXT_NONE ‖ TXT_OUT ‖ TXT_POS ‖ TXT_KEY ‖ TXT_SCRL)
| (TXT_EVT) | (TXT_CNV) | (TXT_NOIMG)
TXT_NONE (0) :
TXT_NOWAIT 指定時のみ)。
TXT_OUT (1) :
TXT_POS はセットされない。
TXT_POS (2) :
TXT_POS または TXT_NOWAIT 指定時のみ)。
TXT_KEY (4) :
TXT_KEY 指定時、または 未確定文字列が空の場合のみ)。
TXT_SCRL (8) :
visrect の領域をはみ出たため、
表示全体のスクロールが必要である ( TXT_INS または TXT_OVER モード指定時のみ)。
TXT_EVT (0x10) :
EV_KEYDWN、EV_AUTKEY 以外のイベントである。
TXT_CNV (0x100) :
TXT_NOIMG(0x200) :
TXT_OVER 指定時のみ)。
TXT_KEY と TXT_EVT の場合は、
*evt には対象のイベントが格納され、
それ以外の場合は、EV_NULL が格納される。
TXT_OUT の場合は、常に変換領域の表示はクリアされ、
未確定文字列が残っている場合は、mode の
TXT_DISP がセットされる。
確定文字列の処理後に、redisp_text()
で変換領域の再表示を行わなわなかった場合は、
次の read_text() で変換領域が再表示されることになる。
TXT_SCRL の場合は、
常に変換領域の表示はクリアされ、mode
の TXT_DISP がセットされる。
この場合、変換領域が描画環境の visrect に入るようにスクロールを行う必要がある。
スクロール後に、redisp_text() で変換領域の再表示を行わなわなかった場合は、
次の read_text() で変換領域が再表示されることになる。
TXT_EVT 指定でない時は、EV_KEYDWN、EV_AUTKEY
以外のイベントで未確定文字列は確定されるため、
TXT_EVT の場合、
通常、TXT_OUT も同時にセットされる。
TXT_CNV は状態を示すもので、未確定文字列が残っている場合は、
常にセットされる。
TXT_NOIMG は状態を示すもので、
イメージが復帰されなかった場合に常にセットされる。
この場合、アプリケーション側で変換領域の縮小部分の再表示を行うことが望ましい。
read_text() の動作を以下に示す。
mode の TXT_DISP がセットされている場合は、
未確定文字列、 またはヌル選択 ( 文字カーソル )
の表示を行い、TXT_DISP をリセットする。
この処理は、確定文字列が発生し、かつ未確定文字列が残っている場合、
または変換領域が描画環境の visrect をはみ出ているため表示できなかった場合に、
未確定文字列の再表示のために使用される。
*evt で指定したイベントをTIPの入力としてかな漢字変換処理を行う。
EV_NULL の時 :
TXT_WAIT 指定時はイベントの取り出しを行い、
TXT_NOWAIT 指定時は、
何もせずに TXT_NONE の関数値でリターンする。
TXT_WAIT 指定時で、
取り出したイベントが EV_NULL または
EV_KEYUP の場合は、
再度イベントの取りだしを行う。
この時、evt_loop() 関数で定義された
IDLE 処理関数が存在する場合は、
IDLE 処理関数を実行し、
その後カレットの点滅を行う。
EV_KEYDWN / EV_AUTKEY 以外の時 :
TXT_EVT 指定時は、単に TXT_EVT の関数値でリターンし、
TXT_EVT 指定でない場合は、
未確定文字列を確定する。その結果、
確定文字列が発生した場合は、変換領域の表示をクリアし、
( TXT_OUT | TXT_EVT )
の関数値でリターンする。
確定文字列が発生しなかった場合は単に TXT_EVT の関数値でリターンする。
EV_KEYDWN / EV_AUTKEY で不正なキーコードの時 :
TXT_KEY の関数値でリターンする。
未確定文字列が存在する場合は、
TXT_KEY 指定の場合のみ、TXT_KEY
の関数値でリターンし、TXT_KEY 指定でない場合は、無視される。
mode の TXT_DISP をセットし、
TXT_OUT の関数値でリターンする。
TXT_POS 指定時で、
epos が変化した場合は、TXT_POS の関数値でリターンする。visrect をはみでる場合は、
変換領域の表示をクリアして、 mode の TXT_DISP をセットし、
TXT_SCRL の関数値でリターンする。
TXT_WAIT 指定時は、イベントを取り出し、
(2)の処理を繰り返す。TXT_NOWAIT 指定時は、TXT_NONE または、
TXT_POS の関数値でリターンする。
*evt には、TXT_EVT, TXT_KEY の場合は、
対象のイベントが格納され、
その他の場合は、EV_NULL が格納される。
また、未確定文字列が残っている場合には、関数値には、TXT_CNV が常にセットされる。
read_text() の変換領域の表示の方法を以下に示す。
| クリッピング : | 描画環境に設定されているすべてが有効 特に、変換領域が visrect をはみ出る場合は、
変換領域を更新しない |
| 文字サイズ : | 描画環境に設定されている大きさ |
| 文字フォント : | 描画環境に設定されているフォント |
| 文字属性 : | 描画環境に設定されている属性 |
| 文字間隔 : | 描画環境に設定されている属性 |
| 文字色 : | 描画環境に設定されている色 |
| 変換領域枠 : | 指定した色 |
| 変換領域背景 : | 指定した背景パターン |
| 対象文節背景 : | 変換領域枠と同じ色 |
| 対象文節文字色 : | 指定した色 |
mode の TXT_DISP がセットされるため、
次の read_text() の実行時に未確定文字列が表示される)。
TEXTPORT の car で示されるカレット構造体を使用して、
変換領域の状態に応じた表示が行われる。
すなわち、未確定文字列が存在しない状態では、
spos の位置に文字カーソルとして表示され、
未確定文字列が存在している状態では、
変換領域の現在の位置にカレットが表示される。TXT_OUT でリターンした場合、
および TXT_CNV がセットされていない場合は、カレットの表示は消去されている。read_text() を実行する前にカレットを消去する必要がある。TX_WAIT 指定時のみ、read_text() で行われるため、
TXT_NOWAIT 指定時はアプリケーションがこのカレットの点滅を
idsp_car() により行う必要がある。
spos は、変換領域枠の左下の座標値を指定し、
epos は変換領域枠の右下の座標値となる。
TXT_OVER モードの場合は、 変換領域枠の右下に1ピクセル幅の影が表示される。

|
W redisp_text(TEXTPORT *text)
TEXTPORT *text テキスト入力ポート
リターン状態コード(TXT_SCRL / TXT_NONE)
text で指定したテキスト入力ポートに未確定文字列が存在する場合、
未確定文字列の表示を行い、text->epos を更新し、
text->mode の TXT_DISP 指定をリセットする。
未確定文字列が存在しない場合は何もしない。
変換領域の表示が描画環境の visrect をはみでる場合は、
変換領域の再表示を行わずに、TXT_SCRL の関数値でリターンする。
この場合は、text->mode の TXT_DISP 指定はリセットされない。
その他の場合は、TXT_NONE の関数値でリターンする。