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_NOSCRL 0x10 /* スクロールが必要でもリターンしない */ #define TXT_SCRLCAR 0x20 /* カレット位置でスクロール要否を判定 */ #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_TORIGHT ‖ TIP_TOLEFT ‖ TIP_TOUP ‖ TIP_TODOWN ) | [ TIP_TCONLY ] | ( TXT_FIX ‖ TXT_INS ‖ TXT_OVER ) TIP_DIRMD 0x0100 直接モード(変換なし) TIP_CNVMD 0 変換モード TIP_TORIGHT 0 横書き(左から右) TIP_TOLEFT 0x0010 横書き(右から左) TIP_TOUP 0x0020 縦書き(下から上) TIP_TODOWN 0x0030 縦書き(上から下) TIP_TCONLY 0x0008 付箋セグメントを含まない文字のみ(全角のみ) TXT_FIX 0x0000 固定領域表示 TXT_INS 0x1000 挿入表示 TXT_OVER 0x2000 オーバーライト表示
wid
は、未確定文字列を表示するウィンドウのIDの指定である。
この関数は、 TIP を mode
で指定したモードでオープンし、
TEXTPORT
構造体をプロセスのローカル・メモリ中に生成し、
そのポインタを戻す ( TEXTPORT
構造体の内容は、
read_text() 関数の説明を参照のこと)。
|
W reopen_text(TEXTPORT *text, W mode)
TEXTPORT *text テキスト入力ポート W mode 変換モード
≧0 : 正常終了(関数値はオープンしたTIPのID) <0 : エラー (関数値はエラーコード)
text
で指定したテキスト入力ポートを一旦クローズし、
mode
で指定したモードでオープンし直す。
mode
の指定は、open_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_NOSCRL ‖ TXT_SCRLCAR ]
TXT_WAIT (0)
*evt
で指定されたイベントの処理を行い、
さらに wget_evt()
の WAIT
モードにより次のイベントを取り出し処理を続行する。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_NOSCRL (0x10)
visrect
)
をはみ出してもスクロールを要求しない
(TXT_SCRL
でリターンすることはない)。
TXT_SCRLCAR (0x20)
visrect
)
をはみ出したときにスクロールを要求する
(TXT_SCRL
でリターンする)。
カレットのはみ出しは、カレット位置の行の上端から下端までの直線が、
一部でもはみ出しているかで判定される
(縦書きの場合は、右端から左端)。TXT_NOSCRL
、TXT_SCRLCAR
のいずれも指定されていないときは、
変換領域の終端(epos
)が描画環境の表示長方形
(visrect
) をはみ出したときにスクロールを要求する。
終端のはみ出しは、epos
の位置(点)がはみ出しているかで判定される。
TXT_DISP (0x8000)
read_text()
の処理の結果として未確定文字列が表示されなかった場合に、
次の read_text()
で未確定文字列の再表示を行うために自動的にセットされる場合がある。TXT_DISP
を除いて、
未確定文字列が存在する状態で変更してはならない
(変更した場合の動作は保証しない)。
lpitch :
TXT_FIX
モードの場合は意味を持たず無視される。
open_text()
では、0 に初期化される。TXT_INS
、 または TXT_OVER
モードの場合、
変換領域が表示領域の行末を越えた場合、次の行に表示する。
次の行の水平座標値(横書きの場合)/垂直座標値(縦書きの場合)は表示領域の行頭となり、垂直座標値(横書きの場合)/水平座標値(縦書きの場合)は
lpitch
で指定した値だけずらした位置(次行)となる。left :
TIP_TORIGHT
の場合は、左端の水平座標値
TIP_TOLEFT
の場合は、右端の水平座標値
TIP_TOUP
の場合は、下端の垂直座標値
TIP_TODOWN
の場合は、上端の垂直座標値
TXT_FIX
モードの場合は意味を持たず無視される。open_text()
では、0 に初期化される。right :
TIP_TORIGHT
の場合は、右端の水平座標値
TIP_TOLEFT
の場合は、左端の水平座標値
TIP_TOUP
の場合は、上端の垂直座標値
TIP_TODOWN
の場合は、下端の垂直座標値
open_text()
では、
0 に初期化されるので、アプリケーションが必ず設定しなくてはいけない。frcol :
open_text()
では、
黒に初期化される。変換領域の表示枠の色は、
対象文節の背景色にも使用される。tgcol :
open_text()
では、
白に初期化される。変換領域中で、
対象文節の背景色は frcol
で指定した色となるため、
アプリケーションは、対象文節の文字色を、
frcol
と区別できる色と設定する必要がある。bgpat :
open_text()
では、0 (白) に初期化される。spos :
open_text()
では、(0,0)に初期化されるので、
アプリケーションが必ず設定しなくてはいけない。epos :
spos
に等しくなる。
height :
n_cnv :
n_in :
n_cl :
cl_cnv :
n_cl+1
個のワード配列へのポインタであり、
各文節の先頭文字の文字位置が入っている。
先頭の要素は、常に 0 であり、(n_cl+1)
番目の要素は、
確定文字列の次の文字位置、すなわち n_cnv
の値となる。
cnv :
n_cnv
数の文字が確定した文字列となる。
文字列の最後は TNULL (0) で終わっていない。
cl_in :
n_cl+1
個のワード配列へのポインタであり、
各文節の先頭文字の文字位置が入っている。
先頭の要素は、常に 0 であり、(n_cl+1)
番目の要素は、
確定「よみ」文字列の次の文字位置、すなわち n_in
の値となる。
in :
n_in
数の文字が確定した文字列となる。
文字列の最後は TNULL
(0) で終わっていない。n_cnv 〜 in
は、テキスト入力プリミティブ ( TIP )
から戻される情報そのものとなる。
cl_cnv, cnv, cl_in, in
のポインタで示される内容は、
TIP 内部に取られたバッファへのポインタであり、
その内容を変更してはいけない。
car :
TEXTPORT
と同時にローカルメモリに獲得されたカレット構造体へのポインタであり、変換領域表示のカレット表示に使用される。
関数値として、以下の状態を示すコードが戻る。
関数値 ::= ( TXT_NONE ‖ TXT_OUT ‖ ( TXT_POS | TXT_SCRL ) ) | TXT_KEY | 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 (0x10) :
visrect
) の領域をはみ出たため、
表示全体のスクロールが必要である
(TXT_INS
または TXT_OVER
モード指定時のみ)。
TXT_EVT (8) :
TXT_CNV (0x100) :
TXT_NOIMG(0x200) :
TXT_INS
モード指定以外のとき)。TXT_INS
モードの時は常に背景は復帰されず、変換領域の縮小部分は背景パターンでクリアされる。TXT_NOIMG は返されない。
TXT_KEY
と TXT_EVT
の場合は、
*evt
には read_text()
を抜ける原因となったイベントが格納される。
それ以外の場合は、EV_NULL
が格納される。
TXT_OUT
の場合は、常に変換領域の表示はクリアされ、
未確定文字列が残っている場合は、mode
に
TXT_DISP
がセットされる。
確定文字列の処理後に、redisp_text()
で変換領域の再表示を行わなわなかった場合は、
次の read_text()
で変換領域が再表示されることになる。
TXT_SCRL
の場合は、
常に変換領域の表示はクリアされ、mode
に TXT_DISP
がセットされる。
この場合、変換領域が描画環境の表示長方形 (visrect
)
に入るようにスクロールを行う必要がある。
スクロール後に、redisp_text()
で変換領域の再表示を行わなわなかった場合は、
次の read_text()
で変換領域が再表示されることになる。
TXT_EVT
指定でない時は、
かな漢字変換の動作に不要なイベントで未確定文字列は確定されるため、
TXT_EVT
の場合、
通常 TXT_OUT
も同時にセットされる。
TXT_CNV
は状態を示すもので、未確定文字列が残っている場合は、
常にセットされる。
TXT_NOIMG
は状態を示すもので、
イメージが復帰されなかった場合に常にセットされる。
この場合、アプリケーション側で変換領域の縮小部分の再表示を行うことが望ましい。
read_text()
の変換領域の表示の方法を以下に示す。
クリッピング : | 描画環境に設定されているすべてが有効 特に、変換領域が visrect をはみ出る場合は、
変換領域を更新しない |
文字サイズ : | 描画環境に設定されている大きさ |
文字フォント : | 描画環境に設定されているフォント |
文字属性 : | 描画環境に設定されている属性 |
文字間隔 : | 描画環境に設定されている属性 |
文字色 : | 描画環境に設定されている色 |
変換領域枠 : | 指定した色 |
変換領域背景 : | 指定した背景パターン |
対象文節背景 : | 変換領域枠と同じ色 |
対象文節文字色 : | 指定した色 |
mode
の TXT_DISP
がセットされるため、
次の read_text()
の実行時に未確定文字列が表示される)。
TEXTPORT
の car
で示されるカレット構造体を使用して、
変換領域の状態に応じた表示が行われる。
すなわち、未確定文字列が存在しない状態では、
spos
の位置に文字カーソルとして表示され、
未確定文字列が存在している状態では、
変換領域内の現在のカレット位置に表示される。read_text()
から TXT_OUT
または
TXT_SCRL
でリターンした場合、
および TXT_CNV がセットされていない場合は、
カレットの表示は消去されている。read_text()
を実行する前にカレットを消去する必要がある。TX_WAIT
指定時のみ、read_text()
で行われるため、
TXT_NOWAIT
指定時はアプリケーションがこのカレットの点滅を
idsp_car()
により行う必要がある。
TIP_TORIGHT(左から右への横書き)の場合 left right ↓ ↓ ■■■■■■■■■■■■■■ ↑ ↑ ■ ■ │ │ ■ ■ height │ □───ベースライン───■ │ lpitch ■■■■■■■■■■■■■■ ↓ │ ↓ ■■■■■■■■■■■■■■ ■ ■ ■ 変換領域の枠線 ■ ■ □ spos ■────────────○ ○ epos ■■■■■■■■■■■■■■ TIP_TOLEFT(右から左への横書き)の場合 right left ↓ ↓ ■■■■■■■■■■■■■■ ↑ ↑ ■ ■ │ │ ■ ■ height │ ■───ベースライン───□ │ lpitch ■■■■■■■■■■■■■■ ↓ │ ↓ ■■■■■■■■■■■■■■ ■ ■ ■ 変換領域の枠線 ■ ■ □ spos ○────────────■ ○ epos ■■■■■■■■■■■■■■ TIP_TODOWN(上から下への縦書き)の場合 ←─lpitch→ ←height→ ■■■■■ ←left ■│ ■ ■│ ■ ■│ ■ ■│ ■ ■│ ■ ■□■■■ ■│ ■ ■│ ■ ■│ ■ ■│ ■ ■│ ■ ■文 ■ ■│ ■ ■字 ■ ■│ ■ ■枠 ■ ■○■■■ ■の ■ ■左 ■ ■ 変換領域の枠線 ■端 ■ □ spos ■│ ■ ○ epos ■│ ■ ■■■■■←right TIP_TOUP(下から上への縦書き)の場合 ←─lpitch→ ←height→ ■■■■■←right ■│ ■ ■│ ■ ■文 ■ ■字 ■ ■○■■■ ■枠 ■ ■│ ■ ■の ■ ■│ ■ ■左 ■ ■│ ■ ■端 ■ ■│ ■ ■│ ■ ■│ ■ ■│ ■ ■│ ■ ■□■■■ ■│ ■ ■ 変換領域の枠線 ■│ ■ □ spos ■│ ■ ○ epos ■│ ■ ■■■■■ ←leftTXT_OVER モードの場合は、下図のように枠線に影がつく。 影の太さも、変換領域の高さ/幅(height)に含まれる。
横書き(TIP_TORIGHT, TIP_TOLEFT)の場合 ■■■■■■■■■■■■■■ ↑ ■ ■■ │ ■ ■■ height ■───ベースライン───△■ │ △ epos (TIP_TORIGHT) または ■■■■■■■■■■■■■■■ │ spos (TIP_TOLEFT) ■■■■■■■■■■■■■■ ↓ 縦書き(TIP_TOUP, TIP_TODOWN)の場合 ←height─→ ■■■■■ ■│ ■■ ■│ ■■ ■文 ■■ ■字 ■■ ■枠 ■■ ■の ■■ ■左 ■■ ■端 ■■ ■│ ■■ △ epos (TIP_TODOWN) または ■│ ■■ spos (TIP_TOUP) ■△■■■■ ■■■■■
|
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
の関数値でリターンする。