共通デスクトップ環境 Dtksh ユーザーズ・ガイド

メイン・スクリプト

スクリプトの残りは、C プログラムの Main() と同等なものです。Xt イントリンシクスを初期化し、script_find ウィンドウで使用されているすべてのウィジェットを作成します。1 行目にある set -f は、パス名にあるワイルドカード文字の拡張を禁止するように dtksh に通知します。これは、find コマンドがこの拡張を実行できるようにするために必要です。

script_find ウィンドウ (図 4-4 参照) は、4 つの領域から成る Form ウィジェットです。領域は Separator ウィジェットによってマークされ、各領域にはいくつかのウィジェットがあり、それらはすべて Form の子になります。

図 4-4 script_find ウィンドウにあるウィジェット

Graphic

ウィジェットは、上部から下部に順番に領域ごとに作成されます。

初期化

初期化は、次のように Xt イントリンシクス関数 XtInitialize によって行われます。

XtInitialize TOPLEVEL find Dtksh $0 "${@:-}"

これにより、次に作成される Form ウィジェットの親として機能するトップレベルのシェルを作成します。

Form ウィジェットの作成

Form ウィジェットは、メインの親ウィジェットとして使用されます。Form は、ユーザがその子に制約を課することができるようにする Manager ウィジェットです。script_find メイン・ウィンドウにあるほとんどのウィジェットは、Form の子です。ウィジェットの残りの部分の作成についての記述は、ウィンドウの 4 つの領域 (図 4-4 参照) ごとに分かれています。

1 番目の領域

1 番目の領域は、2 つの Label ウィジェットと 2 つの TextField ウィジェット、および1 番目と 2 番目の領域を分割する Separator ウィジェットから成ります。

図 4-5 script_find ウィンドウの 1 番目の領域

Graphic

次のコード・セグメントは、1 番目の Label ウィジェットを作成してから位置付け、DtkshAnchorTop 簡易関数と DtkshAnchorLeft 簡易関数を使用して Form 内にそのウィジェットを位置付けます。

XtCreateManagedWidget SDLABEL sdlabel XmLabel $FORM ¥
   labelString:"Search Directory:" ¥
   $(DtkshAnchorTop 12) ¥
   $(DtkshAnchorLeft 10)

次のコード・セグメントは、1 番目の TextField ウィジェットを作成してから位置付けます。このウィジェットは、Form ウィジェットと Label ウィジェットの両方に関連のある場所に位置付けられるので注意してください。

XtCreateManagedWidget SD sd XmText $FORM ¥
   columns:30 ¥
   value:"." ¥
   $(DtkshAnchorTop 6) ¥
   $(DtkshRightOf $SDLABEL 10) ¥
   $(DtkshAnchorRight 10) ¥
   navigationType:EXCLUSIVE_TAB_GROUP  
XmTextFieldSetInsertionPosition $SD 1

残りの Label ウィジェットと TextField ウィジェットも同じ方法で作成されます。

Separator ウィジェットは、Form ウィジェットの子として作成され、2 番目の TextField ウィジェットの下に位置付けられます。

XtCreateManagedWidget SEP sep XmSeparator $FORM ¥
   separatorType:SINGLE_DASHED_LINE ¥
   $(DtkshUnder $FNP 10) ¥
   $(DtkshSpanWidth)

2 番目の領域

2 番目の領域は、RowColumn ウィジェットと 5 つの ToggleButton ウィジェット、および 1 番目のとは別の Separator ウィジェットから成ります。

図 4-6 script_find ウィンドウの 2 番目の領域

Graphic

ガジェットは、その属性の多くをその親に依存するウィジェットなので、メモリ・リソースを節約できます。

RowColumn ウィジェットは、Form ウィジェットの子として作成され、1 番目の領域で作成された Separator ウィジェットの直下に位置付けられます。

XtCreateManagedWidget RC
rc XmRowColumn $FORM ¥
         orientation:HORIZONTAL ¥
         numColumns:3 ¥
         packing:PACK_COLUMN ¥
   $(DtkshUnder $SEP 10) ¥
   $(DtkshSpanWidth 10 10) ¥ 
   navigationType:EXCLUSIVE_TAB_GROUP

5 つの ToggleButton ガジェットは、次のように簡易関数 DtkshAddButtons を使用して RowColumn の子として作成されます。

DtkshAddButtons -w $RC XmToggleButtonGadget ¥
   T1 "Cross Mount Points"           ""¥
   T2 "Print Matching Filenames"     ""¥
   T3 "Search Hidden Subdirectories" ""¥
   T4 "Follow Symbolic Links"        ""¥
   T5 "Descend Subdirectories First" ""

1 番目とは別の Separator が次に作成され、2 番目と 3 番目の領域を分割します。この Separator ウィジェット ID は SEP2 と呼ばれていますので注意してください。

XtCreateManagedWidget SEP2 sep XmSeparator $FORM ¥
   separatorType:SINGLE_DASHED_LINE ¥
   $(DtkshUnder $RC 10) ¥
   $(DtkshSpanWidth)

3 番目の領域

3 番目の領域は、2 つのオプション・メニューともう一つの Separator ウィジェットから成ります。

図 4-7 script_find ウィンドウの 3 番目の領域

Graphic

オプション・メニューは、プルダウン・メニューです。オプション・メニュー・ボタンをクリックすると、多数の選択肢のあるメニュー区画が表示されます。適切な選択肢へポインタをドラッグし、マウス・ボタンを離してください。メニュー区画が消え、オプション・メニュー・ボタン・ラベルが新規の選択肢を表示します。

最初のオプション・メニューのメニュー区画は、多数のプッシュ・ボタン・ガジェットから成り、find コマンドに強制するさまざまな制限を表示します。

XmCreatePulldownMenu PANE $FORM pane  
DtkshAddButtons -w $PANE XmPushButtonGadget ¥
   NODIR "no restrictions" ""¥
   NFS   "nfs"             ""¥
   CDFS  "cdfs"            ""¥
   HFS   "hfs"             "" 
Next, the Option Menu button itself is created and managed, with the 
menu pane just created ($PANE) identified as a subMenuId:  
XmCreateOptionMenu FSTYPE $FORM fstype ¥
         labelString:"Restrict Search To File System Type:" ¥
         menuHistory:$NODIR ¥
         subMenuId:$PANE ¥
   $(DtkshUnder $SEP2 20) ¥
   $(DtkshSpanWidth 10 10) ¥
   navigationType:EXCLUSIVE_TAB_GROUP  
XtManageChild $FSTYPE

2 番目のオプション・メニュー・ボタンも同じ方法で作成されます。このボタンは find コマンドにさらに制限を加えます。

3 番目のセパレータは、他のセパレータと同じ方法で作成されます。

4 番目の領域

4 番目の領域は、Form ウィジェットの子である 4 つのプッシュ・ボタンから成ります。

Graphic

4 つのプッシュ・ボタンは次のように使用されます。

プッシュ・ボタンは、それぞれ別にラベル付けされますが、他のウィジェットのボタンとほとんど同じ方法で作成され、位置付けられます。次のコード・セグメントは [了解] プッシュ・ボタンの作成方法を示します。

XtCreateManagedWidget OK ok XmPushButton $FORM ¥
         labelString:"Ok" ¥
   $(DtkshUnder $SEP3 10) ¥
   $(DtkshFloatLeft 4) ¥
   $(DtkshFloatRight 24) ¥
   $(DtkshAnchorBottom 10)  
XtAddCallback $OK activateCallback "OkCallback"

オペレーティング・パラメータの設定

XtSetValues は、最初のオペレーティング・パラメータのいくつかを設定するために使用されます。

XtSetValues $FORM ¥
   initialFocus:$SD ¥
   defaultButton:$OK ¥
   cancelButton:$CLOSE ¥
   navigationType:EXCLUSIVE_TAB_GROUP

次の行は、リターン・キーを押しても Form 内のデフォルト・ボタンを起動しないように TextField ウィジェットを構成しています。その使用の詳細は、付録 B 「dtksh 簡易関数」EXCLUSIVE_TAB_GROUP についての説明を参照してください。

DtkshSetReturnKeyControls $SD $FNP $FORM $OK

認識とループ

スクリプトの最後の 3 行は、script_find ウィンドウの前の値をロードし、トップレベルのウィジェットを認識し、次にユーザ入力を待っているループに入ります。

LoadStickyValues        

XtRealizeWidget $TOPLEVEL
XtMainLoop