この章の目次にもどる
前頁: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_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   /* イメージの復帰ができなかった */
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_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  オーバーライト表示

wid は、未確定文字列を表示するウィンドウのIDの指定である。
この関数は、 TIP を mode で指定したモードでオープンし、 TEXTPORT 構造体をプロセスのローカル・メモリ中に生成し、 そのポインタを戻す ( TEXTPORT 構造体の内容は、 read_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_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 :
変換領域内の背景のパターンをデータボックスに登録されたパターンタイプのデータ番号で指定する。 0 は白、< 0 は透明 ( 即ち、ウィンドウの背景色と同一 ) の特別の意味を持つ。
open_text() では、0 ( 白 ) に初期化される。
アプリケーションは、背景パターンと文字色を区別できる色に設定する必要がある。
TXT_FIX、および TXT_INS モードでは、 変換領域が小さくなった場合、縮小した領域はこの背景パターンでクリアされる。
このパラメータは未確定文字列が存在する状態で変更してはならない(変更した場合の動作は保証しない)。
spos :
変換領域の表示開始位置(左下)を指定する。 open_text()では、(0,0)に初期化されるので、 アプリケーションが必ず設定しなくてはいけない。
このパラメータは常に変更可能である。
epos :
変換領域の表示終了位置(右下)が戻る。 変換領域が空の場合は、spos に等しくなる。
height :
変換領域の表示高さを示す。 TXT_OVER モードの場合は、 文字の高さ + 2 となり、 TXT_FIXTXT_INS モードの場合は、文字の高さ + 2 となる。
n_cnv :
確定した文字数が戻される。 確定した文字が存在しない場合は 0 となる。
n_in :
確定した文字に対応する「よみ」の文字数が戻される。 確定した文字が存在しない場合は0となる。
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 で終わっていない。
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_KEYDWNEV_AUTKEY 以外のイベントである。
TXT_CNV (0x100) :
未確定文字列が残っている。
TXT_NOIMG(0x200) :
変換領域の縮小部分のイメージの復帰ができなかったため、 背景パターンでクリアした ( メモリ不足でイメージが保存できなかった時で、 TXT_OVER 指定時のみ)。

read_text() の動作を以下に示す。

  1. modeTXT_DISP がセットされている場合は、 未確定文字列、 またはヌル選択 ( 文字カーソル ) の表示を行い、TXT_DISP をリセットする。 この処理は、確定文字列が発生し、かつ未確定文字列が残っている場合、 または変換領域が描画環境の visrect をはみ出ているため表示できなかった場合に、 未確定文字列の再表示のために使用される。
  2. *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 指定でない場合は、無視される。
  3. TIP の処理の結果 :
    確定文字列が発生した場合 :
    変換領域の表示をクリアし、 未確定文字列が残っている場合は、modeTXT_DISP をセットし、 TXT_OUT の関数値でリターンする。
    確定文字列が発生しない場合 :
    変換領域の表示を更新する。TXT_POS 指定時で、 epos が変化した場合は、TXT_POS の関数値でリターンする。
    変換領域の表示が描画環境 の visrect をはみでる場合は、 変換領域の表示をクリアして、 modeTXT_DISP をセットし、 TXT_SCRL の関数値でリターンする。
  4. TXT_WAIT 指定時は、イベントを取り出し、 (2)の処理を繰り返す。TXT_NOWAIT 指定時は、TXT_NONE または、 TXT_POS の関数値でリターンする。
  5. リターン時に、*evt には、TXT_EVT, TXT_KEY の場合は、 対象のイベントが格納され、 その他の場合は、EV_NULL が格納される。 また、未確定文字列が残っている場合には、関数値には、TXT_CNV が常にセットされる。

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

変換領域枠
図 6 : 変換領域枠
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 データボックスにすすむ