CTL 技術は、Motif の次の変更によってサポートされています。
オブジェクトの配置を制御する
文字列の文字を表示する方向を指定する
新しい擬似リソースを XmRendition に追加する
XmRenditionに関連付けられたテキストのレイアウト動作に影響を及ぼする
レンディションレイアウトオブジェクトのレイアウト修飾子文字列を返す
ウィジェットに関連付けられたレンディションの現在のレイアウトオブジェクト設定の値を返す
レンディションに関連付けられたレイアウトオブジェクトのレイアウト識別子値を設定す
ウィジェットに関連付けられたレンディションのレイアウトオブジェクト設定を変更する
合成文字列を作成する
XmNlayoutDirection リソース はオブジェクトレイアウトを制御します。このリソースは、LayoutObject の方向の値を次のように使用します。
XmNlayoutDirection の概要 (特に、XmStringDirection と XmNlayoutDirection の関係) については、 『Motif Programmer's Guide (Release 2.1)』の 11.3 節を参照してください。
XmNlayoutDirection が XmDEFAULT_DIRECTION として指定されている場合、ウィジェットのレイアウトの方向は作成時に支配的な擬似 XOC に設定されます。動的テキスト (XmText および XmTextField) では、ウィジェットに使用されている XmRendition に関連付けられた擬似 XOC が支配的擬似 XOC になります。静的テキスト (XmList、XmLabel、XmLabelG) のレイアウト方向は、方向の指定されている最初の合成文字列コンポーネントに基づいて設定されます。次の 2 通りのいずれかで指定します。
コンポーネントの種類が XmSTRING_COMPONENT_LAYOUT_PUSH または XmSTRING_COMPONENT_DIRECTION の場合
コンポーネントの種類が XmSTRING_COMPONENT_LOCALE_TEXT、XmSTRING_COMPONENT_WIDECHAR_TEXT、または XmSTRING_COMPONENT_TEXT の場合。関連付けられた XmRendition および LayoutObject から設定
XmNlayoutDirection が XmDEFAULT_DIRECTION として設定されていない場合、XmNlayoutModifier @ls orientation の値がレイアウト修飾子文字列に明示的に指定されていなければ、XmNlayoutDirection の値は XOC およびその LayoutObject に受け渡されます。
XmNlayoutDirection と XmNlayoutModifier @ls orientation の両方の値が明示的に指定されている場合、上記の動作の中間になります。ウィジェットオブジェクトのレイアウトは XmNlayoutDirection により制御され、レイアウトの変換は XmNlayoutModifier @ls orientation の値により制御されます。
詳細については、『CAE Specification: Portable Layout Services: Context-dependent and Directional Text』(The Open Group: Feb 1997; ISBN 1-85912-142-X; document number C616) を参照してください。このマニュアルでは、コンテキストに依存する双方向のテキスト変換を、既存の POSIX ロケールモデルに対する論理拡張として処理するときに使用する、移植可能な機能について説明しています。複合テキスト言語 (Complex-text languages) をサポートしたいシステムプログラマまたはアプリケーションプログラマを対象としています。
XmStringDirection は、文字列に含まれる各文字の表示方向を指定するデータ形式です。
XmNlayoutDirection リソースは、文字列の方向を指定するコンポーネントを持たないすべての複合文字列 (XmString) に対してデフォルトのレンダリング方向を設定します。したがって、XmNlayoutDirection リソースに対して適切な値を設定するだけで、レイアウト方向を設定できます。複合文字列の各コンポーネントの方向を指定する必要はありません。アプリケーションにおいて XmString がレンダリングされる場合、その文字列が方向 (XmStringDirection) を明示して作成されたかどうかが確認されます。文字列が方向コンポーネントを提供しない場合、アプリケーションは XmNlayoutDirection リソースの値から現在のウィジェットを確かめ、その値を XmString のデフォルトのレンダリング方向として使用します。
CTL により、以下に示す新しい擬似リソースが XmRendition に追加されました。擬似リソースの説明は、表の後にあります。
表 6–1 XmRendition の新しいリソース
名前 |
クラス/タイプ |
アクセス |
デフォルト値 |
---|---|---|---|
XmNfontType |
XmCFontType/XmFontType |
CSG |
XmAS_IS |
XmNlayoutAttrObject |
XmClayoutAttrObject/String |
CG |
NULL |
XmNlayoutModifier |
XmClayoutModifier/String |
CSG |
NULL |
レンディションフォントオブジェクトのタイプを指定します。CTL では、このリソースの値が XmFONT_IS_XOC の値になっている必要があります。それ以外の値が設定されていると、XmNlayoutAttrObject と XmNlayoutModifier リソースは無視されます。
このリソースの値が XmFont_IS_XOC で、XmNfont リソースが設定されていない場合、XmNfontName リソースの値は、その作成時点で、XmNlayoutAttrObject リソースにより指定されたロケール、または現在のロケールの XOC オブジェクトに変換されます。さらに、XmNlayoutModifier リソースの値は XOC に関連付けられた任意のレイアウトオブジェクトに受け渡されます。
AttrObject 引数を指定します。このリソースは、この XmRendition に関連付けられた XOC に関連付けられた Layout Object の作成に使用されます。この文字列の構文およびセマンティクスについては、レイアウトサービス m_create_layout() の仕様を参照してください。Layout Modifier Orientation の出力値と XmNlayoutDirection ウィジェットリソースの相互作用については、上述の XmNfontType の説明を参照してください。
この XmRendition の XOC とともに使用されるレイアウトオブジェクトに受け渡されるレイアウト値を指定します。この文字列の構文およびセマンティクスについては、『CAE Specification』を参照してください。
XmRendition{Retrieve,Update} を用いてこのリソースを設定すると、文字列はこのレンディションに関連付けられた XOC に関連付けられたレイアウトオブジェクトに受け渡されます。レイアウトサービスは以上の手続きにより動的に構成されます。Orientation、Context、TypeOfText、TextShaping、または ShapeCharset を変更すると予測不能な動作が生じる可能性があります。
XmNlayoutModifier は、XmRendition に関連付けられたテキストのレイアウト動作に影響します。たとえば、数値のレイアウトデフォルト値が NUMERALS_NOMINAL ならば、XmNlayoutModifier に @ls numerals=nominal:national または @ls numerals=:national を設定することにより、NUMERALS_NATIONAL に変更することができます。
レイアウト値は以下の各グループに分類できます。
エンコーディング記述 – TypeOfText、TextShaping、ShapeCharset (およびロケールのコードセット)
TypeOfText はセグメント順であり、不透明なブロックとして表すことができます。通常、レンディションオブジェクトを通じてこれらの値を動的に変更することは無意味です。ほとんどの場合、予測不能な動作を生じる結果となります。
レイアウト動作 – Orientation、Context、ImplicitAlg、Swapping、および Numerals。Orientation と Context は、動的に変更すべきではありません。ImplicitAlg、Swapping、Numerals を変更するようにしてください。
編集動作 – CheckMode
Xm CTL では、XmText と XmTextField が拡張され、ビジュアル的な移動機能と削除機能が追加されました。これは、Motif 2.0 CSText ウィジェット以降の機能です。Motif 2.1 の 標準の Text および TextField では、論理的順序と物理的順序は区別されません。「次 (next)」および「前方 (forward)」は、「右へ」を意味し、「前 (previous)」および「後方 (backward)」は「左へ」を意味します。一方、CSText ではこれらは区別されており、物理名だけを用いる一連の動作が新たに定義されています。これらには、left-character()、delete-right-word() などがあります。これらの処理ルーチンはすべてウィジェットの XmNlayoutDirection に依存するように定義されていて、適切な「次の - (next -)」または「前の - (previous -)」の動作が呼び出されます。
Xm CTL の拡張は CSText の場合よりも多少複雑です。Xm CTL の拡張は、ウィジェットのグローバルな方向だけでなく、擬似 XOC (中立的安定を含む) により決定されるカーソルの周囲の物理文字の個々の方向性にも依存します。
新しいリソース名により、選択基準を決定し、レンディションのタグを提供し、そろえ方を決定することができます。
新しい Xm CTL の動作は、{Move,Delete,Kill} と {Left,Right} と {Character,Word} を一つに合成したような動作になっています。次の表に、動作のセットを示します。
表 6–2 Xm CTL の新しいリソース
名前 |
クラス/タイプ |
アクセス |
デフォルト値 |
---|---|---|---|
XmNrenditionTag |
XmCRenditionTag/XmRString |
CSG |
XmFONTLIST_DEFAULT_TAG |
XmNalignment |
XmCAlignment/XmRAlignment |
CSG |
XmALIGNMENT_BEGINNING |
XmNeditPolicy |
XmCEditPolicy/XmREditPolicy |
CSG |
XmEDIT_LOGICAL |
このウィジェットに対して使用される XmRendition のレンディションタグを指定します。XmRendition は XmNrenderTable リソースに含まれます。
ウィジェット内で使用されるテキストのそろえ方を指定します。XmALIGNMENT_END と XmALIGNMENT_CENTER だけがサポートされています。
ウィジェットに対して使用される編集の基準を XmEDIT_LOGICAL または XmEDIT_VISUAL として指定します。XmEDIT_VISUAL を指定すると、選択、カーソル移動、および削除は視覚的に行われます。このリソースを設定すると、同時に標準のキーボード操作の変換規則および削除イベントも、新しい「視覚的」な動作リストまたは既存の論理動作に変更されます。
forward-cell() と backward-cell() は、指定された方向にある文字の向きの問い合わせを行います。たとえば、方向が左から右ならば、これらの動作は対応する形式として next-/forward- または previous-/ backward- を呼び出します。
Layout Services 変換の OutToInp および Property バッファ(入れ子のレベル用) を使用して、文字の向きを決定します。したがって、ウィジェットの動作は各ロケール固有の変換に依存します。OutToInp や Property バッファの情報が正しくないと、ウィジェットが予想外の動作を行うことがあります。特に、Property バッファの情報は大きく影響します。ロケール固有のモジュールがこの仕様の適用範囲から外れている場合、同じテキスト、アプリケーション、リソース値、および LayoutObject 構成に対して行われる双方向の編集動作が、プラットフォームによって異なる場合があります。
ビジュアルモードの動作はセルベースの動作を表示します。論理モードの動作は論理的な文字ベースの動作を生じます。たとえば、delete-right-character() 操作では、ディスプレイセルに対応した入力バッファの文字が削除されます。つまり、LayoutObject 変換の「プロパティ」バイトの「新しいセルのインジケータ」が 1 に設定されている入力バッファの文字 1 個、および「新しいセルのインジケータ」が 0 である後続のすべての文字が消去されます。
Property バッファの詳細については、『CAE Specification 』の m_transform_layout() の仕様を参照してください。
同様に、backward-character() では入力バッファ内で挿入点が 1 つ前に移動します。これに伴い、カーソルは出力バッファ内で関連付けられた文字に対応する表示上の位置に再描画されます。したがって、複合表示セル上を移動するにはキーストロークを繰り返す必要があります。区別的発音符または合字など、「新しいセルのインジケータ」が 0 の入力バッファ文字を横切って挿入点が移動するため、カーソルの表示位置は実際には変化しません。
この動作は、削除動作が論理/入力バッファ側から実行されるか、物理的/出力側の表示セルレベルから実行されることを意味します。入力バッファと出力バッファの間には 1 対 1 の対応関係が存在しないため、綿密な意味での 1 文字単位の削除モードは存在しません。たとえば、1 つの物理文字が論理文字の一部分だけを表しているような場合が考えられます。
XmText の動作ルーチンを以下に示します。
XmNeditPolicy が XmEDIT_LOGICAL で、引数なしで呼び出された場合、挿入カーソルは 1 論理文字分だけ前に移動します。挿入カーソルが行の先頭にある場合、1 つ前の行があればその行の最後の論理文字に移動します。1 つ前の行が存在しない場合には、カーソル位置は変化しません。
XmNeditPolicy が XmEDIT_VISUAL ならば、カーソルは 1 つ左に移動します。挿入カーソルが行の先頭にある場合、1 つ前の行があればその行の最後の論理文字に移動します。
extend 引数を指定して left-character() が呼び出されると、現在の選択範囲を延長させながら、引数なしの場合と同じように挿入カーソルを移動します。
left-character() 動作は、reason の値として XmCR_MOVING_INSERT_CURSOR を用いて XmNmotionVerifyCallback プロシージャを呼び出します。また、extend 引数を指定して呼び出された場合、この動作により XmNgainPrimaryCallback プロシージャへの呼び出しが発生する場合があります。詳細については、『Motif Programmer's Reference』のコールバックに関する説明を参照してください。
XmNeditPolicy が XmEDIT_LOGICAL で、引数なしで呼び出された場合、挿入カーソルは 1 論理文字分だけ次に移動します。挿入カーソルが行の論理的な最後尾にある場合、次の行があればその行の論理的な先頭に挿入カーソルを移動します。
XmNeditPolicy が XmEDIT_VISUAL ならば、カーソルは 1 つ右に移動します。挿入カーソルが行末にある場合、次の行があればその行の先頭に移動します。
extend 引数を指定して 呼び出された場合、XmNeditPolicy は、現在の選択範囲を延長させながら、引数なしの場合と同じように挿入カーソルを移動します。
right-character() 動作は、reason の値として XmCR_MOVING_INSERT_CURSOR を用いて XmNmotionVerifyCallback プロシージャを呼び出します。また、extend 引数を指定して呼び出された場合、この動作により XmNgainPrimaryCallback プロシージャへの呼び出しが発生する場合があります。詳細については、『Motif Programmer's Reference』のコールバックに関する説明を参照してください。
XmNeditPolicy が XmEDIT_LOGICAL で、引数なしで呼び出された場合、挿入カーソルは次の論理ワードの開始位置に移動します。次の論理ワードが存在しない場合には、現在のワードの論理的な最後尾に挿入カーソルを移動します。挿入カーソルが行の論理的な最後尾にあるか、行の論理的な最後のワード内にある場合、挿入カーソルは次の行の論理的な先頭ワードに移動します。次の行が存在しない場合には、現在のワードの論理的な最後尾に挿入カーソルを移動します。
XmNeditPolicy が XmEDIT_VISUAL で、right-word() が引数なしで呼び出された場合、右側または行末以降の最初の白い空白文字の後の、白以外の最初の空白文字に挿入カーソルを移動します。
extend 引数を指定して 呼び出された場合、現在の選択範囲を延長させながら、引数なしの場合と同じように挿入カーソルを移動します。
left-character() 動作は、reason の値として XmCR_MOVING_INSERT_CURSOR を用いて XmNmotionVerifyCallback プロシージャを呼び出します。また、extend 引数を指定して呼び出された場合、この動作により XmNgainPrimaryCallback プロシージャへの呼び出しが発生する場合があります。詳細については、『Motif Programmer's Reference』のコールバックに関する説明を参照してください。
XmNeditPolicy が XmEDIT_LOGICAL ならば、delete-previous-char() と同じです。XmNeditPolicy が XmEDIT_VISUAL ならば、次のようになります。すなわち、通常モードで範囲が選択されている場合は、選択された部分が削除されます。範囲が選択されていない場合は、この動作により、挿入カーソルの左側の 1 文字が削除されます。追加モードで、選択されている範囲がある場合は、カーソルは選択範囲から切り離されず、XmNpendingDelete が True に設定され、選択された部分が削除されます。範囲が選択されていない場合は、挿入カーソルの左側の1 文字が削除されます。結果が選択内容に影響を与える場合があります。
delete-left-character() 動作は、reason の値として XmCR_MODIFYING_TEXT_VALUE を用いて XmNmodifyVerifyCallback プロシージャを呼び出します。また、 reason の値として XmCR_VALUE_CHANGED を用いて XmNvalueChangedCallback プロシージャを呼び出します。
XmNeditPolicy が XmEDIT_VISUAL ならば、delete-next-character() と同じです。XmNeditPolicy が XmEDIT_VISUAL ならば、次のようになります。すなわち、通常モードで範囲が選択されている場合は、選択された部分が削除されます。範囲が選択されていない場合は、挿入カーソルの右側の 1 文字が削除されます。追加モードで、選択されている範囲がある場合は、カーソルは選択範囲から切り離されず、XmNpendingDelete が True に設定され、選択された部分が削除されます。範囲が選択されていない場合は、挿入カーソルの右側の 1 文字が削除されます。この動作が選択内容に影響を与える場合があります。
delete-right-character() 動作は、reason の値として XmCR_MODIFYING_TEXT_VALUE を用いて XmNmodifyVerify-Callback プロシージャを呼び出します。また、reason の値として XmCR_VALUE_CHANGED を用いて XmNvalue-ChangedCallback プロシージャを呼び出します。
文字合成、合字、区別的発音符などをサポートするため、セルベースのルーチンが提供されています。つまり、1 個のプレゼンテーションセルを占有する 1 個のグリフを用いて、複数の文字を表すことができます。
XmText セルの動作ルーチンを以下に示します。
1 セル分、挿入カーソルを前に移動します。XmNeditPolicy が XmEDIT_LOGICAL ならば、現在のセルよりも論理的に 1 つ前のセルの先頭に挿入カーソルが移動します。1 つ前のセルが存在しない場合には、挿入カーソルは現在のセルの先頭に移動します。
XmNeditPolicy が XmEDIT_VISUAL ならば、カーソルはその左側のセルの先頭に移動します。prev-cell() 動作は、reason の値として XmCR_MOVING_INSERT_CURSOR を用いて XmNmotionVerifyCallback プロシージャを呼び出します。また、extend 引数を指定して呼び出された場合、この動作により XmNgainPrimaryCallback プロシージャへの呼び出しが発生する場合があります。詳細については、『Motif Programmer's Reference』のコールバックに関する説明を参照してください。
論理的な次のセルの始点に挿入カーソルを移動します。次のセルが存在しない場合には、現在のセルの最後尾にカーソルを移動します。XmNeditPolicy が XmEDIT_LOGICAL ならば、次のセルにカーソルを移動します。
XmNeditPolicy が XmEDIT_VISUAL ならば、カーソルはその右側のセルの先頭に移動します。右側にセルが存在しない場合、カーソルは現在のセルの最後尾に移動します。forward-cell() 動作は、reason の値として XmCR_MOVING_INSERT_CURSOR を用いて XmNmotionVerifyCallback プロシージャを呼び出します。また、extend 引数を指定して呼び出された場合、この動作により XmNgainPrimaryCallback プロシージャへの呼び出しが発生する場合があります。詳細については、『Motif Programmer's Reference』のコールバックに関する説明を参照してください。
XmTextFieldGetLayoutModifier() は、レイアウト修飾子の文字列を返します。返された文字列はレンディションに用いられるレイアウトオブジェクトの状態を示します。
XmTextFieldGetLayoutModifier() の構文は次のとおりです。
#include <Xm/TextF.h> string XmTextFieldGetLayoutModifier (Widget widget)
XmTextFieldGetLayoutModifier() ウィジェットに関連付けられたレンディションに関連して、現在のレイアウトオブジェクトに設定されている値を読み込みます。レイアウトオブジェクト修飾子の値が簡易関数を用いて変更された場合、XmTextFieldGetLayoutModifier 関数は、変更された値だけでなく、レイアウトオブジェクトに関するすべての状態を返します。
XmTextFieldGetLayoutModifier() はレイアウトオブジェクト修飾子の値を文字列として返します。
XmTextGetLayoutModifier() は、レイアウト修飾子の文字列を返します。返された文字列はレンディションに用いられるレイアウトオブジェクトの状態を示します。
XmTextGetLayoutModifier() の構文は次のとおりです。
#include <Xm/Text.h>String XmTextGetLayoutModifier( Widget widget )
XmTextGetLayoutModifier ウィジェットに関連付けられたレンディションに関連して、現在のレイアウトオブジェクトに設定されている値を読み込みます。レイアウトオブジェクト修飾子の値が簡易関数を用いて変更された場合、XmTextGetLayoutModifier 関数は、変更された値だけでなく、レイアウトオブジェクトに関するすべての状態を返します。
XmTextGetLayoutModifier はレイアウトオブジェクト修飾子の値を文字列として返します。
XmTextFieldSetLayoutModifier() 関数を設定することにより、レイアウト修飾子の値を設定して、レンディションに用いられるレイアウトオブジェクトの状態を変更することができます。
XmTextFieldSetLayoutModifier() の構文は次のとおりです。
#include <Xm/TextF.h> \ void XmTextFieldSetLayoutModifier(Widget \ widgetstring layout_modifier)
XmTextFieldSetLayoutModifier は、ウィジェットに関連付けされたレンディションに関連して、レイアウトオブジェクトの設定値を変更します。レイアウトオブジェクトの修飾子の値が簡易関数を用いて変更された場合、入力パラメータに指定された属性だけが変更されます。その他の属性は影響を受けません。
XmTextSetLayoutModifier() 関数を設定することにより、レイアウト修飾子の値を設定して、レンディションに用いられるレイアウトオブジェクトの状態を変更することができます。
XmTextSetLayoutModifier() の構文は次のとおりです。
#include <Xm/Text.h>void XmTextSetLayoutModifier( Widget widget ,string layout_modifier)
XmTextSetLayoutModifier は、ウィジェットに関連付けされたレンディションに関連して、レイアウトオブジェクトの設定値を変更します。レイアウトオブジェクトの修飾子の値が簡易関数を用いて変更された場合、入力パラメータに指定された属性だけが変更されます。その他の属性は影響を受けません。
XmStringDirectionCreate は、複合文字列を作成します。
XmTextSetLayoutModifier() の構文は次のとおりです。
#include <Xm/Xm.h>XmString XmStringDirectionCreate( direction) XmStringDirection direction
XmStringDirectionCreate は 1 個のコンポーネントを持つ複合文字列を、方向を指定して作成します。一方、XmNlayoutDirection リソースは、文字列の方向を指定するコンポーネントを持たないすべての複合文字列 (XmString) に対してデフォルトのレンダリング方向を設定します。したがって、XmNlayoutDirection リソースに対して適切な値を設定するだけで、レイアウト方向を設定できます。特定の方向コンポーネントを持つ複合文字列を作成する必要はありません。
アプリケーションにおいて XmString がレンダリングされる場合、その文字列が方向 (XmStringDirection) を明示して作成されたかどうかが確認されます。アプリケーションに方向コンポーネントが提供されない場合、アプリケーションは XmNlayoutDirection リソースの値から現在のウィジェットを確かめ、その値を XmString のデフォルトのレンダリング方向として使用します。