この章の目次にもどる
前頁:2.3 ウィンドウイベントにもどる
次頁:2.5 データボックスにすすむ

2.4 テキスト入力ポート

□ テキスト入力ポート定義

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   /* イメージの復帰ができなかった */
open_text
 
テキスト入力ポートのオープン

【形式】

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() 関数の説明を参照のこと)。

reopen_text
 
テキスト入力ポートの再オープン

【形式】

W       reopen_text(TEXTPORT *text, W mode)

【パラメータ】

TEXTPORT    *text   テキスト入力ポート
W            mode   変換モード

【リターン値】

≧0    : 正常終了(関数値はオープンしたTIPのID)
<0    : エラー  (関数値はエラーコード)

【解説】

text で指定したテキスト入力ポートを一旦クローズし、 mode で指定したモードでオープンし直す。 mode の指定は、open_text() と同じ。

close_text
 
テキスト入力ポートのクローズ

【形式】

VOID    close_text(TEXTPORT *text)

【パラメータ】

TEXTPORT    *text   テキスト入力ポート

【リターン値】

なし

【解説】

text で指定したテキスト入力ポートをクローズする。 text で指定した TEXTPORT の領域は解放され、 対応する TIP もクローズされる。
表示に関しては、何も行わない。

flush_text
 
テキスト入力ポートのフラッシュ

【形式】

W   flush_text(TEXTPORT *text)

【パラメータ】

TEXTPORT    *text   テキスト入力ポート

【リターン値】

≧0    : 正常終了(関数値は確定状態(TXT_OUT / TXT_NONE))
<0    : エラー  (関数値はエラーコード)

【解説】

text で指定したテキスト入力ポートをフラッシュして、 残っていた未確定文字列をすべて確定する。 関数値として、確定文字列が発生した場合は、 TXT_OUT ( 1 ) が戻り、 確定文字列が発生しなかった場合は、TXT_NONE ( 0 ) が戻る。

この関数は、read_text() で、 「入力終」のキーイベントが入った場合と同一の動作を行う。

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 で指定されたイベントの処理を行った後、 次のイベントの取り出しを行わずにリターンする。
IDLE 処理関数の呼び出し、およびカレットの点滅処理は行わない。
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_NOSCRLTXT_SCRLCAR のいずれも指定されていないときは、 変換領域の終端(epos)が描画環境の表示長方形 (visrect) をはみ出したときにスクロールを要求する。 終端のはみ出しは、epos の位置(点)がはみ出しているかで判定される。
TXT_DISP (0x8000)
変換領域の再表示を行う。再表示後は、 自動的にリセットされる。この指定は、 read_text() の処理の結果として未確定文字列が表示されなかった場合に、 次の read_text() で未確定文字列の再表示を行うために自動的にセットされる場合がある。

動作モードは、TXT_DISP を除いて、 未確定文字列が存在する状態で変更してはならない (変更した場合の動作は保証しない)。

lpitch :
行送りを指定する。TXT_FIX モードの場合は意味を持たず無視される。 open_text() では、0 に初期化される。
TXT_INS、 または TXT_OVER モードの場合、 変換領域が表示領域の行末を越えた場合、次の行に表示する。 次の行の水平座標値(横書きの場合)/垂直座標値(縦書きの場合)は表示領域の行頭となり、垂直座標値(横書きの場合)/水平座標値(縦書きの場合)は lpitch で指定した値だけずらした位置(次行)となる。
横書きの場合
lpitch > 0 下へ行を送る
lpitch < 0 上へ行を送る
次行の垂直座標値 = 現在行の垂直座標値 + lpitch
縦書きの場合
lpitch > 0 左へ行を送る
lpitch < 0 右へ行を送る
次行の水平座標値 = 現在行の水平座標値 - lpitch
なお、行が重なるような行送り量を指定することはできない。 そのような場合は、自動的に行が重ならないように調整される。
このパラメータは、未確定文字列が存在する状態で変更してはならない (変更した場合の動作は保証しない)。
left :
変換領域の表示の行頭の座標値を指定する。モードにより次のように指定する。 TXT_FIX モードの場合は意味を持たず無視される。
open_text() では、0 に初期化される。
このパラメータは未確定文字列が存在する状態で変更してはならない (変更した場合の動作は保証しない)。
right :
変換領域の表示の行末の座標値を指定する。モードにより次のように指定する。 指定した行末位置を越えて描画は行われない。
open_text() では、 0 に初期化されるので、アプリケーションが必ず設定しなくてはいけない。
このパラメータは未確定文字列が存在する状態で変更してはならない (変更した場合の動作は保証しない)。
frcol :
変換領域の表示枠の色を指定する。 open_text() では、 黒に初期化される。変換領域の表示枠の色は、 対象文節の背景色にも使用される。
このパラメータは未確定文字列が存在する状態で変更してはならない (変更した場合の動作は保証しない)。
tgcol :
対象文節の文字色を指定する。 open_text() では、 白に初期化される。変換領域中で、 対象文節の背景色は frcol で指定した色となるため、 アプリケーションは、対象文節の文字色を、 frcol と区別できる色と設定する必要がある。
このパラメータは未確定文字列が存在する状態で変更してはならない (変更した場合の動作は保証しない)。
bgpat :
変換領域内の背景のパターンをデータボックスに登録されたパターンタイプのデータ番号で指定する。 0 は白、< 0 は透明(即ち、ウィンドウの背景色と同一)の特別の意味を持つ。
open_text() では、0 (白) に初期化される。
アプリケーションは、背景パターンと文字色を区別できる色に設定する必要がある。
このパラメータは未確定文字列が存在する状態で変更してはならない (変更した場合の動作は保証しない)。
spos :
変換領域の表示開始位置(文字描画位置)を指定する。 open_text()では、(0,0)に初期化されるので、 アプリケーションが必ず設定しなくてはいけない。
このパラメータは未確定文字列が表示されている状態で変更してはならない (変更した場合の動作は保証しない)。
epos :
変換領域の表示終了位置(文字描画位置)が戻る。 変換領域が空の場合は、spos に等しくなる。
height :
変換領域の行高さ(横書きの場合)/行幅(縦書きの場合)を示す。 変換領域を囲む枠線を含んだ高さ/幅となる。
n_cnv :
確定した文字数が戻される。 確定した文字が存在しない場合は 0 となる。
n_in :
確定した文字に対応する「よみ」の文字数が戻される。 確定した文字が存在しない場合は0となる。
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 は返されない。

read_text() の変換領域の表示の方法を以下に示す。

redisp_text
 
テキスト入力ポートの再表示


【形式】

W   redisp_text(TEXTPORT *text)

【パラメータ】

TEXTPORT *text  テキスト入力ポート

【リターン値】

リターン状態コード(TXT_SCRL / TXT_NONE)

【解説】

text で指定したテキスト入力ポートに未確定文字列が存在する場合、 未確定文字列の表示を行い、text->epos を更新し、 text->modeTXT_DISP 指定をリセットする。 未確定文字列が存在しない場合は何もしない。

変換領域の表示が描画環境の表示長方形 (visrect) をはみでる場合は変換領域の再表示を行わずに、TXT_SCRL の関数値でリターンする。 この場合は、text->modeTXT_DISP 指定はリセットされない。

その他の場合は、TXT_NONE の関数値でリターンする。


この章の目次にもどる
前頁:2.3 ウィンドウイベントにもどる
次頁:2.5 データボックスにすすむ