ローカライズされたテキストの入力は、通常、ローカルな入力メソッドかネットワークを使った入力メソッドのどちらかを使用して行います。
ローカルな入力メソッドは、入力メソッドが Xlib 内に実装されることを意味します。通常この方法は、単純な規則で構成できて言語固有の機能を必要としない言語で使用します。ネットワークを使った入力メソッドは、実際の入力メソッドが別のサーバで提供され、Xlib は言語固有の構成を行うために XIM プロトコルを介してそれらのサーバと通信することを意味します。
アプリケーションですべてのテキスト入力を行うのに Text ウィジェットを使用することを強くお勧めします。
多くのアプリケーションは、入力に基づくウィジェットの中で描画を行います。デスクトップ環境内での一貫性を提供するために、XmIm 関数をお勧めします。これは、入力メソッドに必要な形式およびジオメトリ管理が VendorShell ウィジェット・クラスで管理されるからです。アプリケーションに関係するのは、キー・イベント、フォーカス、描画領域内の現在の入力位置の通信だけです。XmIm 関数を使用するには下位の Xlib 入力メソッドのアーキテクチャの基本知識が必要ですが、開発者は XmIm の情報を理解していれば問題ありません。
一部のアプリケーションは、プリエディットにおける中間フィードバックを直接表示する必要があります。たとえばアプリケーションが Xlib の機能の限度を超えてしまうことがあります。この例には、PostScriptTM による描画や縦書きの仕様が挙げられます。
コア Xlib は、アプリケーションがプリエディットにおける中間フィードバックを表示できるようにするインタフェースの共通セットを提供します。アプリケーションのコールバックを登録し、プリエディットの形式を XNPreeditCallbacks に設定することで、アプリケーションは入力メソッドから中間のプリエディット・データを獲得し、必要なものをすべて描画できます。
複雑な言語処理を行うアプリケーションは、特定の XIM 処理系とその入力エンジンの中の拡張機能を認識することがあります。そのようなアプリケーションは最先端であり、XIM 関数の詳しい知識と経験を必要とします。
基本プロンプトおよびダイアログには、Text ウィジェットか TextField ウィジェットをお勧めします。Text[Field] ウィジェットの中にローカライズされたテキストを獲得および設定するのに、リソースの他にすべての XmTextField 関数と XmText 関数を使用できます。
ほとんどの XmText 関数は、バイト数ではなく文字数に基づいています。たとえば、すべての XmTextPosition() 関数位置は文字の位置であり、バイトの位置ではありません。XmTextGetMaxLength() 関数はバイト数を返します。疑わしい場合、位置は常に文字単位であることを思い出してください。
Text ウィジェットまたは TextField ウィジェットの幅は、XmNcolumns のリソース値によって決定します。しかし、この値はフォント・セットの最も幅の広い文字の数を表すものであり、バイト数やカラム数ではありません。たとえば、Text ウィジェットに可変幅のフォントを選択したとします。文字 i の幅は 1 ピクセルであり、文字 W の幅は 7 ピクセルです。XmNcolumns の値が 10 に設定されると、これは Text ウィジェットを 10 文字以上表示できる幅にするための要求と見なされます。したがって Text ウィジェットは、最も広い文字の幅を使って Core ウィジェットのピクセル幅を決定しなければなりません。この例では、ウィジェットに W なら 10 個、i なら 70 個表示できます。XmNcolumns のこの構造は、コード・セットがマルチバイトでマルチカラム・エンコーディングのロケールの場合、問題を起こす可能性があります。この値はローカライズされたリソースの中で設定してください。
次節は、入力メソッドの管理に使用するアプリケーションで使用可能な関数のセットを示します。Text ウィジェットおよび TextField ウィジェットを使用するアプリケーションについては、「入力メソッド (キーボード)」を参照してください。
アプリケーションはユーザから文字入力を受け付けても、そのために TextField ウィジェットや Text ウィジェットを使用しない場合があります。たとえば、DrawingArea ウィジェットを使用するアプリケーションでは、ユーザは直接 DrawingArea にテキストを入力できます。この場合、アプリケーションは、後の節で説明するように Xlib XIM 関数を使用できます。または、代わりにアプリケーションは Motif 1.2 の XmIm 関数を使用できます。XmIm 関数により、アプリケーションは最小限のコードで入力メソッドに接続および対話できます。さらに、XmIm 関数によって Motif VendorShell ウィジェットがアプリケーションに代わって入力メソッドのジオメトリ管理を実行できます。
XmIm 関数は Motif 1.2 のすべての処理系に含まれて出荷されますが、XmIm 関数は Motif 1.2 のドキュメントには記載されていません。OSF は、Motif 2.0 のために XmIm 関数を増やしてドキュメント化する意向を明らかにしています。ここで説明する関数は Motif 1.2 の XmIm 関数です。
Motif 1.2 の XmIm 関数は、プリエディット・コールバック形式やステータス・コールバック形式の入力メソッドをサポートしません。Xlib API によりプリエディット・コールバックが使用できます。詳細は、「XIM 管理」を参照してください。
Motif 1.2 ベースのアプリケーションで安全に使用できる XmIm 関数を次に示します。パラメータと型の正式な説明は xm.h ヘッダ・ファイルにあります。
関数名 |
説明 |
---|---|
XmImRegister() |
XOpenIM() を実行し、サポートされている形式の入力メソッドを照会します。 |
XmImSetValues() |
プリエディットおよびステータスの形式を調整および選択します。 |
XmImSetFocusValues() |
XIC がなければ作成します。入力メソッドにウィジェットがフォーカスを獲得したことを通知します。XIC に渡される値を設定します。
|
XmImUnsetFocus() |
入力メソッドにウィジェットがフォーカスを失ったことを通知します。 |
XmImMbLookupString() |
XmbLookupString() と等価の Xm の関数で、1 つ以上のキー・イベントを文字に変換します。戻り値は XmbLookupString() と等価です。
|
XmImUnregister() |
入力メソッドとウィジェットを切り離し、新しい入力メソッドへの接続を可能にします。必ずしも入力メソッドを閉じるわけではありません (処理系によります)。 |
XmImSetValues() 関数と XmImSetFocusValues() 関数により、アプリケーションは入力メソッドが必要とする情報を渡すことができます。すべての値が必要ではない場合でも、(それぞれの値はプリエディットおよびステータスの形式をサポートするので) アプリケーションがすべての値を渡すことが重要です。これは、ユーザまたは VendorShell ウィジェットによってどの形式が選択されたかをアプリケーションは認識できないからです。次に、XmImSet[Focus]Values() 関数への呼び出しで渡されるべき各値の引き数とデータ型を示します。
引き数名 |
データ型 |
---|---|
XmNbackground |
Pixel |
XmNforeground |
Pixel |
XmNbackgroundPixma |
Pixmap |
XmNspotLocation |
XPoint |
XmNfontList |
Motif fontlist |
XmNlineSpace |
int (連続ベースライン間のピクセルの高さ) |
XmIm 関数は次のように使用されます。
ツールキットを初期化する前に、アプリケーションはロケールを初期化するために XtSetLanguageProc(NULL, NULL, NULL) を呼び出します。
文字入力をしたい箇所でウィジェットを作成した後、アプリケーションは入力メソッドを開いて接続を確立するために XmImRegister(widget) を呼び出します。
入力メソッドへの接続を確立した後、アプリケーションは XmImSetValues() を呼び出してリストされているすべての値を渡すことにより、初期 XIC 値を入力メソッドに渡します。この関数は引き数 arg_list と number_args を取ります。arglist は XtSetArg() を呼び出すことで設定されます。
XtAddEventHandler() 関数を介して、入力メソッドから入力を獲得するウィジェットのマネージャ・ウィジェットに対してイベント・ハンドラを追加します。イベント・ハンドラは FocusChangeMask マスク用です。このハンドラは、フォーカスを獲得したときに XmImSetFocusValues() を呼び出し、フォーカスを失ったときに XmImUnsetFocus() を呼び出します。入力メソッドのためのフォーカス設定するとき、上記にリストされた値の完全なセットを渡します。
入力メソッドから入力を獲得するウィジェットに対して DestroyCallback を追加します。デストロイ・コールバックでは、ウィジェットと入力メソッドの間の接続を切り離していることを入力メソッドに通知するために、XmImUnregister() を呼び出します。
上記にリストされた 1 つ以上の入力メソッド値に変更があった時 (たとえば spotLocation) に入力メソッドに通知するため、XmImSetValues() を使用します。
XIM 管理関数を次に示します。
関数名 |
説明 |
---|---|
XOpenIM() |
入力メソッドへの接続を確立します。 |
XCloseIM() |
あらかじめ XOpenIM() への呼び出しで確立された入力メソッドへの接続を閉じます。 |
XGetIMValues() |
属性リストの入力メソッドを照会します。現在、Xlib での唯一の標準引き数は XNQueryInputstyle です。 |
XDisplayOfIM() |
入力メソッドに関連付けられたディスプレイを返します。 |
XLocaleOfIM() |
入力メソッドのロケールを識別する文字列を返します。標準的な文字列はありません。この呼び出しで返される値は処理系が定義します。 |
XCreateIC() |
入力コンテキストを作成します。入力コンテキストには、(もしあれば) 入力メソッドが必要とするデータと、そのデータを表示するのに必要な情報の両方が含まれます。 |
XDestroyIC() |
入力メソッドを破棄し、関連付けられていたメモリを解放します。 |
XIMOfIC() |
指定された入力コンテキストに、現在関連付けられている入力メソッドを返します。 |
XSetICValues() |
文字データの入力、プリエディット情報、またはステータス情報の表示をコントロールするために、0 個以上の値を入力コンテキストに渡します。すべての有効な入力コンテキスト値の引き数の表が、X11R5 の仕様書に記述されています。 |
XGetICValues() |
0 個以上の入力コンテキスト値を得るために入力コンテキストを照会します。すべての有効な入力コンテキスト値の引き数の表が、X11R5 の仕様に記述されています。 |
XIM イベント処理関数を次に示します。
関数名 |
説明 |
---|---|
XmbLookupString() |
キーを押したイベントをマルチバイト文字に変換します。 |
XwcLookupString() |
キーを押したイベントをワイド文字に変換します。 |
XmbResetIC() |
入力コンテキストを初期状態にリセットします。そのコンテキストで保留されている入力はすべて削除されます。現在のプリエディットの値を char* 文字列として返します。入力メソッドの処理系によっては、戻り値は NULL になります。 |
XwcResetIC() |
入力コンテキストを初期状態にリセットします。そのコンテキストで保留されている入力はすべて削除されます。現在のプリエディットの値を wchar_t* 文字列として返します。 |
XFilterEvent() |
クライアントへのすべての着信イベントを、アプリケーションが処理する前に、入力メソッドが処理できるようにします。 |
XSetICFocus() |
指定された入力コンテキストに接続されたフォーカス・ウィンドウが、キーボード・フォーカスを受信したことを入力メソッドに通知します。 |
XUnsetICFocus() |
指定された入力コンテキストがキーボード・フォーカスを失い、そのコンテキストに接続されたフォーカス・ウィンドウには入力できなくなったことを入力メソッドに通知します。 |
X 入力メソッド (XIM) は 3 種類のコールバックを提供します。1 番目はプリエディット・コールバックで、これによりアプリケーションはプリエディットの間に中間フィードバックを表示できます。2 番目はジオメトリ・コールバックで、これによりアプリケーションと XIM は XIM で使用されるジオメトリをネゴシエートできます。3 番目はステータス・コールバックで、これによりアプリケーションは XIM の内部ステータスを表示できます。
表 2-2 XIM コールバック
XIM プリエディット・コールバック |
XIM ステータス・コールバック |
XIM プリエディット・キャレット・コールバック |
XIM ジオメトリ・コールバック |
---|---|---|---|
PreeditStartCallback() |
StatusStartCallback() |
PreeditCaretCallback() |
GeometryCallback() |
PreeditDoneCallback() |
StatusDoneCallback() |
|
|
PreeditDrawCallback() |
StatusDrawCallback() |
|
|