デスクトップ Korn シェル (dtksh) は、既存の Xt および Motif のほとんどの関数に容易にアクセスできる K シェル・スクリプトを提供します。dtksh は、ksh-93 に基づいています。ksh-93 は、シェル・プログラマ用の強力なツールおよびコマンドのセットを提供し、K シェル・プログラミング・コマンドの標準セットをサポートするものです。
dtksh は、ksh-93 が提供する機能およびコマンドのすべてをサポートします。さらに dtksh は、選び抜かれた数多くの libDt 関数、ウィジェット関連の Motif 関数の大部分、Xt イントリンシクス関数の大きなサブセット、および Xlib 関数の小さなサブセットもサポートします。サポートされるすべての関数のリストが付録 A「dtksh コマンド」 にあります。
この節では、dtksh を使用して Motif アプリケーションを作成する方法について説明します。dtksh を使いこなすには、Xlib、Xt イントリンシクス、Motif のウィジェット、および Korn シェル・プログラミングに対する経験が必要です。また、C プログラミング言語の知識も役に立ちます。これらのどれにもなじみがない場合は、必要と思われる適切なマニュアルを参照してください。これらのシステムに精通している場合でも、適切なマニュアル・ページにアクセスして、関連内容を参照してください。
libDtHelp
libDtSvc
libX11
libXm
libXt
libtt
リソースはウィジェットの変数のことで、サイズ、位置、またはカラーといった属性の定義に使用します。各ウィジェットが持つリソースは通常、自身のリソースと、より高いレベルのウィジェットから引き継ぐリソースとが組み合わさったものです。Xt イントリンシクスおよび Motif のリソース名は接頭辞 (XtN または XmN) を持ち、その後にベース名が続きます。ベース名の最初の文字は常に小文字で、その後のベース名内の単語の最初の文字は常に大文字です。dtksh スクリプトでは、接頭辞を削除して、残ったベース名がリソース名になります。したがって、リソース XmNtopShadowColor は topShadowColor になります。
Xt および Motif のコマンドの中には、シェル・スクリプトがリソースと、リソース値のペアを表すパラメータの変数を渡せるものがあります。これは、引き数が関連する Xt または Motif の C 関数に渡されるのと似ています。この例としては、ウィジェットの作成に使用するコマンドと XtSetValues コマンドがあります。dtksh において、リソースは、次の構文で指定されます。
resource:value
この resource はリソース名で、value はリソースに割り当てられる値です。dtksh は、自動的に value 文字列を適切な内部表現に変換します。たとえば、次のとおりです。
XtSetValues $WIDGET height:100 width:200 resizePolicy:RESIZE_ANY XmCreateLabel LABEL $PARENT myLabel labelString:"Close Dialog"
XtGetValues を使用してウィジェット・リソース値を読み取る場合、戻り値は環境変数に設定されます。したがって、Xt イントリンシクスとは異なり、dtksh 版の XtGetValues は、名前:値ペアの形式ではなく、名前:(環境)変数ペアの形式を使用します。たとえば、次のとおりです。
XtGetValues $WIDGET height:HEIGHT resizePolicy:POLICY sensitive:SENSITIVE echo $HEIGHT echo $POLICY echo $SENSITIVE
上記の dtksh セグメントは、次の出力を行います。
100 RESIZE ANY TRUE
ある種のリソース値 (文字列テーブルやビット・マスクなどを含む) は、特殊な表現になります。たとえば、リスト・ウィジェットでは、文字列テーブルに items と selectedItems の両方のリソースの指定が可能です。dtksh では、文字列テーブルは、カンマで区切られた文字列リストで表現され、これは Motif の場合と似ています。文字列テーブルを返すリソースが XtGetValues による問い合わせを受けた場合、その結果としての値は、カンマで区切られた文字列セットになります。
ビット・マスク値が渡されるリソースは、そのマスクが、| (バー) で区切られたさまざまなマスク値から成る文字列として指定されていることを要求します。ビット・マスクを返すリソースが問い合わせを受けた場合、戻り値は、ビットを表す文字列 (カンマで区切られている) になります。たとえば、次のコマンドを使用して、VendorShell ウィジェット・クラスの mwmFunctions リソースを設定できます。
XtSetValues mwmFunctions: MWM_FUNC_ALL|MWM_FUNC_RESIZE
dtksh は、Motif リソースのほとんどをサポートしています。次のリストは、サポートしていないリソースのリストです。* (アスタリスク) の付いているリソースは、ウィジェット作成時に XtSetValues を使用して指定できるが、XtGetValues を使用しての取得はできません。
すべてのウィジェットおよびガジェットのクラス
任意の fontlist リソース *
任意の pixmap リソース *
コンポジット
insertPosition
children
コア
accelerators
translations *
colormap
XmText:
selectionArray
selectionArrayCount
ApplicationShell:
argv
WMShell:
iconWindow
windowGroup
Shell:
createPopupChildrenProc
XmSelectionBox:
textAccelerators
Manager、Primitive、および Gadget サブクラス
userData
XmFileSelectionBox:
dirSearchProc
fileSearchProc
qualifySearchDataProc
Dtksh という名前の dtksh app-defaults ファイルは、次のパスで示した場所にあります。
/usr/dt/app-defaults/<LANG>
この app-defaults ファイルに納められている唯一の情報は、標準 Dt ベースの app-defaults ファイルに納められているものです。dtksh app-defaults ファイルの中身は、次のとおりです。
#include "Dt"
Dt ファイルもまた、/usr/dt/app-defaults/<LANG> にあり、次のとおりです。
*foregroundThreshold: 70 !### !# !# Help system specific resources !# !### !# !# Display Area Colors !# !# These resources set the colors for the display area(where !# actual help text is displayed). The resources are complex !# because they have to override the standard color resources !# in all cases. !# *XmDialogShell.DtHelpDialog*DisplayArea.background: White *XmDialogShell*XmDialogShell.DtHelpDialog*DisplayArea.background: White *XmDialogShell.DtHelpDialog*DisplayArea.foreground: Black *XmDialogShell*XmDialogShell.DtHelpDialog*DisplayArea.foreground: Black !# !# Menu Accelerators !# !# The following resources establish keyboard accelerators !# for the most frequently accessed menu commands. !# *DtHelpDialogWidget*searchMenu.keyword.acceleratorText: Ctrl+I *DtHelpDialogWidget*searchMenu.keyword.accelerator: Ctrl<Key>i *DtHelpDialogWidget*navigateMenu.backTrack.acceleratorText: Ctrl+B *DtHelpDialogWidget*navigateMenu.backTrack.accelerator: Ctrl<Key>b *DtHelpDialogWidget*navigateMenu.homeTopic.acceleratorText: Ctrl+H *DtHelpDialogWidget*navigateMenu.homeTopic.accelerator: Ctrl<Key>h *DtHelpDialogWidget*fileMenu.close.acceleratorText: Alt+F4 *DtHelpDialogWidget*fileMenu.close.accelerator: Alt<Key>f4
この節では、dtksh app-defaults ファイル内のいくつかの変数の値の型について説明します。
X、Xt、および Motif のインタフェースの C バインディングにおいて、文字列でない値 (ヘッダ・ファイルで定義されている) が多く見られます。このような値の一般的な形式は、Xt または Xm の接頭辞の後に説明的な名前が続く形式になっています。たとえば、フォーム・ウィジェットの子の制約値の 1 つとして、XmATTACH_FORM があります。dtksh では、接頭辞を取り去ったものが同等の値になり、Motif のデフォルト・ファイルで指定する値と全く同じです。
XmDIALOG_COMMAND_TEXT は DIALOG_COMMAND_TEXT になります。
XtATTACH_FORM は ATTACH_FORM になります。
dtksh コマンドへのパラメータとして、True または False の語 (大文字小文字は関係ありません) を使用してブール値を指定できます。結果としてのブール値は、true または false のいずれか (すべて小文字を使用) が返されます。
dtksh のグラフィカル・コマンドは、対応する C 関数の定義に基づいて、次の 4 つのカテゴリに分類されます。
関数は Void で、値を返しません。例: XtMapWidget()
関数は Void ですが、関連するパラメータを介して 1 つ以上の値を返します。
例: XmGetColors()
関数は、非ブール値を返します。例: XtCreateManagedWidget()
関数は、ブール値を返します。例: XtIsSensitive()
dtksh のカテゴリ 1 のコマンドは、対応する C 関数の呼び出しシーケンスに従います。パラメータの数や順序に関しては、関数の標準マニュアルを参照してください。
XtMapWidget $FORM
dtksh のカテゴリ 2 のコマンドも、一般的に対応する C 関数の呼び出しシーケンスに従います。変数へのポインタを渡す代わりに、環境変数の値を返します。
XmGetColors $FORM $BG FOREGROUND TOPSHADOW BOTTOMSHADOW SELECT echo "Foreground color = " $FOREGROUND
dtksh のカテゴリ 3 のコマンドは、対応する C 関数とは多少異なります。C 関数がその値をプロシージャ・コールの値として返すのに対して、dtksh コマンドは追加のパラメータを要求します。このパラメータは、戻り値として置かれている環境変数の名前で、常に最初のパラメータになります。
XmTextGetString TEXT_VALUE $TEXT_WIDGET echo "The value of the text field is "$TEXT_VALUE
dtksh のカテゴリ 4 のコマンドは、C の場合と全く同様の条件付き式で使用できる値を返します。C 関数がリファレンス変数 (カテゴリ 2 と同じ) を介して値を返すと、dtksh コマンドもまた、対応するパラメータの変数名を使用します。
if XmIsTraversable $PUSH_BUTTON; then echo "The pushbutton is traversable" else echo "The pushbutton is not traversable" fi
一般に、コマンドに渡されるパラメータの順序と型は、対応する C 関数に渡されるものと一致します。ただし、カテゴリ 3 のコマンドのところで記述したものは例外です。
カテゴリ 3 のコマンドの多くは、コマンドへの最初のパラメータとして指定する環境変数を使用して 1 つの値を返します (これらの特殊なコマンドに対する最初のパラメータは、variable という名前です)。この戻り値がすぐに式で使用されると、変数名の代わりに、特殊環境変数 "-" が使用される場合があります。dtksh が、戻り値が返される環境変数の名前として "-" を認識すると、代わりにコマンドの値としてその結果を返します。これによりシェル・スクリプトは、そのコマンド呼び出しを別のコマンド呼び出しに埋め込むことができます。この機能は、単一の値を返すコマンドにだけ働き、その値は最初のパラメータに返されます。たとえば、次のとおりです。
XtDisplay DISPLAY $FORM XSync $DISPLAY true
上記は、次のように置換できます。
XSync $(XtDisplay "-" $FORM) true
$DISPLAY のリファレンスは、XtDisplay の呼び出しが返す値で置換されます。
これは、次の例外を除くすべてのカテゴリ 3 のコマンドに有効です。例外となるのは、ウィジェットを作成するコマンド、複数の値を返すコマンド、および最初のパラメータが名前の付いていない変数であるコマンドです。"-" を環境変数名として受け入れないコマンドには、次のようなものがあります。
XtInitialize()
XtCreateApplicationShell()
XtCreatePopupShell()
XtCreateManagedWidget()
XtCreateWidget()
次の形式のすべてのコマンド
XmCreate...()
次の形式のほとんどのコマンド
tt_...()
dtksh スクリプトは、Xlib、Xt、Motif、または libDt コマンドのいずれかを呼び出す前に、まず Xt イントリンシクスを初期化しなければなりません。これは、XtInitialize コマンドを呼び出して行います。このコマンドは、アプリケーション・シェル・ウィジェットを返します。ウィジェット ID を返すすべての dtksh コマンドが真であるように、XtInitialize は、最初の引き数である環境変数にそのウィジェット ID を返します。
XtInitialize TOPLEVEL myShellName Dtksh $0 "$@"
とすると、ウィジェット ID は環境変数 TOPLEVEL に返されます。
dtksh はデフォルトの app-defaults ファイルを提供し、このファイルは、XtInitialize の呼び出しで Dtksh のアプリケーション・クラス名を指定した場合に使用されます。また、この app-defaults ファイルには、デスクトップ・アプリケーションのデフォルト値の標準セットが格納されているので、dtksh アプリケーションと他のデスクトップ・アプリケーションとの外見的な一貫性を保つことができます。
ウィジェット作成に使用できるいくつかのコマンドは、次のとおりです。
管理されないウィジェットを作成します。
これらのコマンドにはそれぞれ、従わなければならない特定の形式があります。たとえば、管理されないプッシュ・ボタン・ウィジェットをトップレベル・ウィジェットの子として作成したいと仮定します。XtCreateWidget か XmCreatePushButton のどちらかを使用できます。これらのコマンドの形式は、次のとおりです。
XtCreateWidget variable name widgetclass $parent [resource:value ...]
XmCreatePushButton variable $parent name [resource:value ...]
プッシュ・ボタン・ウィジェットを作成する実際のコマンドは、次のとおりです。
XtCreateWidget BUTTON button XmPushButton $TOPLEVEL XmCreatePushButton BUTTON $TOPLEVEL button
上記のそれぞれのコマンドは、全く同じ動作 (管理されないプッシュ・ボタンの作成) をします。リソース値は設定されていないことに注意してください。プッシュ・ボタンのバックグラウンドの色を赤、フォアグラウンドの色を黒にしたいと仮定します。これらのリソース値を次のように設定できます。
XtCreateWidget BUTTON button XmPushButton $TOPLEVEL ¥ background:Red ¥ foreground:Black XmCreatePushButton BUTTON $TOPLEVEL button¥ background:Red ¥ foreground:Black
ウィジェットを作成する C 関数のすべてが、ウィジェット ID または ID を返します。対応する dtksh コマンドは、ウィジェット ID と同じ環境変数を設定します。これらはカテゴリ 3 コマンドで、その最初の引き数は、ウィジェット ID が戻る環境変数の名前です。ウィジェット ID は、dtksh が実際のウィジェット・ポインタにアクセスするために使用する ASCII 文字です。次のどちらかのコマンドで、新規フォーム・ウィジェットを作成できます。ただし、どちらの場合も、新規フォーム・ウィジェットのウィジェット ID が環境変数 FORM に返されます。
どちらかのコマンドを実行した後、$FORM を使用して新規フォーム・ウィジェットを参照できます。たとえば、次のコマンドを使用して、新規フォーム・ウィジェット内でラベル・ウィジェットを作成できます。
XmCreateLabel LABEL $FORM name¥ labelString:"Hi Mom" ¥ CH_FORM ¥ leftAttachment:ATTACH_FORM
NULL と呼ばれる特別なウィジェット ID があります。これは、シェル・スクリプトに NULL のウィジェットの指定が必要である場合に使用します。たとえば、フォーム・ウィジェットの defaultButton リソースを無効にする場合には、コマンド XtSetValues $FORM defaultButton:NULL を使用してください。
コールバックは、1 つのイベント、またはいくつか組み合わされたイベントが発生した場合に実行される関数またはプロシージャです。たとえば、コールバックは、プッシュ・ボタンが押された時、 それによって要求される結果を出すために使用されます。dtksh シェル・スクリプトにとって、特定のコールバックがウィジェットに呼び出される時に、必ず起動するようにコマンドを割り当てることは容易です。そのコマンドは、共にブロックされるコマンドの文字列、または呼び出すシェル関数名と同じくらい単純です。
アプリケーションは、関係のある条件を指定するウィジェット、およびその条件が発生した時に起こるアクションを指定するウィジェットでコールバックを登録します。コールバックは、XtAddCallback を使用して登録します。登録するアクションは、任意の有効な dtksh コマンドになります。たとえば、次のとおりです。
XtAddCallback $WIDGET activateCallback "ActivateProc" XtAddCallback $WIDGET activateCallback ¥ "XtSetSensitive $BUTTON false"
コールバックに渡されるのはコンテキスト情報で、呼び出しまでの条件を決定します。C プロシージャの場合、この情報は一般的に callData 構造体へ渡されます。たとえば、valueChangedCallback を呼び出すスケール・ウィジェットは、次のような構造を callData に渡します。
typedef struct { int reason; XEvent event; int value; }XmScaleCallbackStruct;
C アプリケーションのコールバックは、次のように動作します。
if (scaleCallData->reason == XmCR_VALUE_CHANGED) { eventType =scaleCallData->event->type; display =scaleCallData->event->xany.display; }
同様に、コールバックが dtksh で呼び出された場合、実行する前に次の特別な環境変数が設定されます。
CB_WIDGET
これは、コールバックを呼び出しているウィジェットのウィジェット ID に対して設定されます。
CB_CALL_DATA
これは、ウィジェットがコールバックに渡す callData 構造体のアドレスに対して設定されます。
CB_CALL_DATA 環境変数は構造体へのポインタを表し、そのフィールドへのアクセスには、C のそれと同様の構文を使用します。入れ子形式で環境変数が定義され、構造体のフィールドと同じ名前が付けられます (ただし、すべて大文字です)。この時、構造体の要素の内容を示すためにドットが使用されます。こうして、スケール・ウィジェットによって提供される callData へアクセスする前述の C コードは、次のように翻訳されます。
if [ ${CB_CALL_DATA.REASON} = "CR_VALUE_CHANGED" ]; then eventType=${CB_CALL_DATA.EVENT.TYPE} display=${CB_CALL_DATA.EVENT.XANY.DISPLAY} fi
同様のことが、callData 構造体内のイベント構造体の場合にも言えます。
ほとんどのコールバック構造体において、シェル・スクリプトは、特定のコールバック構造体に定義される任意のフィールドを先に記述した手法を使用して参照できます。たいていの場合、シェル・スクリプトは、これらの構造体内のフィールドを変更できません。この例外として XmTextVerifyCallbackStruct があり、テキスト・ウィジェットの losingFocusCallback、modifyVerifyCallback、および motionVerifyCallback 中では変更できます。
dtksh は、Motif でサポートしている範囲内において、この構造体内のフィールドの変更をサポートしています。コールバック構造体内の次のフィールドは、変更ができます。
CB_CALL_DATA.DOIT
CB_CALL_DATA.STARTPOS
CB_CALL_DATA.TEXT.PTR
CB_CALL_DATA.TEXT.LENGTH
CB_CALL_DATA.TEXT.FORMAT
次は、上記のフィールドの変更例です。
CB_CALL_DATA.DOIT="false"
CB_CALL_DATA.TEXT.PTR="*"
CB_CALL_DATA.TEXT.LENGTH=1