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

第 1 章 デスクトップ Korn シェルの紹介

デスクトップ Korn シェル (dtksh) は、既存の Xt および Motif のほとんどの関数に容易にアクセスできる K シェル・スクリプトを提供します。dtksh は、ksh-93 に基づいています。ksh-93 は、シェル・プログラマ用の強力なツールおよびコマンドのセットを提供し、K シェル・プログラミング・コマンドの標準セットをサポートするものです。

dtksh は、ksh-93 が提供する機能およびコマンドのすべてをサポートします。さらに dtksh は、選び抜かれた数多くの libDt 関数、ウィジェット関連の Motif 関数の大部分、Xt イントリンシクス関数の大きなサブセット、および Xlib 関数の小さなサブセットもサポートします。サポートされるすべての関数のリストが付録 A「dtksh コマンド」 にあります。

デスクトップ Korn シェルを使用して Motif アプリケーションを作成する

この節では、dtksh を使用して Motif アプリケーションを作成する方法について説明します。dtksh を使いこなすには、Xlib、Xt イントリンシクス、Motif のウィジェット、および Korn シェル・プログラミングに対する経験が必要です。また、C プログラミング言語の知識も役に立ちます。これらのどれにもなじみがない場合は、必要と思われる適切なマニュアルを参照してください。これらのシステムに精通している場合でも、適切なマニュアル・ページにアクセスして、関連内容を参照してください。

システムには、次のライブラリがあります。

リソース

リソースはウィジェットの変数のことで、サイズ、位置、またはカラーといった属性の定義に使用します。各ウィジェットが持つリソースは通常、自身のリソースと、より高いレベルのウィジェットから引き継ぐリソースとが組み合わさったものです。Xt イントリンシクスおよび Motif のリソース名は接頭辞 (XtN または XmN) を持ち、その後にベース名が続きます。ベース名の最初の文字は常に小文字で、その後のベース名内の単語の最初の文字は常に大文字です。dtksh スクリプトでは、接頭辞を削除して、残ったベース名がリソース名になります。したがって、リソース XmNtopShadowColortopShadowColor になります。

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

ある種のリソース値 (文字列テーブルやビット・マスクなどを含む) は、特殊な表現になります。たとえば、リスト・ウィジェットでは、文字列テーブルに itemsselectedItems の両方のリソースの指定が可能です。dtksh では、文字列テーブルは、カンマで区切られた文字列リストで表現され、これは Motif の場合と似ています。文字列テーブルを返すリソースが XtGetValues による問い合わせを受けた場合、その結果としての値は、カンマで区切られた文字列セットになります。

ビット・マスク値が渡されるリソースは、そのマスクが、| (バー) で区切られたさまざまなマスク値から成る文字列として指定されていることを要求します。ビット・マスクを返すリソースが問い合わせを受けた場合、戻り値は、ビットを表す文字列 (カンマで区切られている) になります。たとえば、次のコマンドを使用して、VendorShell ウィジェット・クラスの mwmFunctions リソースを設定できます。

XtSetValues mwmFunctions: MWM_FUNC_ALL|MWM_FUNC_RESIZE

サポートしていないリソース

dtksh は、Motif リソースのほとんどをサポートしています。次のリストは、サポートしていないリソースのリストです。* (アスタリスク) の付いているリソースは、ウィジェット作成時に XtSetValues を使用して指定できるが、XtGetValues を使用しての取得はできません。

dtksh app-defaults ファイル

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 のデフォルト・ファイルで指定する値と全く同じです。

ブール値

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

一般に、コマンドに渡されるパラメータの順序と型は、対応する C 関数に渡されるものと一致します。ただし、カテゴリ 3 のコマンドのところで記述したものは例外です。

即時戻り値

カテゴリ 3 のコマンドの多くは、コマンドへの最初のパラメータとして指定する環境変数を使用して 1 つの値を返します (これらの特殊なコマンドに対する最初のパラメータは、variable という名前です)。この戻り値がすぐに式で使用されると、変数名の代わりに、特殊環境変数 "-" が使用される場合があります。dtksh が、戻り値が返される環境変数の名前として "-" を認識すると、代わりにコマンドの値としてその結果を返します。これによりシェル・スクリプトは、そのコマンド呼び出しを別のコマンド呼び出しに埋め込むことができます。この機能は、単一の値を返すコマンドにだけ働き、その値は最初のパラメータに返されます。たとえば、次のとおりです。

XtDisplay DISPLAY $FORM 
XSync $DISPLAY true

上記は、次のように置換できます。

XSync $(XtDisplay "-" $FORM) true

$DISPLAY のリファレンスは、XtDisplay の呼び出しが返す値で置換されます。

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

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

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

管理されないウィジェットを作成します。

XtCreateManagedWidget

管理されるウィジェットを作成します。

XtCreateApplicationShell

アプリケーション・シェルを作成します。

XtCreatePopupShell

ポップアップ・シェルを作成します。

XmCreate<widgettypes>

管理されないウィジェットを作成します。

これらのコマンドにはそれぞれ、従わなければならない特定の形式があります。たとえば、管理されないプッシュ・ボタン・ウィジェットをトップレベル・ウィジェットの子として作成したいと仮定します。XtCreateWidgetXmCreatePushButton のどちらかを使用できます。これらのコマンドの形式は、次のとおりです。

プッシュ・ボタン・ウィジェットを作成する実際のコマンドは、次のとおりです。

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 があり、テキスト・ウィジェットの losingFocusCallbackmodifyVerifyCallback、および motionVerifyCallback 中では変更できます。

dtksh は、Motif でサポートしている範囲内において、この構造体内のフィールドの変更をサポートしています。コールバック構造体内の次のフィールドは、変更ができます。

次は、上記のフィールドの変更例です。