この章の目次にもどる
前頁:3.6 データマネージャにもどる
次頁:3.8 実身/仮身マネージャにすすむ

3.7 テキスト入力プリミティブ

3.7.1 テキスト入力プリミティブの機能

3.7.1.1 概要

テキスト入力プリミティブ ( TIP ) は、 外殻の HMI 機能の 1 つとして位置付けられ、 かな漢字変換およびローマ字かな変換を通した、 テキスト入力の機能を提供しているものである。

アプリケーションプログラムは、 このテキスト入力プリミティブを使用することにより、 かな漢字変換方式に依存しない共通的なインタフェースにより、 テキストの入力を行なうことが可能となる。

テキスト入力プリミティブで提供している機能は、 アプリケーション側でのきめの細かい処理を可能としているため、 かなりプリミティブなレベルであり、 また文字の表示機能は、一切含まれていない。

テキスト入力プリミティブの機能としては、かな漢字変換、 ローマ字かな変換の他に、学習辞書の保存状態の設定 / 変更機能が提供される。 また、辞書アクセスや単漢字変換の機能も包含されているが、 アプリケーションはこれらを特に意識する必要はない。 なお、辞書にない単語の登録機能や、 辞書データ交換のための辞書変換機能などの辞書メンテナンス機能は、 1 つの独立したシステムアプリケーションとして別に提供されることになる。

なお、テキスト入力プリミティブでは、 関連する機能として、カレット表示を行なう関数も提供している。

3.7.1.2 テキスト入力プリミティブ

テキスト入力プリミティブは、 一種のフィルターとして以下に示すようなモデルとして表現される。 即ち、入力として「キー入力イベント」を受け付け、 出力として「確定文字列」を戻すことになる。 さらに補助的な出力として「未確定文字列」、「文節情報」等を戻すことになる。 なお、 テキスト入力プリミティブで保持している文字列全体を「変換中文字列」と呼ぶ。 この文字列には、 最新の操作で確定した「確定文字列」と「未確定文字列」が含まれる。

テキスト入力プリミティブのモデル
図 111 : テキスト入力プリミティブのモデル

入力モードとしては、以下の3種類のいずれかを指定することができる。 通常、入力モードはユーザ毎に固定的なものが使用されるが、動的に変更することも可能である。

かな漢字変換モードは、 以下の 2 種類のいずれかであり、 自動変換モードでは、 入力した「よみ」が [変換/逆変換] なしに自動的に変換されるモードであり、 指定変換モードは、[変換/逆変換] によってのみ変換されるモードである。 自動変換の場合は、変換のタイミングにより各種の方法が考えられるが、 [変換/逆変換]なしに変換されるものは、 基本的にすべて自動変換とみなすものとする。 たとえば、句読点の入力時や、 入力文字種の切り替わり時点で変換されるものも自動変換と見なす。 なお、両方の変換モードをサポートしているか否かはインプリメントに依存する。

変換モードは、以下の 2 種類のいずれかであり、 直接モードでは入力した「よみ」が変換なしに直接出力されるモードであり、 変換モードはかな漢字変換モードで指定したかな漢字変換方式で変換されるモードである。

テキスト入力プリミティブでは、 以下に示すような機能をサポートすることが可能であり、 これらの操作は、 機能キーに対応するキー入力イベントによって行なわれる。ただし、こ れらの機能を実際にサポートしているか否かは、かな漢字変換のアルゴリズムに依存する。

3.7.1.3 テキスト入力ポート

テキスト入力プリミティブの動作環境をテキスト入力ポートと呼ぶ。 アプリケーションはテキスト入力ポートをオープンし、 オープン時に得られるIDを使用して以後の入力処理を行なうことになる。 テキスト入力ポートはオープンしたプロセスにのみ有効であり、 そのプロセスが終了した場合は自動的に削除される。

テキスト入力ポートのオープン時には、 以下に示すテキスト入力レコードを指定する必要があり、 指定したテキスト入力レコードにテキスト入力ポートの現在の状態が戻されることになる。

    typedef struct {
        W   n_out;      /* 確定文節数 */
        W   n_cl;       /* 全文節数 */
        W   n_roman;    /* 部分ローマ字数 */
        W   update;     /* 表示更新開始文字位置 */
        UW  caret;      /* 現在のカレット位置 */
        UW  clause;     /* 現在対象とする文節番号および状態 */
        W*  cl_cnv;     /* 変換中文字列の文節位置配列 */
        TC* cnv;        /* 変換中文字列 */
        W*  cl_in;      /* 入力(よみ)文字列の文節位置配列 */
        TC* in;         /* 入力(よみ)文字列 */
    } TIPREC;
n_out :
確定した文節数を示し、cnv で示される変換中文字列の先頭からの文節数を示す。 n_out で示される数の文節は、 続くテキスト入力ポートへの入力処理で削除されるので、 n_out ≠ 0 の時は、 アプリケーションは、指定された文節数のデータを必ず取りだしておく必要がある。
なお、テキスト入力プリミティブ内部で保持可能な文節数または文字バッファの制限を超えた場合にも、 n_out として先頭のいくつかの文節が確定されることがある。
n_cl :
変換中文字列全体の文節数を示す。
n_roman :
変換中文字列中でのローマ字入力の英字数 ( 0 〜 インプリメント依存 ) を示す。
        例: cnv → ・・・・き      n_roman =0
                   ・・・・きS     n_roman =1
                   ・・・・きSH    n_roman =2
                   ・・・・汽車    n_roman =0
update :
変換中文字列で変更があった先頭の文字位置を、 変換中文字列の先頭文字を "0" とした文字位置で示す。 これは、変換中文字列の表示の更新に使用され、 <0 の場合は変換中文字列は変化しなかったことを示す。
caret :
変換中文字列内でのカレットの現在位置を示す以下の値であり、 カレット表示のために使用される。
    xxxx xxxx xxxx xxxx xPPP PPPP PPPP PPPP
P :
カレットの現在位置

変換中文字列内で n_out で示される確定文節の直後の文節の先頭文字を"0"とした場合の、 カレットの直後に位置する文字の位置。 すなわち、未確定文字列内での文字位置。

X :
予約
clause :
変換中文字列内での、現在の対象文節、 またはよみ列修正文節を示す以下の値であり、 対象文節 / よみ列修正文節の表示のために使用される。 対象文節は、変換操作の対象となっている文節であり、 よみ列修正文節は、修正操作の対象のとなっている文節である。
    XXXX XXXX XXXX XXXX MPPP PPPP PPPP PPPP
M :
= 0 対象文節
= 1 よみ列修正文節
P:
対象 / よみ列修正文節の文節位置

変換中文字列内で n_out で示される確定文節の直後の文節を "0"とした場合の文節の位置。すなわち、 未確定文字列内での文節位置。

X :
予約
cl_cnv :
変換中文字列の文節区切り位置を示す (n_cl+1) 個の要素からなるワード配列へのポインタであり、 各文節の先頭の文字位置を表わす。 文字位置は "0" から始まるため先頭の要素は常に "0" となり、 最後の要素は変換中文字列の最後の TNULL(0) の文字位置であり、 変換中文字列全体の文字数となる。
なお、未確定文字列中の文節区切り位置は、 対象文節 / よみ列修正文節の特定のために使用されるため、 厳密な意味での文節区切り位置とは異なる場合がある。
cnv :
変換中文字列へのポインタである。 一般に確定文字列と未確定文字列からなっているが、 n_out = 0 ときは、未確定文字列のみとなり、 n_our = n_cl のときは、確定文字列のみとなる。 変換中文字列の最後には TNULL(0) が入っている。
in_cnv :
入力(よみ)文字列の文節区切り位置を示す (n_cl + 1) 個の要素からなるワード配列へのポインタであり、 各文節の先頭の文字位置を表わす。 文字位置は "0" から始まるため先頭の要素は常に "0" となり、 最後の要素は入力 ( よみ ) 文字列の最後の TNULL(0) の文字位置であり、 入力 ( よみ ) 文字列全体の文字数となる。
in :
変換中文字列に対応する入力(よみ)文字列へのポインタである。 入力(よみ)文字列の最後には TNULL(0) が入っている。

一般に自動変換の場合は、 テキスト入力ポートへのキー入力のたびに、 変換中文字列の状態が変化し、 逐次確定された文節が掃き出されることになるが、 指定変換の場合は、 [変換 / 逆変換]を入力するまでは、 変換中文字列と入力文字列は同一であり、 文節数は常に "1" となる。

以下にテキスト入力レコードの内容の例を示す。

テキスト入力レコードの内容
図 112 : テキスト入力レコードの内容

3.7.1.4 カレット表示

カレットは文字の挿入位置を示す山形のシンボルであり、 通常は適当な周期でブリンクしている。 カレットは、何も選択されていないことを示す、 選択ギャップ ( ヌル選択 ) の縦棒と結びついた場合は、 文字カーソルの意味を持つことになる。

テキスト入力プリミティブでは、 カレット ( 文字カーソル ) の表示をサポートするための関数が用意されており、 以下の構造体によりカレットが定義される。 カレット表示の関数では、 表示するカレットの状態を保持していないため、 この CARET 構造体の中に、 カレットの状態が保持されることになる。

    typedef struct {
        W   sts;        /* 0:消去状態  1:表示状態 */
        W   gid;        /* 描画環境ID */
        PNT pos;        /* 表示位置 */
        W   height;     /* 表示高さ */
        UW  kind;       /* カレット種類 0:横  1:縦 */
        COLOR   color;  /* カレットの表示カラー */
    } CARET;
sts :
カレットの表示状態であり、 "0"で消去状態、 "1"で表示状態を示す。
この値はカレットの表示関数 ( idsp_car() ) により自動的に更新されるが、 カレットの表示状態に応じて直接変更してもよい。
gidn :
カレットを描画する描画環境のIDである。
pos
カレットの山型の頂点の位置(相対座標)の指定である。
height
選択ギャップの表示の高さであり、 通常はその位置の文字の高さに合わせることになる。 height = 0 の場合は、 選択ギャップは表示されず、カレットのみの表示となる。
kind :
カレットの種類を指定する以下の値である。
    XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXD
D:
= 0 : 横書き
= 1 : 縦書き
X:
予約
color :
カレットの表示カラーの指定であるが、 インプリメントによってはサポートされない場合もある。

通常カレットの標準形状を、 以下に示すが詳細はインプリメントに依存する。

通常カレットの標準形状
図 113 : 通常カレットの標準形状

カレットの表示は、 基本的に入力受付状態のウィンドウに対してのみ行なわれる。

3.7.2 データタイプ/定数の定義

□ 定数定義

#define TIP_KANA    0x0000  /* かな入力モード */
#define TIP_ROMAN1  0x0001  /* ローマ字入力モード(n) */
#define TIP_ROMAN2  0x0002  /* ローマ字入力モード(nn) */
#define TIP_DIRMD   0x0100  /* 直接モード */
#define TIP_CNVMD   0x0000  /* 変換モード */
#define TIP_AUTO    0   /* 自動変換モード */
#define TIP_MANUAL  1   /* 指定変換モード */
#define TIP_OUT     0x1 /* 確定文節が発生した */
#define TIP_CNV     0x2 /* 未確定文節が変更された */
#define TIP_CAR     0x4 /* カレット位置が変化した */
#define TIP_CL      0x8 /* 対象文節、または区切り位置が変化した */

□ ichg_lrn()

#define TIP_DIC_COMMON  0x00000001  /* 基本辞書 */
#define TIP_DIC_SINGLE  0x00000002  /* 単漢字辞書 */
#define TIP_DIC_USR     0x00000004  /* ユーザ辞書 */

□ TIP

typedef struct {
    W   n_out;      /* 確定文節数 */
    W   n_cl;       /* 全文節数 */
    W   n_roman;    /* 部分ローマ字数 */
    W   update;     /* 表示更新開始文字位置 */
    UW  caret;      /* 現在のカレット位置 */
    UW  clause;     /* 現在対象とする文節番号および状態 */
    W*  cl_cnv;     /* 変換中文字列の文節位置配列 */
    TC* cnv;        /* 変換中文字列 */
    W*  cl_in;      /* 入力文字列の文節位置配列 */
    TC* in;         /* 入力文字列 */
} TIPREC;
#define TIP_YOMIMOD 0x80000000  /* 文節の M フラグ */

□ カレット

typedef struct {
    W   sts;        /* 0:消去状態  1:表示状態 */
    W   gid;        /* 描画環境ID */
    PNT pos;        /* 表示位置 */
    W   height;     /* 表示高さ */
    UW  kind;       /* カレット種類 0:横  1:縦 */
    COLOR   color;  /* カレットの表示カラー */
} CARET;

3.7.3 テキスト入力プリミティブの関数

ここでは、 テキスト入力プリミティブが外殻の拡張システムコールとしてサポートしている各関数の詳細を説明する。

関数はすべて WERR 型の関数値をとり、 何らかのエラーがあった場合は「負」のエラーコードが戻る。 正常終了時には「0」または「正」の値が戻る。

各関数のエラーコードとしては、ここで示した以外にも、 核や他の外殻でエラーが検出された場合は、 以下のエラーコードが直接戻る場合がある。

E_xxx :
核のエラー ( E_NOMEM, E_NOSPC, E_PAR 等 )
EG_xxx :
ディスプレイプリミティブのエラー ( EG_ADR 等 )

また、各関数のパラメータの説明では、以下に示す記述方法を使用している。

    ( x ‖ y ‖ z ) -- x, y, z のいずれか1つを意味する。
    |               -- OR で指定可能なことを意味する。
    [ ]             -- 省略可能なことを意味する。
ichg_mod
 
テキスト入力モードの変更

【形式】

WERR    ichg_mod(W mode)

【パラメータ】

W   mode ::= ( TIP_KANA  ‖ TIP_ROMAN1 ‖ TIP_ROMAN2)

        TIP_KANA    0   かな入力モード
        TIP_ROMAN1  1   ローマ字入力モード1 (n方式)
        TIP_ROMAN2  2   ローマ字入力モード2 (nn方式)

【リターン値】

≧0    正常(関数値は変更前の入力モード)
<0    エラー(エラーコード)

【解説】

テキスト入力モードを mode で指定した内容に変更し、 変更前のテキスト入力モードを関数値として戻す。 mode<0 の場合は入力モードを変更せずに現在の入力モードを関数値として戻す。

テキスト入力モードはグローバルに有効であり、 入力モードを変更した場合は、 全てのプロセスでオープンしているテキスト入力ポートに対して、 変更した時点から適用される。

【エラーコード】

EX_PAR      : パラメータが不正である(mode が不正)
ichg_lrn
 
学習辞書の保存状態変更

【形式】

WERR    ichg_lrn(UW kind, W stat)

【パラメータ】

UW  kind    辞書の種類
W   stat    0で保存しないことを指定
            >0で保存することを指定

【リターン値】

≧0    正常(関数値は変更前の学習辞書の保存状態)
<0    エラー(エラーコード)

【解説】

kind で指定した種類の学習辞書の保存状態を、 stat で指定した内容に変更し、 変更前の学習辞書の保存状態を関数値として戻す。 stat<0 の場合は、 保存状態を変更せずに現在の保存状態を関数値として戻す。

kind は、ビット対応で辞書の種類を指定する ( 対応ビット = 1 で指定 ) 。

         0XXX XXXX XXXX XXXX
         |------+------|  ||
                |         |+-- 基本辞書
   インプリメント依存辞書 +---- 単漢字変換辞書

なお、学習辞書の保存状態の変更による実際の効果はインプリメントに依存する。

【エラーコード】

EX_NOSPT    : 現在のインプリメントではその機能をサポートしていない
EX_PAR      : パラメータが不正である(kind または stat が不正)
iopn_tip
 
テキスト入力ポートのオープン

【形式】

WERR    iopn_tip(TIPREC *tip, W mode)

【パラメータ】

TIPREC  *tip    テキスト入力ポート用レコード
W       mode    ::= ( TIP_DIRMD ‖ TIP_CNVMD ) | ( TIP_AUTO ‖ TIP_MANUAL )

        TIP_DIRMD   0x100   直接モード(変換なし)
        TIP_CNVMD   0   変換モード

        TIP_AUTO    0   自動変換モード
        TIP_MANUAL  1   指定(マニュアル)変換モード

TIP_DIRMD を指定した時、 TIP_AUTO / TIP_MANUAL の指定は、 意味を持たず無視される。

【リターン値】

≧0    正常(関数値はテキスト入力ポートID(tipid))
<0    エラー(エラーコード)

【解説】

テキスト入力ポートを新規にオープンし、そのID ( tipid ≧ 0 ) を関数値として戻す。

tip はオープンしたテキスト入力ポートに割り当てられる、 TIPREC の領域へのポインタであり、 以後の操作でのテキスト入力ポートの状態がセットされることになる。 オープン時には、tip で指定した TIPREC の内容はすべて "0" に初期化される。

mode は変換モードの指定であるが、 インプリメントによってサポートされていない場合はエラーとなる。

【エラーコード】

EX_ADR      : アドレス(tip)のアクセスは許されていない
EX_LIMIT    : システムの制限を超えた
EX_NOSPC    : システムのメモリ領域が不足した
EX_NOSPT    : 現在のインプリメントではその機能をサポートしていない
              (サポートしない変換モード)
EX_PAR      : パラメータが不正である(mode が不正)
icls_tip
 
テキスト入力ポートのクローズ

【形式】

ERR icls_tip(W tipid)

【パラメータ】

W   tipid   テキスト入力ポートID

【リターン値】

≧0    正常
<0    エラー(エラーコード)

【解説】

tipid で指定したテキスト入力ポートをクローズする。

iput_key
 
テキスト入力ポートへのキー入力

【形式】

WERR    iput_key(W tipid, EVENT *evt)

【パラメータ】

W       tipid   テキスト入力ポートID
EVENT   *evt    キーイベント

【リターン値】

≧0    正常(関数値はテキスト入力ポートの変化状態)
<0    エラー(エラーコード)

【解説】

tipid で指定したテキスト入力ポートに *evt で指定したキー入力イベント ( EV_KEYDWN または EV_AUTKEY ) を入力し、 その結果のテキスト入力ポートの状態をオープン時に割り当てた TIPREC に戻す。

関数値として、テキスト入力ポートの状態変化が以下のビット対応で戻される。 何の変化も発生しなかった場合は、 関数値は"0"となる。 アプリケーションはこの関数値に応じた適当な処理を行なう必要がある。

    TIP_OUT     0x1 確定文節が発生した
    TIP_CNV     0x2 未確定文字列が変更された
    TIP_CAR     0x4 カレット位置が変化した
    TIP_CL      0x8 対象文節が移動した、または区切り位置が変化した

*evt で指定したイベントの内容が以下のいずれかの場合はエラーとなり、 TIPREC の内容は一切変化しない。

【エラーコード】

EX_CKEY     : 変換中文字列が存在しない状態で機能キーコードが入力された
EX_KEY      : 不正キーコードである
EX_LIMIT    : システムの制限を超えた(変換中文字列が長すぎる)
EX_PAR      : パラメータが不正である(EV_KEYDWN、または EV_AUTKEY ではない)
EX_TID      : テキスト入力ポート(tipid)は存在していない
iput_str
 
テキスト入力ポートへの文字列入力

【形式】

ERR iput_str(W tipid, TC *str)

【パラメータ】

W   tipid   テキスト入力ポートID
TC  *str    文字列

【リターン値】

≧0    正常
<0    エラー(エラーコード)

【解説】

tipid で指定したテキスト入力ポートに str で指定した文字列を入力して変換を行ない、 その結果のテキスト入力ポートの状態を、オープン時に割り当てた TIPREC に戻す。

str で指定した文字列は、 ローマ字コードを含まない通常の文字コード、 [スペース(=0x20)]および[リクワイアードスペース(=0xA0)]のみからなる TNULL(0) で終了する文字列であり、 途中にローマ字コードや、[改行]等の特殊文字キーコード、 [変換]等の機能キーコードが含まれている場合は、 EX_KEY のエラーとなる。

また、直接モード ( TIP_DIRMD ) でオープンされたテキスト入力ポートを指定した場合は、 EX_NOSPT のエラーとなる。

エラーが発生した場合は、 TIPREC の内容は保証されない。

この関数は、主に入力済みの文字列に対する再変換の最初の変換時に使用され、 テキスト入力ポートに変換中文字列が存在していない状態で使用される。 テキスト入力ポートに、変換中文字列が存在していた状態で使用した場合の結果は、 保証されない。

【エラーコード】

EX_KEY      : 不正キーコードである
EX_LIMIT    : システムの制限を超えた(変換中文字列が長すぎる)
EX_NOSPT    : 現在のインプリメントではその機能をサポートしていない
              (直接モードでオープンされている)
EX_TID      : テキスト入力ポート(tipid)は存在していない
ichg_blk
 
カレットのブリンク周期の取出し/設定

【形式】

WERR    ichg_blk(W intvl)

【パラメータ】

W   intvl   ブリンク周期

【リターン値】

≧0    正常(関数値は設定前のブリンク周期)
<0    エラー(エラーコード)

【解説】

カレットのブリンク周期を intvl で指定した値に設定し、 設定以前の値を関数値として戻す。 intvl = 0 の場合は、 ブリンクしない事を意味し、intvl<0 の場合は、 設定せずに現在の設定値を戻す。

ブリンク周期の単位はミリ秒であるが、 実際にはインプリメントに依存した単位で、 大きな値の方向に丸められることになる。

カレットのブリンク周期はグローバルに適用される。

【エラーコード】

エラーは発生しない。

idsp_car
 
カレットの表示

【形式】

ERR idsp_car(CARET *car, W mode)

【パラメータ】

CARET   *car    カレットデータ
W mode 表示 / 消去 / ブリンク指定

【リターン値】

≧0    正常
<0    エラー(エラーコード)

【解説】

car で指定したカレットを mode の指定に従って、 消去 / 表示 / ブリンクする。

mode = 0:
消去

car->sts ≠0 の場合、 car->pos, car->height で示されるカレットを消去し、 car->sts を 0 に設定する。
car->sts = 0 の場合は何も行なわない。

> 0 :
表示

car->sts = 0 の場合、 car->pos, car->height で示されるカレットを表示し、 car->sts を 1 に設定する。
car->sts ≠ 0 の場合は何も行なわない。

< 0 :
ブリンク

ブリンクの間隔に達していた場合、 car->sts の値に応じて、 car->pos, car ->height で示されるカレットを表示または消去し、 car->sts を更新する。
ブリンク間隔に達していない場合は何も行なわない。

ブリンクの場合は、ブリンクの周期以内に周期的に idsp_car (&car, -1) を実行する必要がある。

カレットの表示を移動する場合は、まず消去を行なった後、 カレットの位置、高さを変更して、 表示を行なうことになる。 また、表示状態で、 カレット構造体のパラメータを変更した場合の動作は保証されない。

【エラーコード】

EX_ADR      : アドレス(car)のアクセスは許されていない

この章の目次にもどる
前頁:3.6 データマネージャにもどる
次頁:3.8 実身/仮身マネージャにすすむ