# デスクトップKornShellの紹介

デスクトップ KornShell(`ldtksh
`)は、ほとんどの既存のXtやMotif™関数に簡単にアクセスするための手段をもつ kshellスクリプトを提供します。`dtksh`は、`ksh-93`
を基にしています。 `dtksh`は、シェル・プログラマにとって有効なツールおよびコマンドのセットを 提供しており、標準的なkshellプログラミング・コマンドのセットをサポートしています。

`dtksh`は、`ksh-93`が提供しているすべての機能およびコマンドを サポートしています。 `dtksh`は、`libDt`関数の数多くの選択、ウィジェット関連の ほとんどのMotif関数、Xtイントリンシクスの多数のサブセット、Xlib関数の少数の サブセットをサポートしています。サポートされている関数のすべてのリストは、付録Aに 記載されています。

## デスクトップKornShellでMotifアプリケーションを作成するには

この節では、`dtksh`を使って、Motifアプリケーションを作成する方法
を説明します。 `dtksh`をうまく使用するには、 Xlib、Xtイントリンシクス、Motifウィジェット、 およびKornShellプログラミングの経験は必要です。Cプログラミング言語について知っていることも役に 立ちます。これらを熟知していないときは、適切なドキュメントを参照して ください。これらのシステムを熟知している場合も、適切なマニュアル・ページに アクセスし、参照してください。

システムには、以下のようなライブラリがあります。

- `libDtHelp`

- `libDtSvc`

- `libX11`

- `libXm`

- `libXt`

- `libtt`

### リソース

リソースはサイズ、位置、またはカラーなどの属性を定義するのに使用するウィジェット の変数です。通常、各ウィジェットがもつリソースは、自身のリソースにより高いレベル のウィジェットから引き継ぐリソースを加えたものです。Xtイントリンシクス およびMotifリソース名は接頭辞(`XtN`または`XmN`)の後にベース名が続く構成に 成っています。 ベース名の最初の文字は、常に小文字です。ベース名内の後続の単語の最初の文字は、 常に大文字です。`dtksh`スクリプトのリソース名は、接頭辞を 削除して、残ったベース名を使用します。 例えば`XmNtopShadowColor`は`topShadowColor`になります。

いくつかのXtおよびMotifコマンドは、シェル・スクリプトがリソースとそのiリソース値のペアを表す パラメータの変数を渡せます。
これは、引数のリストが、対応する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`を使用してウィジェットのリソース値を検索するとき、戻り値は、環境変数にi置かれます。 したがって、`dtksh`版の`XtGetValues`は、 名前と値のペアではなく、名前と(環境)変数のペアを使用します(Xtイントリンシクスと異なります)。 例えば、次のとおりです。

    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`

- `アプリケーション・シェル`:

  - `argv`

- `WMShell`:

  - `iconWindow`

  - `windowGroup`

- `シェル`:

  - `createPopupChildrenProc`

- `XmSelectionBox`:

  - `textAccelerators`

- `マネージャ`、`プリミティブ`、および`ガジェット`サブクラス:

  - `userData`

- `XmFileSelectionBox`:

  - `dirSearchProc`

  - `fileSearchProc`

  - `qualifySearchDataProc`

### dtksh app-defaultsファイル

`dtksh`の`app-defaults`ファイルは、`Dtksh`
という名前で、次のパス表示を基づいた位置にあります。

    /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`が あります。接頭辞を取り去ることによって、Motifデフォルト・ファイルで指定するのと 同等の値を、`dtksh`に指定できます。

- `XmDIALOG_COMMAND_TEXT` は、`DIALOG_COMMAND_TEXT`になります。

- `XtATTACH_FORM` は、`ATTACH_FORM`になります。

#### ブール値

`dtksh`コマンドのパラメータとしてTrueまたはFalseを使用してブール値を指定できます。 大文字、小文字は関係ありません。 結果は、trueまたはfalse(すべて小文字が使用されます。)のいずれかが返されます。

### 戻り値

`dtksh`のグラフィカル・コマンドは、対応するC関数の定義に基づいて、4つのカテゴリの １つに分類されています。

1. 関数はvoidで、値を返しません。 例:`XtMapWidget()`

2. 関数はvoidですが、関連するパラメータを通して1つ以上の値を返します。 例:`XmGetColors()`

3. 関数はブール値以外の値を返します。 例:`XtCreateManagedWidget()`

4. 関数はブール値を返します。 例: `XtIsSensitive()`

#### カテゴリ1

`dtksh`
のカテゴリ1のコマンドは、対応するC関数の呼び出しシーケンスに従います。パラメータの 数や順序は、関数の標準的なマニュアルを参照して決定してください。 例:

    XtMapWidget $FORM

#### カテゴリ2

`dtksh`
のカテゴリ2のコマンドもまた、通常、対応するC関数の呼び出しシーケンスに従います。値を返す ポインタを渡すかわりに環境変数で値を返します。 例:

    XmGetColors $FORM $BG FOREGROUND TOPSHADOW BOTTOMSHADOW SELECT
    echo “Foreground color = “ $FOREGROUND

#### カテゴリ3

`dtksh`
のコマカテゴリ3のコマンドは、対応するC関数とは少し異なります。C関数は、プロシージャ 呼び出しの値としてその値を返しますが、`dtksh`コマンドはパラメータの追加を要求 します。このパラメータは、戻り値が置かれる環境変数の名前です。常に最初のパラメータ になります。 例:

    XmTextGetString TEXT_VALUE $TEXT_WIDGET
    echo “The value of the text field is “$TEXT_VALUE

#### カテゴリ4

`dtksh`
のカテゴリ4のコマンドは、C関数と同様の条件式で使用できる値を返します。 C関数が関連する値を通して(カテゴリ2と同様です)戻り値を返すと、 `dtksh`コマンド、対応 するパラメータの変数名を使用します。 例:

    if XmIsTraversable $PUSH_BUTTON; then
    echo “The pushbutton is traversable”
    else
    echo “The pushbutton is not traversable”
    fi

一般に、カテゴリ3コマンドで記述したものを除いて、コマンドに渡されるパラメータの 順番や型は、対応するC関数に渡されるものと一致します。

### 直接戻り値

多くの
カテゴリ3のコマンドは、コマンドの最初のパラメータで指定した環境変数を 使って、1つの値を返します(これらの特別なコマンドの最初のパラメータの名前は variableです)。この戻り値が、直接、式で使用されるときは、特別な環境変数 ldquor;-„を変数名の代わりに使用することがあります。戻り値が返される 環境変数の名前が„-„であるとき、`dtksh`は、コマンドの値と して結果を返します。これにより、シェル・スクリプトはコマンド呼び出しを別の コマンド呼び出しに含めることができます。この機能は、1つの値を返すコマンドに のみ働き、その値は最初のパラメータに返されます。 例:

    XtDisplay DISPLAY $FORM
    XSync $DISPLAY true

上記は、次のように、同等の状態に置き換えることができます。

    XSync $(XtDisplay “-“ $FORM) true

`$DISPLAY`のリファレンスには、`XtDisplay`が返す値に置き換えられます。

これは、ウィジェットを作成するコマンド、複数の値を返すコマンド、最初のパラメータ が名前のない変数であるコマンドを除くすべてのカテゴリ3のコマンドで有効です。 環境変数名として„-„を受け入れないコマンドを以下に示します。

- `XtInitialize()`

- `XtCreateApplicationShell()`

- `XtCreatePopupShell()`

- `XtCreateManagedWidget()`

- `XtCreateWidget()`

- 次の形式のすべてのコマンド:

      XmCreate...()

- 次の形式のほとんどのコマンド:

      tt_...()

## Xtイントリンシクスの初期化

`dtksh`スクリプトは、Xlib、Xt、Motifまたは`libDt`コマンドを 呼び出す前に、Xtイントリンシクスを初期化しなければなりません。 Xtイントリンシクスの初期化は、`
XtInitialize`コマンドで行います。このコマンドは、 アプリケーション・シェル・ウィジェットを返します。ウィジェットIDを返す `dtksh`のコマンドのすべてがそうであるように、`XtInitialize`コマンドは、最初の引き数である 環境変数にウィジェットIDを返します。例えば、次のコマンドを実行します。

    XtInitialize TOPLEVEL myShellName Dtksh $0 “$@”

環境変数`TOPLEVEL`にウィジェットIDが返されます。

`dtksh`はデフォルトの`app-defaults`ファイルを提供します。このファイルは、 `XtInitialize`を呼び出しに、`Dtksh`ファイルを指定したとき、使用されます。 `app-defaults`ファイルは`Dt`アプリケーションのデフォルト値の標準セットを 含んでいます。そのため、`dtksh`アプリケーションは、他の`Dt`アプリケーションとの 外見と調和します。

### ウィジェットの作成

ウィジェットを作成するのに使用できるコマンドを以下に示します。

`XtCreateWidget` | 管理されないウィジェットを作成します。
`XtCreateManagedWidget` | 管理されるウィジェットを作成します。
`XtCreateApplicationShell` | アプリケーション・シェルを作成します。
`XtCreatePopupShell` | ポップアップ・シェルを作成します。
`XmCreate`< widgettypes> | 管理されないウィジェットを作成します。

これらのコマンドのそれぞれに、従わなければならない特別な形式をがあります。 例えば、トップレベル・ウィジェットの子として、管理されないプッシュ・ボタンを 作成したいとします。`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`に返されます。

- `XtCreateManagedWidget FORM name XmForm $PARENT`

- `XmCreateForm FORM $PARENT name`

これらのコマンドのどちらかを実行後、`$FORM`を使用して新規 フォーム・ウィジェットを参照できます。例えば、次のコマンドで、新規 フォーム・ウィジェット内にラベル・ウィジェットを作成できます。

    XmCreateLabel LABEL $FORM name\
    labelString:”Hi Mom” \
    CH_FORM \
    leftAttachment:ATTACH_FORM

NULLウィジェットを指定する必要がある場合に使用する、NULLと呼ばれる特別なウィジェットIDがあります。します。例えば、フォーム・ウィジェット のリソース`defaultButton`を無効にするには、次のコマンドを使用 します。 `XtSetValues``$FORM defaultButton:NULL`

## コールバックの使用

コールバックは、１つのイベントまたは複数のイベントの組合せが生じたときに実行する プッシュ・ボタン関数またはプロシージャです。例えば、コールバックは、プッシュ・ ボタンを„押した”ときに、期待する結果をだすために使用します。 `dtksh`シェル・スクリプトで、特定のコールバックがウィジェットに呼び出されるためのコマンドを割り当てるのは容易です。 そのコマンドは、ブロックされたコマンドの文字列または呼び出すシェル関数の名前で あり、単純なものです。

### コールバックの登録

アプリケーションは、関連のある状態を指定するウィジェット、その状態になった ときに生じるアクションを指定するウィジェットでコールバックを登録します。 コールバックは、`XtAddCallbackXtAddCallback`を使用して登録します。 アクションは任意の有効な`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`