前へ 次へ 目次 文書セット ホーム


第 23 章

 

ユーザー定義ウィジェット


はじめに

Sun WorkShop Visual は、Motif ウィジェットセットによってあらかじめ構成されていますが、デフォルトセットに加え、他のソースからのウィジェットをサポートするように拡張することができます。Sun WorkShop Visual にユーザーによって追加されるウィジェットは、ユーザー定義ウィジェットと呼ばれます。これらのウィジェットは Sun WorkShop Visual ウィジェットパレットに表示されます。ユーザーがウィジェットを作成すると、そのリソースを設定して、それらを含むデザインのコードを生成することができます。

Sun WorkShop Visual は、ユーティリティ visu_config を備えています。このユーティリティは、ユーザー定義ウィジェットをサポートするために Sun WorkShop Visual が必要とする情報を提供する際に役立ちます。ユーザーはこのユーティリティを使って使用するウィジェットを指定し、そのウィジェットに必要な非標準のリソース型についての情報を与えます。すると、visu_config は Sun WorkShop Visual とユーザー定義ウィジェットの間の橋渡しとして機能する 3 個の C ファイルを生成します。

visu_config ファイルの生成後、以下に示す構成要素を使用して Sun WorkShop Visual の新バージョンを構築してください。

アイコンを使用することをお勧めしますが、必須要素ではありません。手書きコードは、カスタマイズされたポップアップダイアログを提供しようとする場合、あるいは 「構成関数」に記述されている特殊な問題がある場合にのみ必要です。

事前構成済み統合キットの使用

本章では、visu_config の使用について説明します。ウィジェットを Sun WorkShop Visual に統合する手続きはやや複雑です。visu_config を使用すれば、この手続きを簡素化できますが、visu_config 自体がやや複雑なツールでもあります。そこで、Sun WorkShop Visual では、いくつかのウィジェットセット用に事前構成済みの統合キットを用意しました。Sun WorkShop Visual リリースディレクトリの user_widgets ディレクトリで、サポートされているウィジェット統合を確認してください。必要に応じて多くのセットが使用できるため、セットに組み込まれている統合キットで十分に対応できるはずです。すべてのセットの詳細については、Sun WorkShop Visual のご購入先までお問い合わせください。各統合キットの使用方法を説明した詳細情報は README ファイルにあります。

visu_config は、ユーザーが所有しているウィジェットセットを統合する場合、または標準 Motif セットの他に 1 つ以上のウィジェットセットを含むパレットを構築する場合に必要です。

必要条件

ユーザー定義ウィジェットは、X11 リリース 5X またはリリース 6X ツールキット組み込み関数を構築し実行する必要があります。各ウィジェットクラスには、公開ヘッダーと、ウィジェットクラスを実現するオブジェクトファイルが必要です。これらのファイルはどちらもウィジェットの供給元から提供されます。オブジェクトファイルはアーカイブライブラリに保存されます。また、ウィジェットクラスに対しての非公開ヘッダーファイルが必要な場合もあります。

C コンパイラ、リンカー、および make を含む標準 UNIX 開発ツールへのアクセスが必要です。

visu_config は、ウィジェットクラス記述等の標準ウィジェット情報を必要とします。したがって、ウィジェットの資料を手元に用意しておくと良いでしょう。ウィジェットが非標準リソース型を持つ場合、あるいはカスタマイズされたポップアップダイアログを提供する場合には、ヘッダーファイルやウィジェットソースコードを参照して必要な情報を獲得する必要があります。「ウィジェット情報の獲得」を参照してください。

UILの生成

通常、他社のウィジェットに対しては C または C++ を生成しますが、UIL を生成することもできます。それには、Sun WorkShop Visual にその実行方法を伝えるために、さらに情報を追加する必要があります。詳細は、「UIL の生成」を参照してください。

Java コードの生成

デザインにユーザー定義のウィジェットが含まれているとき、このウィジェットが Java に対応していなくても、Java コードを生成することができます。Sun WorkShop Visual は、Java Panel クラスでコンテナウィジェットを代用し、その他のタイプのウィジェットには Java Canvasクラスを使用します。Java コードの生成の詳細については、第 10 章「Java 用のデザイン」を参照してください。

注意事項

Sun WorkShop Visual ダイナミックディスプレイは、ウィジェットの実際のインスタンスを作成することによって有効となるため、Sun WorkShop Visual に組み込まれるウィジェットはすべてツールの一部となります。ウィジェットが意図したとおりに機能しない場合には、ユーザーがデザインにそのウィジェットを追加すると Sun WorkShop Visual が異常終了する場合もあります。ウィジェットにおけるメモリーリークは、Sun WorkShop Visual に影響を与え、処理速度が徐々に低下したり、あるいはコアダンプの原因となる可能性があります。標準ベンダーから提供される汎用ウィジェットであっても問題を生じる場合もあります。したがって、ウィジェットを Sun WorkShop Visual に追加する前には、入念なテストを行なってください。

前提条件

Sun WorkShop Visual を構成するためには、C についてのある程度の知識、および make などの共通 UNIX 開発ツールについての理解が必要です。X のエキスパートである必要はありませんが、X および X ツールキット組み込み関数についてのある程度の知識は必要です。visu_config には、ウィジェットクラスポインタおよびリソース型を表わす記号定数など、ウィジェットについての情報を供給しなければなりません。ウィジェットの資料またはソースコードから必要な情報を獲得する方法については、「ウィジェット情報の獲得」を参照してください。

Sun WorkShop Visual の動作

ウィジェットの構成を開始する前に、Sun WorkShop Visual が選択されたウィジェットをどのようにダイナミックディスプレイに適用するかを理解しておくと役立ちます。本節では、Sun WorkShop Visual の内部動作について説明します。

ウィジェットの作成

Sun WorkShop Visual は、シミュレーションではなく実際のウィジェットを使用してダイナミックディスプレイを構築します。ウィジェットの作成は、ユーザーが visu_config で指定するウィジェットクラスポインタを XtCreateWidget() に渡すことによって実行されます。また、ウィジェットクラスポインタによって、ウィジェットのリソースおよびその型についての情報へアクセス可能になり、Sun WorkShop Visual がウィジェットのリソースパネルを構築することができるようになります。

ダイナミックディスプレイにおいて作成およびマネージされるウィジェットの順番は、アプリケーションでの標準的な操作順序とは異なります。ユーザーがアイコンをクリックして階層にウィジェットを追加する時、Sun WorkShop Visual はウィジェットのインスタンスを作成し、リアライズ (実体化) し、リソースが設定される前にそれをマネージします。一方、Sun WorkShop Visual がファイルから階層を読み出す場合は、階層は下から順番に作成されます。各ウィジェットは、まず作成され、次にそのリソースが設定されてから最後にマネージされます。どちらの場合においても、Sun WorkShop Visual はリソースを設定する前にウィジェットを作成するため、作成時のみ設定可能なリソースは通常の方法ではダイナミックディスプレイには設定できません。

Athena Form ウィジェットなどウィジェットによっては、作成時リソース設定を必要としたり、あるいは子を持たずにマネージされると正しく動作しない場合があります。このような場合は、visu_config にリアライズ関数を指定して、階層にウィジェットを追加する Sun WorkShop Visual の手順をカスタマイズすることができます (詳細は、「リアライズ関数」を参照してください)。

    注 - 上記のような問題は生成コードには影響しません。Sun WorkShop Visual は、階層を下から順番に作成するコードを生成し、作成時にすべてのリソースを設定します。

選択されたウィジェットの強調表示

ツリー内のウィジェットを選択すると、選択されたウィジェットのアイコンは強調表示されます。また、ダイナミックディスプレイ内のウィジェット自体も、前景と背景の色を入れ替えることにより強調表示されます。ウィジェットが作成時にのみ設定可能な前景リソースを持っている場合は、ウィジェットの強調表示により問題が生じる可能性があります。この場合は、「ウィジェットの属性」に説明されているように、ウィジェット編集ダイアログの前景スワッピングを使用不可能とすることができます。

無効な階層の防止

Sun WorkShop Visual は、無効な階層が作成されないように、選択されたウィジェットに子としてアタッチすることのできないウィジェットのアイコンをすべて使用不可能にします。また、階層に新しく追加されたウィジェットが子を持つことができない場合には、Sun WorkShop Visual はそのウィジェットを自動選択しません。

ユーザー定義ウィジェットの場合、Sun WorkShop Visual はウィジェットのスーパークラスを調べて、有効な階層を決定します。また、構成関数を指定することにより、有効な子および親ウィジェットに対してのウィジェットの必要条件をカスタマイズすることも可能です。詳細は、「構成関数」を参照してください。

リソースパネルの構築

Sun WorkShop Visual は、ウィジェットクラスレコードにあるリソース名およびリソース型にもとづき、ウィジェットのリソースパネルを構築します。コアウィジェットまたは Motif 親クラスなどの既知のスーパークラスから継承されているリソースは、スーパークラスに対してのリソースパネル上で設定することができるので、当該ウィジェットのリソースパネルからは除かれています。

Sun WorkShop Visual は、自動的に標準のリソース型をリソースパネル上の適切なページに割り当てますが、必要に応じて明示的に他のページに割り当てることもできます。ほとんどのウィジェットリソースは、標準的カテゴリのいずれかに分類されます。その内容については、「リソース」を参照してください。

リソースパネルが表示されると、Sun WorkShop Visual は XtGetValues() を使用してウィジェットの全リソースの現在値を獲得します。列挙型を除くすべてのリソースはテキスト文字列に変換され、リソースパネル上のテキストフィールドに表示されます。ユーザーはテキスト文字列を編集してリソースを設定できます。フォント、色およびコールバックなどのように、ユーザーがポップアップダイアログを使用して間接的にテキストを指定できる場合もあります。Sun WorkShop Visual の中でポップアップダイアログを持っていないリソースに対しては、ポップアップを提供することができます。詳細は、「ポップアップ」を参照してください。

リソースの設定

ユーザーが新しいリソース値を適用すると、Sun WorkShop Visual はテキスト文字列を値に変換し、それを XtSetValues() を使用してウィジェットに適用します。すると、即座に XtGetValues() を使用してそのウィジェットのすべてのリソース値を検索し、それらの値を変換してテキストに戻し、戻したテキストをリソースパネルに表示します。この手順は、ツールキットにとって新しい値が有効かどうか、および新しい値によって他のリソースが変更されたかどうかを即座に示します。

テキスト文字列をリソース値に変換したり戻したりするためには、リソースコンバータと呼ばれる関数が使用されます。標準リソース型にはコンバータ関数が組み込まれているため、ユーザーは visu_config を使用する必要はありませんが、ウィジェットが非標準のリソース型を持っている場合は、visu_config を使用してコンバータ関数についての情報を指定することができます。詳細は、「コンバータ」を参照してください。この情報を指定しない場合でも、ユーザーは生成コード内のリソース、あるいはリソースファイルにテキスト文字列を設定することができます。しかし、Sun WorkShop Visual はテキスト文字列を値に変換することができないため、ダイナミックディスプレイ上でリソースを設定することはできません。

列挙型リソースに対しては、Sun WorkShop Visual はオプションメニューを構築します。オプションメニューは、デフォルトでリソースパネルの「設定」ページに配置されます。Sun WorkShop Visual は、ユーザー定義ウィジェットに対しての Boolean 列挙型リソースを処理することができます。その他の列挙型に対しては、Sun WorkShop Visual がオプションメニューを構築することができるように、visu_config に有効な値のリストを提供する必要があります。詳細は、「列挙型」を参照してください。

デザインの保存とコード生成

Sun WorkShop Visual では、デザインの保存および保存ファイルの解析を簡単に行うことができます。リソース設定の場合、Sun WorkShop Visual はリソース名およびその値のテキスト表示を .xd ファイルに書き込みます。リソース名および値は、リソースパネルに表示される通りに保存されます。

コードを生成する場合、Sun WorkShop Visual はそれぞれのリソースについて 2 通りのバージョンを使用します。生成される X リソースファイルにおいては、リソースは label のような名前で識別され、Sun WorkShop Visual はウィジェットクラスレコードからリソース名を獲得します。生成コードにおいては、リソースは XtNlabel のような定義名で識別され、Sun WorkShop Visual はリソース名に接頭辞 XtN を追加することにより定義名を構成します。ウィジェットがこの命名規則に沿っていない場合は、visu_config を使用して定義名を構成するための関数を指定することができます。詳細は、「構成関数」を参照してください。

列挙型の場合も、Sun WorkShop Visual は、center のようなリソースファイル記号と XtJustifyCenter のようなコード記号というように、それぞれの 2 通りのバージョンを使用します。列挙型を構成する場合は、各値の両方のバージョンを提供する必要があります。

Sun WorkShop Visual がウィジェットクラスに対してのコードを生成する場合、そのクラスの公開ヘッダーファイルに対して #include を生成します。visu_config を使用すると、各ユーザー定義ウィジェットに対して #include ファイルを指定することができます。

ウィジェット情報の獲得

ウィジェットを構成するためには、ウィジェットのコードからひとつあるいは複数の変数名および記号定数を抜き出す必要があります。この節では、ユーザーが指定する必要がある情報について説明します。必要な情報のほとんどは、ウィジェットの資料から利用することができます。そこから情報が得られない場合は、ウィジェットの公開および非公開ヘッダーファイル、ウィジェットソースコード (使用可能な場合)、あるいはウィジェットの開発元のテクニカルサポートサービスから情報を得ることができます。

これから、多くのウィジェット開発元が準拠している命名規則について説明します。ただし、命名規則は変更される可能性があるので、資料またはソースコードで常に名前を確認してください。

ウィジェットクラスポインタ

visu_config にウィジェットクラスを追加する場合、ウィジェットクラスポインタを指定する必要があります。ウィジェットクラスポインタは、 WidgetClass 型のポインタ変数名です。このポインタにより、リソースのリストおよびその型を含む、ウィジェットクラスについての情報を持っている構造へアクセスすることができます。Sun WorkShop Visual は、この情報を使用して、ウィジェットクラスのリソースパネルを構築します。規約により、ウィジェットクラスポインタは、 < クラス名 > WidgetClass という形式をとります。

資料でウィジェットクラスポインタを見つけることができない場合は、以下に示すような行を公開ヘッダーファイル内で探してください。

externalref WidgetClass fredWidgetClass

または、

extern WidgetClass fredWidgetClass

どちらの場合においても、ウィジェットクラスポインタは fredWidgetClass です。

リソース情報

リソース名とは、生成される X リソースファイル内およびリソースパネルでリソースを識別するために使用される文字列です。Sun WorkShop Visual はこの名前をウィジェットクラスレコードから直接得るため、ユーザーが指定を行う必要はありません。この文字列は通常、 label のように接頭辞のない単純な名前です。

定義名は、ソースコードにおいてリソース名を識別するために使用される記号定数です。規約により、定義名は「 < 接頭辞 >N< 名前 > 」の形式をとります。ここで <名前> はリソース名です。定義名を見つけるには、ウィジェット資料、あるいは #define 宣言の公開ヘッダーファイル内を調べます。たとえば、以下に示す Athena Form ヘッダーファイルにある行では、定義名 XtNtop および XtNbottom が定義されています。

#define XtNtop "top"
#define XtNbottom "bottom"

非標準型リソース

標準型以外のリソースを構成するためには、リソース型を理解している必要があります。リソース型というのは、 unsigned char のような型ではなく、ウィジェットクラスがリソース型を識別することのできる、文字列として定義されている記号定数です。規約により、リソース型は 「 < 接頭辞 >R< > 」の形式をとります。非標準リソース型、特に列挙型では、 < > はリソース名と同じ場合があります。

ウィジェットの資料が foo のようなリソース型を示している場合は、以下に示すような公開ヘッダーファイル内の行を探してください。

#define XtRFoo "foo"

この例では、 visu_config がリソース型を要求した場合、 XtRFoo と入力します。このリソース型はウィジェットのソースコードでも見つけることができます。次に示す構造は、リソース型が XtRFoo であるリソースを定義します。この構造からは、リソースの定義名 XtNfoo も得ることができます。

{
	XtNfoo, XtCFoo, XtRFoo,
	sizeof(foo), XtOffset( FooWidget, foo),
	XtRImmediate, (XtPointer) NULL,
}

標準以外の列挙型

ウィジェットが標準以外の列挙型リソースを持っている場合、指定可能な値のリストを指定する必要があります。必要な名前を獲得するためには、ソースコードを読まなければいけない場合もあります。詳細は、「列挙型」を参照してください。

visu_config のメインダイアログ

以下のように入力して、visu_config を実行します。

visu_config

図 23-1 に示すメインダイアログが表示されます。

 

    図 23-1 visu_config メインダイアログ

メニューコマンド

visu_config の「ファイル」メニューには、構成データを含むファイルの保存、および読み出しを行うオプションがあります。規約により、これらのファイルは接尾辞 .xdc を持ちます。既存ウィジェット仕様ファイルを開くためには「開く」を使用します。現在編集中のファイルと別のファイルを組み合せるためには「読む」を、ファイルの保存には「保存」および「別名保存」を、そして編集領域をクリアするためには「新規」を使用します。

「編集」メニューは「停止リスト」ダイアログを表示するために使用します。「停止リスト」ダイアログを使用すると、選択した Motif ウィジェットを Sun WorkShop Visual パレットから削除することができます。詳細は 「Motif ウィジェットの停止リスト」を参照してください。

生成メニューには、追加されたウィジェットを使用して Sun WorkShop Visual を構築するために必要となる 2 種類のコードファイルを生成するためのオプションがあります。visu_config からのコードの生成および Sun WorkShop Visual の構築についての詳細は、「コードの生成とコンパイル」を参照してください。

ファミリ

メインダイアログは、ファミリのリストを表示します。ファミリとは、ウィジェットパレット内に一緒に表示されるウィジェットの組です。プログラムを起動した時点では、このリストは空になっています。図 23-1 は、Sun WorkShop Visual と一緒に供給される Athena.xdc ファイルを読み込んだ後のダイアログを示しています。このファイルを開いて、内容を確認してください。

ユーザー定義ウィジェットは、必要に応じてファミリに編成することができます。ウィジェットをファミリにすることには、2 つの利点があります。第 1 に、ウィジェットパレットのサイズが大きくなりすぎないように適当な大きさに保つことができます。Sun WorkShop Visual は、デフォルトの Motif ウィジェットとユーザー定義ウィジェットのファミリ 1 個のアイコンをウィジェットパレットに表示します。オプションメニューを使用すると、リソースパネルを使用する場合と同様に、別のファミリに切り換えることができます。第 2 には、ウィジェットをファミリにグループ化することにより、異なるファミリの組み合せを持つ Sun WorkShop Visual の別バージョンを容易に生成することができます。コード生成時には、リストから任意のファミリの組み合せを選択することができます。このため、Sun WorkShop Visual をカスタマイズして、用途や技術レベルの異なるユーザーをサポートすることが可能になります。

ファミリリストの編集

リストに新しいファミリを追加するには、「選択」フィールド内にファミリ名をタイプ入力し、その後「追加」をクリックします。ファミリには任意の名前を指定することができます。ファミリ名は visu_config および Sun WorkShop Visual ウィジェットパレットにおいてファミリを識別するために使用されます。

ファミリを削除する場合は、リストから削除するファミリを選択し、「削除」をクリックします。また、リストを並べ替える場合は、ファミリを選択した後に矢印ボタンを使用して上下にファミリを移動します。リストの順序によって、ウィジェットパレット内のオプションメニュー項目の順序が決定されます。

ファミリの分け方のヒント

同一のウィジェットを複数のファミリに含めることができます。たとえば、 Athena.xdc の場合、「Athena」という名のファミリはすべての Athena ウィジェットを含んでおり、「Composites」と「Primitives」という 2 個の小ファミリはそれぞれ Athena グループの部分集合です。 visu_config からコードを生成する際には、ウィジェットパレット上での表示方法を決定することができます。つまり、大ファミリを使用してすべての Athena ウィジェットを同時に表示したり、あるいは 2 個の小ファミリを使用してサブセットを表示することができます。

頻繁に使用するウィジェットを複数のファミリに含めることにより、表示されているパレットのページとは関係なく、常にそれらのウィジェットへアクセスすることができます。ただし、そのためにはウィジェット構成情報のコピーを 2 個別々に入力し、維持する必要があります。また、パレットの各ページにおいてアイコンを別々にテストする必要もあります。

visu_config からコードを生成する際には、現在開いているファイルから任意のグループを選択することができますが、その他のファイルからは選択できません。複数の .xdc ファイルのウィジェットファミリを持つ Sun WorkShop Visual を構成するためには、コードを生成する前に「読む」オプションを使用してファイルを組み合わせます。

ファミリへのウィジェットの追加および編集

ウィジェットをファミリへ追加あるいは構成するには、ファミリを選択した後「編集」をクリックしてファミリ編集ダイアログを表示します。ファミリ編集ダイアログを使用すると以下の作業を行うことができます。

  • 選択されたファミリでのウィジェットの追加または削除
  • 選択されたファミリでのウィジェットクラスの仕様の編集
  • 非標準リソース型の処理方法の指定
  • リソースに対してのポップアップダイアログの指定

ファミリ編集ダイアログには複数のページがあり、それらを「表示」メニューで選択することができます。現在選択されているファミリの名前がダイアログのタイトルバーに表示されます。

ファミリ編集ダイアログの詳細については、以下の節を参照してください。

ウィジェットクラス

そのファミリ内にあるウィジェットクラスのリストを表示するには、「表示」メニューから「ウィジェット」を選択します。図 23-2 に Athena の「Composites」ファミリの「ウィジェット」ページを示します。

 

    図 23-2 ファミリ編集ダイアログの「ウィジェット」ページ

ウィジェットクラスの追加

ファミリに新しいウィジェットクラスを追加するには、「選択」フィールドにウィジェットクラスポインタを入力し、その後「追加」をクリックします。完了するためには、「ウィジェットの属性」に記述されているように、クラスの属性を指定します。

ウィジェットクラスリストの編集

ファミリからウィジェットクラスを削除するには、まずリストからそのウィジェットクラスを選択し、「削除」をクリックします。リストを並べ替える場合は、項目を選択し、矢印ボタンを使用して項目を上下に移動します。リストの順序によって、ウィジェットパレット内のオプションメニューの順序が決定されます。

ウィジェットの属性

ウィジェットクラスの属性を指定する場合は、まず、 ファミリ編集ダイアログでウィジェットクラスを選択し、その後「編集」をクリックします。すると、ウィジェット編集ダイアログ (図 23-3) が表示されます。タイトルバーには編集中のウィジェットクラスの名前が表示されます。

この節は、 ウィジェット編集ダイアログの左側にある一連の属性について説明します。ダイアログの右側は、既存または新しいページにリソースを割り当て、ウィジェットリソースにカスタムポップアップを指定し、デフォルトリソースメモリー管理を書き換えるために使用します。詳細は、「リソース」を参照してください。

変更の適用

ウィジェットの属性の入力が終了したら、「適用」をクリックして新しい値を設定します。「元に戻す」をクリックすると、最後に適用された変更に戻ります。

 

    図 23-3 Athena Form の属性を示すウィジェット編集ダイアログ

インクルードファイル

「インクルードファイル」フィールドには、ウィジェットクラスに対しての公開ヘッダーファイルの名前を指定します。ファイル名 (通常は /usr/include に対する相対指定) には、引用符や括弧を使用しないでください。このファイルは、 visu_config によって生成されるコードファイルと Sun WorkShop Visual によって生成されるアプリケーションコードの 2 箇所に組み込まれます。

アイコン

アイコンは、Sun WorkShop Visual ウィジェットパレットおよびデザイン階層内にあるユーザー定義ウィジェットを表わす X ピックスマップまたはビットマップです。各ウィジェットに対してピックスマップとビットマップの両方を指定することができます。アイコンピックスマップは別のファイルに保存されており、Sun WorkShop Visual リソースファイル中の設定内容によって指定されます。

アイコンビットマップは Sun WorkShop Visual に組み込まれており、ピックスマップリソースが設定されていない、あるいはピックスマップファイルが見つからない場合にのみ使用されます。どちらの形式のアイコンも指定しない場合、あるいは指定されたアイコンが見つからない場合、Sun WorkShop Visual はウィジェットクラス名を中に表示したボタンをウィジェットパレット内に、×印のついた四角形のアイコンを階層内に表示します。

使用する色を減らすために、Sun WorkShop Visual がアイコンに対して使用するカラーパレットを使用することをお勧めします。「パレット」メニューの「パレットを読み取り」を選択して、以下のファイルをピックスマップ・エディタに読み込んでください。

$VISUROOT/lib/palettes/icon.xpm

$VISUROOT は Sun WorkShop Visual のインストールディレクトリです。ピックスマップ・エディタへのパレット読み込みについては 「ピックスマップ・エディタのパレットメニュー」を参照してください。

ピックスマップリソース

「ピックスマップリソース」フィールドは、ピックスマップリソースの名前を指定するために使用します。Sun WorkShop Visual を構築した後、このリソースを設定してピックスマップファイルを指定することができます。

たとえば、ユーザー定義ウィジェットのピックスマップリソースとして myWidgetPixmap を指定する場合は、以下のエントリを使用して Sun WorkShop Visual リソースファイルにピックスマップを指定することができます。

visu.myWidgetPixmap: /usr/local/newwidget.xpm

これにより、XPM ファイルの位置として /usr/local/newwidget.xpm が指定されます。パス名は、絶対あるいは相対のどちらでも使用することができます。ピックスマップリソースの使用方法についての詳細は、 「パレットアイコン」を参照してください。

ビットマップ

組み込みアイコンビットマップを指定するためには、ビットマップ名と対応するビットマップファイル名の 2 項目を指定する必要があります。大型画面 (ワークステーション) 用の Sun WorkShop Visual に対してアイコンを指定する場合は、「大アイコンビットマップ」および「大アイコンビットマップ・ファイル」フィールドを使用します。小型画面 (VGA) 用の場合は「小アイコンビットマップ」および「小アイコンビットマップ・ファイル」フィールドを使用します。アイコンは、大型画面用または小型画面用のどちらか一方だけを指定することも、両方指定することも、どちらにも指定しないでおくことも可能です。

大型画面アイコンは 32×32 ピクセルの X ビットマップ、小型画面アイコンは 20×20 ピクセルにします。アイコンビットマップは X11 ビットマップユーティリティなどのツールを使用して作成することができます。ピックスマップは使用できません。

ビットマップ名を「大アイコンビットマップ」または「小アイコンビットマップ」フィールドに入力します。ビットマップ名は、以下に示すようにビットマップファイルの最初の行の定義中に見つけることができます。

#define <ビットマップ名>_width 32

アイコンファイル名を「大アイコンビットマップ・ファイル」または「小アイコンビットマップ・ファイル」フィールドに、引用符や角括弧を使用せずに入力します。このファイルは Sun WorkShop Visual の組み込み時に読み出されるため、Sun WorkShop Visual メークファイルはそのファイルが保存されているディレクトリを参照しなければなりません。なお、エンドユーザーがこのファイルを使用できるようにする必要はありません。

ヘルプ

上述のような属性を使用して、ユーザーがパレット上で、あるいはウィジェットのリソースパネルにおいて、ウィジェットに対してのヘルプを呼び出した際に表示されるオンラインヘルプを指定することができます。それぞれのヘルプ項目に対して、(接尾辞を付けない) ドキュメント名を、該当するウィジットのヘルプが大きなドキュメント中に含まれている場合はタグを指定します。Sun WorkShop Visual ヘルプシステムが、Sun WorkShop Visual. helpDir リソースで指定されているパスのリストに従って、該当するファイルを検索します。ファイル名には接尾辞 .html が必要です。タグとは、ドキュメントの HTML ハイパーテキストを構成するアンカー記号を指します。

構成関数

構成関数を指定するフィールドとして、「定義名」関数、「子を追加可能」関数、「適切な親」関数および「リアライズ関数」の 4 つの関数があります。これらの関数は Sun WorkShop Visual のダイナミックディスプレイにおけるウィジェットの処理方法を微調整するために使用することができます。ウィジェットが構成関数を使用する場合は、対応するテキストフィールドに関数名をタイプ入力します。

構成関数は以下の処理を実行します。

  • 定義名関数
    リソース名を適切な定義名に翻訳します。ウィジェットが標準の Motif 命名規約に従わない場合に限り必要です。
  • 子を追加可能関数
    あるウィジェットの子として、他のクラスのウィジェットを追加できるかどうかを決定します。
  • 適切な親関数
    他のクラスのウィジェットが、あるウィジェットに対して適切な親であるかどうかを決定します。
  • リアライズ関数
    ウィジェットが、ダイナミックディスプレイにおいて作成される際の初期化手順を追加します。そのウィジェットに子がない状態ではうまく作成またはマネージできない場合、あるいは作成時にリソースの設定を要する場合にのみ必要です。

「子を追加可能」および「適切な親」関数は、有効な階層について特別な条件を持つウィジェットに対してのみ必要となります。多くの場合、これらの関数は必要ありません。これらの関数を指定しない場合、Sun WorkShop Visual はウィジェットクラスの最初に認識した祖先に対しての規則を使用します。たとえば、ユーザー定義ウィジェットが Primitive クラスから派生している場合、Sun WorkShop Visual は Primitive クラスの規則を使用するため、ユーザーによるウィジェットへの子の追加は許可しません。

構成関数の完全な定義、同義語および例については、「構成関数」を参照してください。多くのウィジェットは構成関数を必要としないので注意してください。

その他のトグルボタン

ダイアログの下部に、ウィジェットの使用に関する各種オプションのトグルボタンがあります。各ボタンの詳細については、以下で説明します。「ウィジェット編集」 ダイアログの 「リソース」 パネルのトグルについては、「リソース」を参照してください。

クラス初期化用のコードを生成

初めてウィジェットを作成するときは、通常、指定のウィジェットインスタンスとは反対に、ウィジェットの特定のクラスに関連付けられた初期化が行われます。

ウィジェットセットによっては、指定のウィジェットを初めて作成するまでにこの初期化を行わないと問題が発生することがあります。ウィジェット間に暗黙的な依存関係がある場合は、指定のウィジェットセットに含まれるウィジェットを作成する前に、ウィジェットクラスを手作業で確実に初期化してください。このような場合、たとえば、テーブルウィジェットに子としてテーブルラベルウィジェットを指定できますが、テーブルのコードによっては、ラベルクラスが初期化されたと見なすことがあります。このため、ラベルをテーブルにアタッチしないときでも、テーブルを使用する前にラベルクラスを初期化しておく必要があります。

このトグルをオンにすると、Sun WorkShop Visual は、作成コードを呼び出す前に、メインモジュールに次の行を生成します。

XtInitializeWidgetClass(widget_class)

このトグルはデフォルトでオンになっています。そのため、クラスを事前に初期化していなくても問題は発生しませんが、ウィジェットによっては問題が発生することもあります。

ウィジェット検索を無効化

ウィジェットのスピード検索機能を使用しない場合には、このトグルをオフにします。ダイナミックディスプレイでスピード検索機能が正しく動作しない場合は、このオプションをオフにしてください。

前景スワップを禁止

通常、Sun WorkShop Visual はダイナミックディスプレイにおいて現在選択されているウィジェットを強調表示します。ウィジェットクラスに対しての強調表示をやめるには、「前景スワップを禁止」トグルをオンにします。この操作は、ウィジェットクラスが、ウィジェット作成後に設定できない前景リソースを持っている場合に限って行います。Sun WorkShop Visual の強調表示の方法は、このようなウィジェットに問題を生じさせる可能性があるため、「前景スワップを禁止」をオンにする必要があります。他の場合には、トグルをオフにしておきます。

デフォルトは 「解放しない」

Sun WorkShop Visual が XmString と String(char *) ウィジェットリソースのメモリーを管理する方法のデフォルトを設定できます。このトグルの使用方法も含めて、詳細は、「リソースメモリー管理」を参照してください。

ウィジェットを作成

「ウィジェットを作成」トグルがオンである場合、ユーザーは階層に直接ウィジェットを組み込むことができます。ウィジェットのアイコンをパレットに表示しようとする場合には、トグルをオンのままにしておきます。

ウィジェットクラスをコアウィジェットのような目に見えないスーパークラスにする場合は、トグルをオフにします。トグルをオフにすると、ウィジェットはウィジェットパレットに表示されず、ユーザーはそのインスタンスを直接作成することができません。Sun WorkShop Visual はこのクラスに対しては別のリソースパネルを作成します。リソースパネルには任意の派生ウィジェットクラスからアクセスすることができます。

ウィジェットをマネージ

すべてのウィジェットが GUI の構成要素というわけではありません。たとえば、INT ChartObject ウィジェットセットの各種データオブジェクトクラスは、MVC (Model View Controller) モデルではグラフの構成要素 (円、方形、軸など) を表す場合に使用します。この場合、これらのオブジェクトを直接描画することはしませんが、グラフの親ですべてを内部処理することができます。

Sun WorkShop Visual には管理できる事項と管理できない事項に関する内部ルールがあります。そのルールによると、WidgetClass 以外の ObjectClass や派生クラスを管理することは、ツールキットでは禁止されており、こうしたクラスを管理すると、クラスが破壊されてしまいます。一方、ウィジェットセットのデータオブジェクトには、WidgetClass から派生したものもありますが、こうしたオブジェクトが管理可能とは限りません。Sun WorkShop Visual は、こうした例外を認識できません。つまり、オブジェクトの管理に関するルールは、内部のオブジェクトに対しても生成されたオブジェクトに対しても正しく適用されない可能性があります。非常にまれなケースですが、構成要素の Sun WorkShop Visual による管理の中止が必要な場合に、このトグルを使用します。

抽象的な子として編集

複合ウィジェットの抽象的な子に対してコードを表示、構成、生成する機能です。複合ウィジェット MotifScrolledWindow の場合は、スクロールバーが抽象的な子となります。ウィジェットが複合ウィジェットで、ユーザーが抽象的な子にアクセスできないようにする場合は、このトグルをオフにします。Sun WorkShop Visual で他社の複合ウィジェットの抽象的な子にアクセスする方法の詳細については、「抽象的な子のアクセス」を参照してください。

リソース

デフォルトでは、Sun WorkShop Visual がウィジェットのリソースダイアログを作成する場合、リソースの名前および型を直接ウィジェットコードから獲得し、リソースパネルを構築します。Sun WorkShop Visual は各リソースをリソース型に基づいて、リソースパネルのページに割り当て、適当な型にポップアップダイアログを割り当てます。たとえば、 XtRPixel 型のリソースは、Sun WorkShop Visual カラーエディタをポップアップさせるボタンとともに、リソースパネルの「表示」ページに置かれます。

このデフォルト動作を変更する場合、あるいはリソースが標準型の表にリストされていない場合を除き、リソース構成のために何かを行う必要はありません。

標準リソース型のデフォルト処理

標準型のリソースは、以下の表に示すようにリソースパネルのページに割り当てられます。

    表 23-1 Sun WorkShop Visual 標準リソース型

リソース型記号

ページ

XmRDimension

"Dimension"

マージン

XmRFontStruct

"FontStruct"

表示

XmRHorizontalDimension

"HorizontalDimension"

マージン

XmRInt

"Int"

マージン

XmRPixel

"Pixel"

表示

XmRPixmap

"Pixmap"

表示

XmRPosition

"Position"

マージン

XmRPrimForegroundPixmap

"PrimForegroundPixmap"

表示

XmRShort

"Short"

マージン

XmRString

"String"

表示

XmRVerticalDimension

"VerticalDimension"

マージン

XmRWidget

"Widget"

表示

XmRXmString

"XmString"

表示

XtRBoolean

"Boolean"

設定

XtRCallback

"Callback"

コールバック

XtRUnsignedChar

"UnsignedChar"

設定

XmRFontList

"FontList"

表示

XtRFontStruct

"FontStruct"

設定

XmRXmStringTable

"XmStringTable"

表示

ウィジェットの属性の変更

ウィジェット編集ダイアログの右側を使用すると、個々のウィジェットリソースに対して以下のような動作を行うことができます。

  • リソースがリソースパネル上に表示されないようにする
  • リソースをリソースパネルの選択されたページに割り当てる
  • リソース設定用のポップアップダイアログを指定する
  • リソースのメモリー管理を制御する
    「リソースメモリー管理」を参照してください。
  • ウィジェットのリソースの 「CSG」 (Create/Set/Get: 作成/オン/取得) アクセス可能性を制御する

リソースの属性をカスタマイズするためには、リソースフィールドにリソース名を入力します。この場合のリソース名は、 XtNcursorName のような定義名とします。

リソースパネルからリソースを取り除くには、「表示」トグルをオフにします。

リソースパネルの異なるページを指定する場合は、「ページ」ボタンをクリックして現在のページのリストを表示します。リストは、デフォルト Sun WorkShop Visual ページにあらかじめ設定されています。ページを追加するには、「ページ」フィールドに新しいページの名前を入力し、「更新」をクリックします。現在のリソースをページに設定するには、リストにおいてページを選択し、その後「適用」をクリックします。

visu_config は、次の表に示されている、特定のリソース型に対して Sun WorkShop Visual 事前定義ポップアップを自動的に呼び出します。これらの型のリソースに対してのポップアップを使用するために、ポップアップを明示的に指定する必要はありません。

    表 23-2 標準リソースポップアップ

リソース型

ポップアップ

XmRFontList

フォント選択パネル

XtRFontStruct

フォント選択パネル

XmRPixel

カラー選択パネル

XmRPixmap

ピックスマップエディタ

XmRPrimForegroundPixmap

ピックスマップエディタ

XmRXmString

コンパウンド文字列エディタ

XtRCallback

コールバックダイアログ

ポップアップダイアログは、どのようなリソースにも指定することができます。事前定義されているポップアップを指定、あるいは独自のポップアップを作成することが可能です。詳細は、「ポップアップ」を参照してください。

「カウンタ・リソース」テキストフィールド

リソースによってはペアになっているものがあります。XmString の配列が Motif リストに渡されると、配列内の文字列数を指定する必要があります。たとえば、次のコードで、アプリケーションはコアダンプします。

XmString *xmstrings = ... ;
XtVaSetValues(list, XmNitems, xmstrings, NULL) ;

配列リソースには、NULL で終わっているリストのように、配列の終わりを示すマーカーがありません。そのため、次の例で示すように、明示的にカウントを指定する必要があります。

int n = ... ;
XmString *xmstrings = ... ;
XtVaSetValues(list, XmNitems, xmstrings, XmNitemCount, n, NULL) ;

「XmStringTable カウンタ・リソース」 テキストフィールドは、配列と配列カウンタ・リソースを組み合わせる場合に使用します。その結果、Sun WorkShop Visual で、配列と配列カウンタ・リソースを組み合わせて内部使用でき、さらに、一度に両方のリソースを使用して正確なコードを生成できます。

このテキストフィールドは、ペアになっているカウンタ・リソースを必要とする XmString 配列リソースと char ** 配列リソース用です。

作成/オン/取得

ウィジェットのリソースのアクセス可能性を制御できる 「作成」、「オン」、「取得」 という 3 つのトグルがあります。これらのトグルは Motif ドキュメントの 「CSG」 に直接関連しています。「オン」 トグルをオフにすると、Sun WorkShop Visual と Sun WorkShop Visual が生成したコードでは、リソースは読み取り専用になります。「取得」 トグルをオフにすると、ユーザーのコードでリソースの値をフェッチすることはできません。「作成」 トグルをオフにすると、リソースをユーザーが作成しなければなりません。

他社のウィジェットに関するドキュメントでは、「CSG」 (Create/Set/Get) の意味がここでの説明と異なっていることがあります。その場合は、このトグルの機能をオフにします。次のようにリソースを設定してください。


visu.xwResourceAccessControl: false

非標準リソース型

デフォルトでは、表 23-1 の Sun WorkShop Visual 標準リソース型以外のリソース型は、リソースパネルの「その他」のページに示されています。ユーザーは、テキストフィールドに文字列を入力することによって非標準のリソース型を設定することができます。文字列は、ユーザーが入力したとおり正確にコード生成されます。生成コードがコンパイルされる際に、リソース設定が有効になります。

このデフォルト動作には好ましくない点も含まれています。Sun WorkShop Visual はリソース型を識別しないため、ダイナミックディスプレイにおいてリソースを設定することができません。列挙型値が正確に大文字と小文字を区別して (接頭辞も含む) 入力されない場合は、生成コードのコンパイルは行われません。

visu_config では、Sun WorkShop Visual で非標準リソース型の処理方式を簡便化する方法をいくつか提供しています。

  • 標準型のように動作するリソース型に対して別名を指定できる
    ある非標準リソース型が XmRInt と同様に動作する場合は、Sun WorkShop Visual にそのリソースを XmRInt として扱うように指示することができます。
  • Sun WorkShop Visual が、 XtRBoolean ではなく列挙型を処理するように構成できる
    このような構成を行うと、リソースパネルの「設定」ページに列挙型リソースが配置されます。ユーザーは、オプションメニューを使用してこれを設定することができます。ダイナミックディスプレイ上で、入力を誤ることなくリソースを有効にすることができます。
  • その他の型に対しては、コンバータを指定できる
    コンバータは、Sun WorkShop Visual にダイナミックディスプレイのリソース設定を実行させます。
  • どのようなリソースに対してもポップアップダイアログを指定することができる
    ポップアップダイアログを持つリソースのリソースパネル上には、ダイアログを呼び出すためのプッシュボタンが作成されます。

以下の節では、これらの手順についての詳細な説明を行います。

別名

ある定義ウィジェットが、標準リストに含まれてはいないものの、標準型と同様の意味を持つリソースを使用する場合は、visu_config にこのリソース型が標準型の別名であることを指定することができます。たとえば、型 XtRDegrees を 0 から 359 までの整数として定義する場合、 XtRDegrees XmRShort と等価であることを指定する別名を設定することができます。その後、リソースパネルの「マージン」ページに XtRDegrees リソースを設定すると、即座にダイナミックディスプレイで結果を確認することができます。

必要条件

新しいリソース型は、標準型と同じ意味を持っている必要があります。特に、テキスト文字列のリソース値への変換と逆変換のしかたは、両方の型に対して同じでなければなりません。

別名の指定

ファミリ編集ダイアログにおいて、表示メニューをプルダウンし、「別名」を選択します。すると、図 23-4 に示されるダイアログが表示されます。

 

    図 23-4 ファミリ編集ダイアログの「別名」ページ

別名を指定するためには、標準以外のリソース型を「選択」フィールドに入力し、それに対応する標準型の名前を「同義語」フィールドに入力します。その後「適用」をクリックして別名を登録します。

列挙型

列挙型リソースは、有効な値が限られているリソースです。ウィジェットが列挙型リソースを持っているかどうかは、そのウィジェットの資料を調べると判断することができます。資料にリソースに対してのすべての可能値がリストされている場合、それは列挙型であると判断できます。型 XtRBoolean の列挙型は自動的に処理されるため、この節で説明する構成手順は必要ありません。

デフォルトでは、Sun WorkShop Visual はその他すべての列挙型を、未知のリソース型を扱うように処理します。列挙型リソースはリソースパネルの「その他」ページに配置されます。テキストフィールドに新しい値を入力すると、それらの列挙型が設定されます。設定は生成コードに渡されますが、ダイナミックディスプレイには反映されません。

以降の指示に従って、Sun WorkShop Visual に必要な情報としてリソースパネルの「設定」ページのリソースに関するオプションメニューを構築し、ダイナミックディスプレイにリソースを設定してください。

列挙型の構成

ファミリ編集ダイアログの「表示」メニューから、「列挙型」を選択し、「列挙型」のページを表示します。図 23-5 には、 Athena の Primitives ファミリの列挙型リストを示します。

 

    図 23-5 ファミリ編集ダイアログの「列挙型」ページ

新しい列挙型を追加するためには、「選択」フィールドに名前を入力した後、「追加」をクリックします。この名前は、visu_config における便宜上の名前にすぎません。リソース名はウィジェット資料にあるもの、あるいはリソースを特定できる文字列ならどのようなものでも使用することができます。そのファミリに対しての列挙型は、すべてが 1 つのリストに保持されるため、リソース名とともにウィジェット名を含めるとよいでしょう。

列挙型値の構成

処理を完了するには、列挙型リソースについての以下の情報を指定する必要があります。

  • リソースの種類
  • 可能値のリスト
  • デフォルト値
  • 各値に対してのコード記号
  • 各値に対してのリソースファイル記号

コード記号およびリソースファイル記号の獲得については、「リソースファイル記号の獲得」を参照してください。列挙型を構成する場合は、列挙型リストで選択を行い、「編集」をクリックします。すると、図 23-6 に示す列挙型エントリダイアログが表示されます。タイトルバーには列挙型の名前が表示されます。

 

    図 23-6 列挙型エントリダイアログ

リソース型を指定し、以下の説明に従って各値を構成します。構成の終了後、「適用」をクリックして新しい値を設定します。

種類の指定

「種類」フィールドにリソースの種類を入力します。

値の指定

列挙型の値のリストを獲得するには、ウィジェットの資料または公開ヘッダーファイルを調べます。それぞれの可能値に対して「エントリ」リストにエントリを作成します。リスト内のエントリは、リソースパネルのオプションメニューでしか使用されないため、どのような名前でも指定することができます。Sun WorkShop Visual は、 XmHORIZONTAL ではなく Horizontal のように、意味のわかる名前を使用します。

各値に対して、「選択」フィールドに名前を入力し、「追加」をクリックします。値の指定を省略しても致命的なエラーとはなりませんが、ユーザーは値を設定することができなくなるので注意してください。

値の構成

各値に対して、列挙型エントリのダイアログでコード記号およびリソースファイル記号を指定する必要があります。コード記号は、生成コードの値を表わす記号定数です。また、リソースファイル記号はリソースファイルの値を表わす文字列です。

コード記号は、ウィジェットの資料の値リストあるいはウィジェット・ソースコードを調べて見つけます。コード記号は「コード記号」フィールドに入力します。

値に対してのリソースファイル記号は、「リソースファイル記号」フィールドに入力します。多くの場合、リソースファイル記号は、コード記号を小文字にして接頭辞を取り除いたものですが、これ以外の場合もあります。たとえば、 XtJustifyCenter のリソースファイル記号は center です。

リソースファイル記号は、常にウィジェット資料にリストされているとは限りません。資料に記載がない場合、例として挙げられているリソースファイル、あるいはウィジェットの開発元から入手することができます。リソースコンバータに対してのソースコードを持っている場合、コードからリソースファイル記号を獲得することができます。この方法については、「リソースファイル記号の獲得」で説明します。

デフォルト値の指定

「列挙型」ページの値リストの最初のエントリは、デフォルト値に予約されています。このエントリは、明示的に設定されていないリソースを示すために使用されます。オプションメニューには、同じ値を明示的な名前で設定する必要があります。規約では、以下のリストに示すように、デフォルト値はその名前を括弧で囲むことによって識別します。

(Center)
Center
Left
Right

対応する明示的な値に対しては、同一のコード記号とリソース記号を指定します。

Sun WorkShop Visual は、列挙型に対してのオプションメニューをひとつ作成することに注意してください。ウィジェットが同一の列挙型のリソースを複数持っている場合、それらのリソースは同じオプションメニューを共有します。リソースが異なるデフォルト値を持っている場合は、一般的なデフォルト値 ( Default ) をオプションメニューに入力することをお勧めします。

デフォルト値の 1 つに対して、コードおよびリソース記号を入力します。これは、生成コードにおいて、あるいはウィジェットが最初にダイナミックディスプレイで作成される場合には、エラーにはなりません。ユーザーがこのリソースを明示的に設定し、その後で明示的にデフォルト値を要求する場合には、ダイナミックディスプレイは正確に動作しない場合があります。しかし、このような問題はウィジェットをリセットすると解消します。

エントリの順序の指定

「列挙型」ページリスト内の順序に従って、リソースパネルのオプションメニューにそれらのエントリが表示されます。デフォルト値は最初にリストされている必要がありますが、その他はどのような順序でもリストすることができます。エントリを異なる位置に移動するためには、リスト内で選択を行い、矢印ボタンを使用して上下に移動します。

リソースファイル記号の獲得

ここでは、 列挙型エントリダイアログに入力するために必要なリソースファイル記号を、ウィジェットのリソースコンバータ・コードから獲得する方法を説明します。リソースコンバータは、リソースファイルから読み出された文字列を、対応する値に変換するために使用される関数です。単純なコンバータには、以下のようなコードの断片が含まれています。

if (StringsAreEqual (in_str, "vertical"))
	i = XmVERTICAL;
else if (StringsAreEqual (in_str, "horizontal"))
	i = XmHORIZONTAL;

この例では、文字列 horizontal は値 XmHORIZONTAL に、 vertical XmVERTICAL に変換されます。 horizontal および vertical はリソースファイル記号です。また、 XmHORIZONTAL および XmVERTICAL はコード記号です。

この変換は、以下に示すコードにおいて間接的に確認することができます。

if (!haveQuarks) {
	XtQEhorizontal = XrmStringToQuark(XtEhorizontal);
	XtQEvertical = XrmStringToQuark(XtEvertical);
	haveQuarks = 1;
}
XmuCopyISOLatin1Lowered(lowerName, (char *)fromVal->addr);
q = XrmStringToQuark(lowerName);
if (q == XtQEhorizontal) {
	orient = XtorientHorizontal;
	done(&orient, XtOrientation);
	return;
}
if (q == XtQEvertical) {
	orient = XtorientVertical;
	done(&orient, XtOrientation);
	return;
}

このコードの場合、リソースファイル記号は記号定数 XtEhorizontal および XtEvertical で表されています。リソースファイル記号である horizontal vertical を獲得するためには、以下のような行の関連ヘッダーファイルを調べます。

#define XtEhorizontal "horizontal"
#define XtEvertical "vertical"

コードファイル記号である XtorientHorizontal XtorientVertical は、変換の最終結果です。この例においては、文字列がクォークに変換され、そのクォークが比較に使用される、という間接的なステップがあることに注意してください。変換関数のしくみは、visu_config に影響しません。

コンバータ

ユーザー定義ウィジェットが列挙型以外の非標準型のリソースを持っている場合、Sun WorkShop Visual はデフォルトでそれらのリソースをリソースパネルの「その他」のページに配置します。ウィジェット編集ダイアログを使用して、これらを別のページに割り当てることができます。テキストフィールドに文字列を入力して、設定できます。デフォルトでは、文字列はコードまたはリソースファイルに生成されますが、Sun WorkShop Visual はダイナミックディスプレイでそれらの設定を行いません。ダイナミックディスプレイでリソースを動作させる場合は、このリソースにコンバータ関数を使用すると、Sun WorkShop Visual を構成することができます。コンバータ関数は、テキスト文字列をリソース値に変換する関数です。

コンバータを構成するには、「表示」メニューから「コンバータ」を選択します。すると、図 23-7 に示されるページが表示されます。「エントリ」リストは、コンバータが指定されているファミリのリソース型のリストを含んでいます。

 

    図 23-7 ファミリ編集ダイアログの「コンバータ」ページ

リソース型

「選択」フィールドにリソース型を入力し、「追加」をクリックします。

内部で追加されるコンバータ

多くのウィジェットは、クラスが初期化されると独自のコンバータを内部で追加します。この場合、ユーザーが実行すべき作業は、「コンバータ」ページのリストにリソース型を追加することだけです。リストにリソース型が追加されると、コンバータが使用可能であることが Sun WorkShop Visual に知らされます。これが行われない場合、Sun WorkShop Visual はダイナミックディスプレイにリソースを設定しません。

ウィジェットクラスが独自のコンバータを追加するかどうかを判断するためには、ウィジェットの資料を調べる、あるいはウィジェットのクラス初期化メソッドに対してのコードで XtSetTypeConverter() への呼び出しを探します。コンバータが内部で追加されない、あるいはその可能性がある場合には、以下の説明に従って、明示的にコンバータを追加するように、Sun WorkShop Visual に指示します。

明示的に追加されるコンバータ

ウィジェットが内部的にコンバータを追加しない場合、明示的に追加を行うように Sun WorkShop Visual に指示することができます。これを行うには、まず、「コンバータ」テキストボックスにコンバータ名を指定します。コンバータは型 XtTypeConverter の関数でなければなりません。「コンバータ」ページには、「Sun WorkShop Visual に追加」(ダイナミックディスプレイで使用) および「コードに追加」(生成コードで使用) の 2 つのトグルボタンがあります。一般に、コンバータを明示的に追加する必要がある場合は、両方のトグルをオンにします。

ポップアップダイアログ

「ポップアップ」ボタンを使用すると、その型のすべてがリソースの設定に使用するためのポップアップダイアログを指定することができます。詳細は、次の「ポップアップ」を参照してください。

ポップアップ

リソースポップアップは、Sun WorkShop Visual のカラーおよびフォント選択パネル等のリソースを設定するために使用するダイアログです。ポップアップを持っているリソースには、通常のテキストフィールドに加え、ポップアップを呼び出すためのボタンがリソースパネル上に作成されます。図 23-8 に、Sun WorkShop Visual コアリソースパネルのポップアップボタンを示します。

 

    図 23-8 コアリソースパネル上のポップアップボタン

個々のリソースに対するポップアップ

ポップアップダイアログは、どのようなリソースに対しても指定することができます。ポップアップダイアログの指定を行うには、図 23-9 に示されているウィジェット編集ダイアログの右側を使用し、リスト内でリソース名を選択します。リストにリソースを追加していない場合は、 XtNresourceName などのリソースの定義名を「リソース」フィールドに入力し、その後「更新」をクリックします。

 

    図 23-9 ウィジェット編集ダイアログのポップアップ部分

このダイアログは、リソースの種類ではなくリソース名を使用します。したがって、同じ種類の異なるリソースに異なるポップアップを指定することができます。たとえば、型 XmRInt の特定のリソースに対してポップアップダイアログを指定する場合、そのポップアップは同一種類の他のリソースに対しては表示されません。

リソース名を入力した後、「ポップアップ」ボタンをクリックしてポップアップダイアログを表示します。「ポップアップダイアログ」に記述されている指示に従って、ポップアップを選択します。

リソース型に対するポップアップ

あるリソース型に対してコンバータを指定すると、その型に対してポップアップダイアログを指定することができます。これを行うには、 ファミリ編集ダイアログの「コンバータ」ページにある「ポップアップ」をクリックします。すると、ポップアップダイアログが表示されます。ポップアップの選択は、次の「ポップアップダイアログ」の手順に従って行います。

「ポップアップ」ダイアログ

図 23-10 に「ポップアップ」ダイアログを示します。

 

    図 23-10 「ポップアップ」ダイアログ

「ポップアップ」ダイアログは、現在のポップアップのリストを表示します。リストは、組み込まれている Sun WorkShop Visual ポップアップ作成関数に事前設定されています。

    表23-3 組み込みポップアップ

名前

ポップアップ

xd_colour_dialog_create

カラー選択

xd_font_dialog_create

フォント選択

xd_fsb_dialog_create

ファイル選択ダイアログ

xd_pixmap_dialog_create

ピックスマップエディタ

xd_string_dialog_create

コンパウンド文字列エディタ

現在選択されている個別のリソース、あるいはコンバータ型に対して既存のポップアップを適用するには、リスト内でポップアップ作成関数を選択して「適用」をクリックします。すべてのポップアップダイアログはリソース値を「 red 」または「 <big_font> 」などの文字列の形式で返すので注意してください。これによって、ポップアップダイアログは文字列として宣言されていても、フォント、色あるいはファイル名を指定するために使用されているリソースに対して動作するのです。

カスタム・ポップアップダイアログ

ポップアップダイアログを独自に作成し、リストに追加してリソースまたはコンバータ型に適用することができます。各ポップアップダイアログには、作成関数、初期化関数、更新関数の 3 種類の関数が必要です。各関数の名前を適切なテキストフィールドに入力し、「更新」をクリックしてポップアップをリストに追加します。

コード要件

ポップアップ関数は、それぞれ以下に示すようなタイミングで呼び出されます。

    表23-4 ポップアップ関数が呼び出されるタイミング

関数

呼び出されるタイミング

作成関数

ダイアログが最初にポップアップされる時

初期化関数

ユーザーがリソースボタンをクリックする時

更新関数

新しいウィジェットが選択される時

新しい値の設定、値の編集、ヘルプの呼び出しおよびダイアログのポップダウン等の追加機能に対してフックを設定するためには、ポップアップダイアログのウィジェットにコールバックを追加します。ダイアログには、少なくとも以下の標準コールバックを持たせます。

    表 23-5 ダイアログに追加するコールバック

コールバック

機能

Apply コールバック

ソース・テキストウィジェットに新しいリソースを設定する

Close コールバック

アンマネージしてダイアログをポップダウンする

リソースパネル上のテキストまたはテキストフィールドウィジェット (ソース・テキストウィジェットと呼ばれる) は、ダイアログからリソースパネルに情報を渡すために使用されます。ユーザーがポップアップダイアログに値を設定した場合、値はテキストに変換され、ソース・テキストウィジェットに設定されます。その後ユーザーは、リソースパネル上の「適用」をクリックして、ダイナミックディスプレイに、テキストの入力が行われたように値を設定することができます。

Sun WorkShop Visual でダイアログを構築する、あるいは手作業でダイアログを構築することが可能です。「ポップアップ例」では、Sun WorkShop Visualで構築されたポップアップダイアログを示しています。

作成関数

作成関数は、ユーザーが初めてリソースボタンをクリックしてダイアログをポップアップする時に呼び出されます。この関数は、ダイアログに対してのウィジェット階層を作成します。

void popup_create (Widget parent)

parent 引数は、Sun WorkShop Visual のアプリケーションシェル・ウィジェットで、ダイアログに対しての親ウィジェットとして使用されます。この引数は、 XmCreateDialogShell() などの関数を呼び出すために必要です。ポップアップダイアログを Sun WorkShop Visual で構築し、Sun WorkShop Visual の生成した作成手続きを作成関数として使用することも、あるいはそれを呼び出す作成関数のコードを書くことも可能です。この場合、Sun WorkShop Visual が生成した関数に parent を渡します。

初期化関数は作成関数の直後に呼び出されるため、初期化関数でウィジェットをマネージしている場合には、ウィジェットをマネージする必要はありません。

初期化関数

初期化関数は、ユーザーがダイアログをポップアップするためにリソースボタンをクリックするたびに呼び出されます。ダイアログが初めて呼び出されると、作成関数の後に初期化関数が呼び出されます。関数は、ダイアログをマネージして目に見えるようにし、ダイアログ内のフィールドを初期化します。初期化関数にはソース・テキストウィジェット、現在選択されているウィジェットおよびリソース名が渡されます。

void popup_initialize(Widget source_text, Widget current, char *resource_name )

source_text 引数は、リソースパネル上のソース・テキストウィジェットです。このウィジェットは、リソースパネルに現在表示されているリソース値を獲得するために使用できます。ソース・テキストウィジェットは、ダイアログから新しい値を返すために使用されるため、初期化関数では、ソース・テキストウィジェットを静的変数に保存して、後で使用できるようにしなければなりません。

current は、現在選択されているウィジェットを表わします。初期化関数は現在選択されているウィジェットが予期したとおりのリソースを持っているかどうかを検査します。これは、ユーザーが異なる種類のウィジェットを選択した後で、リソースパネルからポップアップダイアログを呼び出すことができるようにするためです。ユーザーが階層からすべてのウィジェットを削除した場合には、 current NULL になります。

resource_name には、定義名ではなく、リソース名 (「label」等の文字列) を渡します。この引数は、複数のリソースを設定するために同じポップアップを使用する場合に特に役立ちます。

更新関数

更新関数は、ウィジェット階層において選択が変更された後に、すべてのポップアップダイアログに対して呼び出されます。

void popup_update( Widget current )

current は、新しく選択されたウィジェットを表します。更新関数は、新しく選択されたウィジェットが異なるクラスである場合、あるいは current NULL である場合には、「適用」ボタンが応答不能になります。複数のリソースの設定に同一のダイアログを使用する場合、安全性を考慮して、すべてのクラスにおいて「適用」ボタンを応答不可能にすることをお勧めします。そうすると、ユーザーはポップアップを使用するためにリソースボタンを再度クリックしなければなりません。この手順により初期化関数が呼び出され、意図されたリソースが確実に設定されるようになります。

ポップアップ例

この例は、整数値を選択するために使用するスライダを持つ、単純なリソースポップアップを示します。ユーザーがポップアップにおいて「適用」をクリックすると、スライダの値はテキスト文字列に変換され、リソースパネルのテキストウィジェットに配置されます。

ダイアログそのものは、Sun WorkShop Visual で構築しました。そのダイアログのシェルを、データ構造体としてデザインして、以下に示す構造になっています。ダイアログ内にある名前付きのウィジェットは、構造ポインタ foo_dialog を使用して簡単に呼び出すことができます。たとえば、 foo_dialog->scale はスケールウィジェットを呼び出します。

typedef struct foo_dialog_s {
	Widget foo_dialog;
	Widget form;
	Widget scale;
	Widget apply;
	Widget close;
} foo_dialog_t, *foo_dialog_p;
static foo_dialog_p foo_dialog = (foo_dialog_p) NULL;

以下の関数は、シェルおよびそのすべての子を作成するために生成されます。生成される関数の主要部は省略します。

foo_dialog_p create_foo_dialog (Widget parent)
{

/* Sun WorkShop Visual が生成したダイアログ生成コードは省略します。*/

}

モジュール・プレリュードにおいては、ソース・テキストウィジェットを保存するために静的変数が作成されます。初期化関数は、ソース・テキストウィジェットを提供します。

static Widget source_text;

ダイアログには、「適用」ボタンおよび「閉じる」ボタンがあり、それぞれのボタンは活性化コールバックを持ちます。「適用」ボタンは、以下に示すコールバック関数を呼び出します。コールバック関数はスケールの現在値を獲得するとそれをテキスト文字列に変換し、ソース・テキストウィジェットに設定します。これだけではリソースは設定されないので注意してください。ユーザーは、リソースパネルの「適用」をクリックする必要があります。

static void
foo_do_apply (Widget w, XtPointer client_data, XtPointer call_data )
{
	int i;
	char buf[52];
	XmScaleGetValue ( foo_dialog->scale, &i );
	sprintf ( buf, "%d", i );
	XmTextSetString ( source_text, buf );
}

ダイアログは「閉じる」ボタンも持っています。このボタンの活性化コールバック関数は、ダイアログのシェルウィジェットの子をアンマネージします。

static void
foo_do_close (Widget w, XtPointer client_data, XtPointer call_data )
{
	XtUnmanageChild ( foo_dialog->form );
}

作成関数は Sun WorkShop Visual が生成した作成関数を呼び出し、ウィジェット構造体を保存します。

foo_create(Widget parent)
{
	foo_dialog = create_foo_dialog( parent );
}

初期化関数は、ソース・テキストフィールドからテキストを抽出して整数に変換し、スケールを設定して現在の値を反映させます。この関数は、ソース・テキストフィールドを保存するため、 スケールを使用して設定される新しい値をソース・テキストフィールドに適用することができます。また、現在のウィジェットのクラスに基づいて「適用」ボタンを有効化あるいは無効化し、ダイアログを可視状態にします。

foo_initialize( Widget text, Widget current)
{
	char *source_value;
	int i;
	source_text = text;
	source_value = XmTextGetString( source_text );
	i = atoi( source_value );
	XtFree( source_value );
	XmScaleSetValue( foo_dialog->scale, i );
	XtSetSensitive( foo_dialog->apply, 
		current && XtIsSubclass (current, fooWidgetClass ) );
	XtManageChild( foo_dialog->form );
}

更新関数は、現在のウィジェットのクラスに基づいて、「適用」ボタンを有効化あるいは無効化します。

 foo_update( Widget current )
{
 	XtSetSensitive( foo_dialog->apply, 
		current && XtIsSubclass ( current, fooWidgetClass ) );
}

リソースメモリー管理

Sun WorkShop Visual は、XmString および文字列 (char *) 型のリソースに対してのデフォルトメモリー管理モデルを設定しています。XmString 型リソースの場合、このモデルは、 SetValues および GetValues の両方において、ウィジェットが XmString をコピーする (つまり、アプリケーションは GetValues あるいは SetValues の後に XmString を解放することができる)と仮定しています。

文字列リソースの場合、ウィジェットは文字列を SetValues でコピーしますが、GetValues ではコピーしないことになっています (つまり、アプリケーションは SetValues の後にのみ XmString を解放します)。このモデルに適合しないリソース (典型的なところでは、XmString リソース。これは GetValuesでコピーされません。) を持っている場合には、「リソース」の領域にあるオプションメニューを使用して Sun WorkShop Visual のデフォルト動作を書き換えることができます。XmString が GetValues でコピーされない場合は、ウィジェットの編集ダイアログ上の「GetValues」オプションメニューを「解放しない」に設定します。同様に、ウィジェットによって GetValues でコピーされた文字列リソース (ラベルウィジェット内の XmNmnemonicCharset など) を持っている場合には、「GetValues」オプションメニューを「解放」に設定します。

Sun WorkShop Visual がデフォルトでリソースを解放しないようにするには、「デフォルトは解放しない」トグルをオンにします。

不適切な状況でメモリーを解放すると Sun WorkShop Visual はクラッシュするため、注意してください。メモリーを解放すべき状況で Sun WorkShop Visual がメモリーを解放しない場合は、単にメモリーリークとして蓄積するだけなので、危険度が少ないと言えます。

XmStringTable リソース

Sun WorkShop VisualがXmStringTable リソースを正しく扱うためには、Table のエントリ数をカウントに使用する整数型のリソースも指定しなければなりません。XmStringTable のためリソース指定を追加してください。

ヘッダー

visu_config は、構成ファイルおよびコードファイルの 2 つのコードモジュールを生成します。visu_config では、これらの各ファイルに対してヘッダーリストの指定を行うことができます。ヘッダーの指定には、ファミリ編集ダイアログを使用します。図 23-11 に示すように、表示メニューから 「コード統合ヘッダー」 を選択すると 「コードヘッダー」 ページが表示され、「構成統合ヘッダー」 を選択すると 「構成ヘッダー」 が表示されます。

 

    図 23-11 ファミリ編集ダイアログの 「コードヘッダー」 ページと 「構成ヘッダー」 ページ

ヘッダーリストは、各ファイル別に存在します。ヘッダーを追加するには、引用符または各括弧を使用せずにファイル名を入力し、「追加」をクリックします。ヘッダーを削除するには、ヘッダーを選択して「削除」をクリックします。リストの順序を変更する場合は、ヘッダーを選択し、矢印ボタンを使用してそのヘッダーを上下に移動します。

コードファイルは、ユーザー定義ウィジェットクラスのウィジェットクラス・レコードを定義します。visu_config は、ウィジェット編集ダイアログから取り出すウィジェットクラス・ヘッダーに対しての #include を自動的に生成します。多くの場合、追加のコードヘッダーは必要ありません。

構成ファイルには、ユーザー定義のウィジェット、列挙型および別名のリストがあります。ユーザー定義クラスのウィジェットヘッダーは、このファイルには自動的に生成されません。非標準列挙型またはリソース型を使用して visu_config を構成する場合は、それらが定義されているヘッダーファイルを構成に含めます。

コードを生成してコンパイルすると、簡単に必要なヘッダーファイルを探し出すことができます。コンパイラが未定義のリファレンスを返す場合には、必要な定義を含んでいるヘッダーを探し出し、そのヘッダーをファイルのヘッダーリストに追加します。その後、コードを再生成して再試行します。

Motif ウィジェットの停止リスト

visu_config を使用して、選択された Motif ウィジェットが Sun WorkShop Visual に表示されないようにする (停止する) ことができます。停止となったウィジェットは、ウィジェットパレットには表示されません。既存のデザインファイルから読み出されている場合は、これらのウィジェットは正確に動作しますが、これらを階層で選択したり、あるいは対話的に作成することはできません。たとえば、プログラムを作成する会社の方針に区画ウィンドウウィジェットが適合しない場合には、この機能を使用してユーザーが区画ウィンドウウィジェットを使用しないようにすることができます。

ウィジェットを停止するためには、メイン visu_config ダイアログの編集メニューをプルダウンして「停止リスト」を選択し、図 23-12 に示すようなダイアログを表示します。

 

    図 23-12 「停止された Motif ウィジェット」ダイアログ

ウィジェットパレットから Motif ウィジェットを取り除くためには、停止させたいウィジェットのトグルを選択して「適用」をクリックします。

visu. stopList リソースを設定することによっても、ウィジェットを停止することができます。詳細は、「FrameMaker」を参照してください。リソースを使用して停止したウィジェットは、リソースファイルを使用すれば簡単に活性化することができますが、 visu_config で停止されたウィジェットは、Sun WorkShop Visual を再構築することによってのみ活性化することができます。

ユーザー定義ウィジェットは、このダイアログを使用して停止することはできません。Sun WorkShop Visual で使用できるユーザー定義ファミリのセットは、次の「コードの生成とコンパイル」で説明するように、visu_config の生成ダイアログで選択することができます。

コードの生成とコンパイル

「生成」メニューには、「構成ファイル」、「コードファイル」、「スタブ」という 3 つのオプションがあります。このうち、「構成ファイル」と「コードファイル」のオプションは、2 つの構成ファイルを生成するために使用されます。各オプションで表示されるページは、図 23-13 に示されているようによく似ています。組み込むファミリの選択にはトグルボタンを使用します。それぞれに対して同じファミリセットを使用して、両方のファイルを生成します。

 

    図 23-13 「構成ファイル」および「コードファイル」ダイアログ

コンパイル

$VISUROOT/user_widgets/Athena にあるサンプルのメークファイルは、 config.c という名の構成ファイル、 Athena.c という名のコードファイル、そして構成関数を含んでいる Athenaextras.c という名のファイルをコンパイルします。これらのファイルおよびすべての Athena アイコンビットマップは、 $VISUROOT/user_widgets/Athena に配置されています。このメークファイルを使用して Athena の例をコンパイルすることができます。その結果、 visu. bin という実行ファイル が生成されます。このファイルは Sun WorkShop Visual 実行ファイルの構築に使用されます。

他のウィジェットを使用して構成する場合は、出発点として例題のメークファイルを使用してください。メークファイルが、アイコンビットマップ・ファイルおよび必要なヘッダーファイルを含んでいるすべてのディレクトリを確実に参照するようにしてください。

コンパイルに失敗した場合は、生成されたコードを調べて原因をつきとめます。原因がヘッダーの欠落である場合は、ファミリ編集ダイアログの 「コードヘッダー」 と 「構成ヘッダー」 ページに、別のヘッダーを追加してください。コンパイラは、visu_config ダイアログのスペルミスも検出します。問題を解決してコードと構成ファイルを再度生成し、コンパイルします。

リンカーはスペルの誤った関数名を検出します。 visu_config においてスペルミスがある場合には、そのミスを正し、コードおよび構成ファイルを再生成して再度コンパイルしてください。

Sun WorkShop Visual でのウィジェットの使用

環境変数 USER_WIDGETS はユーザー定義ウィジェットを含むディレクトリ (この例では Athena) に正しく設定して、$VISUROOT/bin の標準 visu コマンドを実行することで、実行可能ファイルが呼び出されます。これによって、$XBMLANGPATH にユーザーの使用するビットマップまたはカラーアイコンを含むディレクトリが追加され、$XFILESEARCHPATH の $VISUROOT/lib/locale/<ロケール>/app-defaults がユーザーの使用する app-defaults によって上書きされます。

$VISUROOT/user_widgets ディレクトリに、ユーザーウィジェットのディレクトリへのシンボリックリンク「local」を作成すると、ユーザーすべてに対してデフォルト設定を行うことができます。この場合は、USER_WIDGETS 設定によって明示的に上書きしない限り、すべてのユーザーがデフォルトで指定したバージョンの Sun WorkShop Visual を使用することになります。USER_WIDGETS に認識できない値が含まれていた場合、またはユーザーウィジェットを含むディレクトリで visu. bin が構築されなかった場合は、シンボリックリンクによって設定されたデフォルト設定、または標準設定の Sun WorkShop Visual が起動されます。

抽象的な子のアクセス

Sun WorkShop Visual では、他社の複合ウィジェットの抽象的な子への完全なアクセスが提供されています。複合ウィジェット MotifScrolledWindow の場合、抽象的な子はスクロールバーです。

次のリソースで抽象的な子へのアクセスを制御できます。

visu.abstractObjects: true

リソースはデフォルトで 「true」 です。この場合、他社のウィジェットの子にアクセスできます。「false」 の場合は、子は表示されません。

visu_config で複合ウィジェットのアクセス可能性を構成できます。詳細は、「抽象的な子として編集」を参照してください。

他社のウィジェットの子であっても、リソースパネルを介して完全に構成することができます。ただし、デザインから取り除くことはできません。

生成したコードで他社のウィジェットの構成要素にするために、Sun WorkShop Visual は XtNameToWidget を呼び出します。この構成要素には、通常、固有の名前が付けられています。ウィジェットに固有の名前が付けられていない場合に XtNameToWidget を使用しても正しく動作しません。このような場合は、生成したコードを編集して、別の方法でウィジェットにアクセスしなければなりません。

Sun WorkShop Visual は、他社のウィジェットの子に対しては、クロスプラットフォームコード (MFC または Java) を生成しません。ルートウィジェットの代わりに、キャンバスなどのプレースホルダーが追加されます。

構成のテスト

ここでは、ユーザー定義ウィジェットに対しての Sun WorkShop Visual インタフェースの推奨テスト手順を説明します。指示通りに visu_config を使用することで問題箇所を修正することができます。これらのテストは、ウィジェットが Sun WorkShop Visual に設定された方法についての問題を検出するためのものです。したがって、ウィジェット自体のテストは行いません。

ウィジェットの作成

    注 - このテキストは、ウィジェット属性パネルの「ウィジェットを作成」トグルがオフの場合には適切ではありません。

Sun WorkShop Visual を実行し、ユーザー定義ウィジェットのアイコンが正しく表示されているかどうかを確認します。小画面 Sun WorkShop Visual を使用している場合は、smallxd という名前を使用して Sun WorkShop Visual を起動し、正しいアイコンが表示されていることを確認します。

ユーザー定義ウィジェットのインスタンスを含んでいる階層を作成します。ウィジェットが追加される際に Sun WorkShop Visual を実行できない場合は、リアライズ関数が必要になることもあります。詳細は、「構成関数」を参照してください。Sun WorkShop Visual が実行できず、高さ/幅がゼロについての X エラー・メッセージが表示された場合は、ウィジェットのリアライズ関数を sizedCreate() ( Athenaextras.c にある) にして再試行します。

それでも実行できない場合は、visu_config の「前景スワップの使用禁止」トグルを設定します。

前景スワップ

前景スワップを使用禁止にしない場合は、ユーザー定義ウィジェットを含んでいる階層が作成されます。階層内においてシェルを選択し、次にユーザー定義ウィジェットを選択します。ウィジェットを選択すると、そのウィジェットがダイナミックディスプレイにおいて正しく強調表示されることを確認してください。問題が生じた場合は、visu_config の「ウィジェット」ページの「前景スワップを禁止」トグルを設定してください。

定義名

すべてのリソースが設定されているユーザー定義ウィジェットのインスタンスを含んでいるダイアログを作成します。Sun WorkShop Visual から C を生成してコンパイルします。コンパイルに失敗した場合は、以下のようにメッセージが表示されます。

XtNfoo undefined

このようなメッセージを受け取った場合は、まず、生成コードがウィジェットクラスに対して正しい公開ヘッダーを含んでいることを確認します。正しい公開ヘッダーが含まれていない場合は、visu_config のウィジェット編集ダイアログの「インクルードファイル」フィールドで修正してください。

ヘッダーが正しく生成されたにもかかわらずコンパイルできない場合は、定義名関数が必要です。公開ヘッダーにおいて以下のような行を探してください。

#define <something> "foo"

<something> が XtNfoo 以外の場合、定義名関数が必要です。詳細は、「構成関数」を参照してください。

ページ

ユーザー定義ウィジェットのリソースが特定のページに表示されるように指定した場合は、その指定が実行されていて、かつ必要なページがすべて存在していることを確認します。

コンバータ

ユーザー定義ウィジェットに対するソースパネルの「その他」ページを表示します。テキストウィジェットに有効なリソース値が入力でき、それらの値がウィジェットに正しく適用されることを確認します。リソースコンバータが存在しないことを示すメッセージを受け取った場合は、 「コンバータ」ページの「WorkShop Visual に追加」を設定する必要があります。

列挙型

ユーザー定義ウィジェットに対するリソースパネルの「設定」ページを表示します。オプションメニューが、すべてのメニュー上部に括弧で囲まれたデフォルト値を持っていることを確認してください。

「その他」のページが存在する場合は、そのページを表示します。列挙型リソースが、visu_config において構成されていない場合は、「その他」ページに表示されます。このページに列挙型リソースが表示された場合は、visu_config に戻り、それらのリソースを追加します。

デフォルトを含め、列挙型に対して各値を順番に設定してください。各値がダイナミックディスプレイにおいて意図した通りに動作し、生成コードが正確にコンパイルを行うことを確認します。

ポップアップダイアログ

リソースにカスタム・ポップアップダイアログを指定した場合は、各リソースが表示されるリソースパネルのページを表示します。リソースパネルが、ポップアップダイアログを持つそれぞれのリソースに対してボタンを表示することを確認してください。表示されているボタンをクリックしてみます。ダイアログが表示され、そのリソースの現在の値でダイアログが正しく初期化されていることを確認してください。

ダイアログにリソースを設定します。リソースパネル上のテキストウィジェットが正確に更新されることを確認してください。リソースパネルから設定を適用し、ダイナミックディスプレイで結果を確認します。

ダイアログに「閉じる」ボタンがある場合、それが意図した通りに作動し、リソースパネル上のボタンがクリックされた際にダイアログが再度表示されることを確認してください。

コード検査

最後に、生成コードが正確であることを確認します。生成コードをチェックするには、各リソースを順番に設定して、C コードファイルと X リソースファイルを生成し、それらが意図したとおりのものであることを確認します。

すべての Motif ウィジェットに対してのコード検査は、Sun WorkShop Visual リリースプロセスの一部として行われます。したがって、Motif ウィジェットから派生したユーザー定義ウィジェットを持っている場合は、ユーザーはユーザー定義ウィジェット独自のリソースのテストに集中することができます。また、テスト済みである別のユーザー定義ウィジェットから派生したユーザー定義ウィジェットを持っている場合でも同様です。

構成関数

visu_config は、Sun WorkShop Visual のユーザー定義ウィジェットの処理をカスタマイズするための構成関数の指定を要求します。ここでは構成関数の定義および例を述べます。

構成関数を追加するには、ウィジェットクラスに対する visu_config のウィジェット編集ダイアログに関数の名前を指定した後、visu_config からコードおよび構成ファイルを再生成します。メークファイルを編集して、構成関数に対してのコードを含んでいるファイルをコンパイルしリンクします。

Athena ウィジェットを Sun WorkShop Visual に統合するために使用される構成関数の例については、$VISUROOT/user_widgets/Athenaextras.c1 を参照してください。

リアライズ関数

デフォルトでは、Sun WorkShop Visual は XtCreateWidget() を呼び出すことによってダイナミックディスプレイにウィジェットを作成しますが、その代わりとしてリアライズ関数を提供することもできます。リアライズ関数は、Sun WorkShop Visual においての作成時に問題が生じるウィジェットに対してのみ必要です。

リアライズ関数のプロトタイプ

リアライズ関数は、以下の形式をとります。この関数は、 XtCreateWidget() と同じ引数を使用し、同じ結果を返します。

Widget realize( char *name, WidgetClass class, Widget parent, ArgList args, Cardinal arg_count )

リアライズ関数に渡される ArgList は、常に空です。

リアライズ関数の例

Athena Form ウィジェットのようなコンポジットウィジェットには、作成時にその寸法が明示的に設定されない限り、子なしでは実体化できないものがあります。寸法が明示的に設定されない場合は、ウィジェットはゼロサイズで作成され、X エラーが生じます。ダイナミックディスプレイにおいてこの問題を解消するために、下に示すようなリアライズ関数 ( Athenaextras.c にあります) を提供することができます。この関数はウィジェットの幅および高さのリソースをゼロ以外の値に初期化して、 XtCreateWidget() を呼び出し、その結果を返します。

WidgetsizedCreate( char *name, WidgetClass class, Widget parent, ArgList args, Cardinal arg_count )
{
	Arg al[2];
	int ac=0;
	XtSetArg(al[ac], XtNheight, 20); ac++;
	XtSetArg(al[ac], XtNwidth, 20); ac++;
	return XtCreateWidget ( name, class, parent, al, ac);
}

リアライズ関数は、Sun WorkShop Visual がダイナミックディスプレイにウィジェットを作成する際にのみ使用されます。生成コードには反映されません。

定義名関数

コードファイルおよび X11 リソースファイルの両方を生成するために、Sun WorkShop Visual は label のようなリソース名と、それに対応する XtNlabel のような定義名の両方を使用します。Sun WorkShop Visual は、ウィジェットクラスのレコードから直接名前を取り入れます。デフォルトでは、Sun WorkShop Visual は接頭辞 XtN を追加することによって、名前から記号定数を派生させます。

ウィジェットがこの規則に従っていない場合は、 定義名関数を使用して Sun WorkShop Visual を構成することができます。定義名関数は、リソース名を対応する記号定数に変換するカスタム関数です。ウィジェットに定義名関数が必要かどうかを判断するには、そのウィジェットクラスの公開ヘッダーを調べます。ヘッダーファイルは、以下に示すような記号定数とその値を定義する行を含んでいます。

#define XtNlabel "label"
#define XtNfont "font"
#define XtNinternalWidth "internalWidth"

なんらかの定義名が命名規則に従っていない場合は、定義名関数が必要です。たとえば、Motif を含む多くのウィジェット・ツールキットは、以下に示すようなさまざまな接頭辞を使用しています。

#define XmNbuttons "buttons"
#define XmNbuttonSet "buttonSet"
#define XmNbuttonType "buttonType"

定義名関数のプロトタイプ

定義名関数は以下の形式をとります。

char *defined_name ( char *name )

定義名関数に、リソース名を含む文字列が渡されると、対応する定義名を含む文字列が返されます。定義名関数は、Sun WorkShop Visual の内部定義名関数である def_defined_name() を参照することができます。この関数は、単純にリソース名にデフォルトの XtN 接頭辞を追加します。

    注 - 関数名 defined_name および def_defined_name はすでに Sun WorkShop Visual で使用されているため、これらの名前は使用しないようにしてください。

定義名関数の例

Athena の Clock ウィジェットリソース hands の定義名は、 XtNhands ではなく XtNhand です。したがって、Clock ウィジェットは、以下に示す定義名関数を必要とします。

char *clock_defined_name( name )
	char *name;
{
	/*
	 * XtNhand は hands として定義されているので単純に
	 *	XtN を前に補足するだけでは不十分です。
	 */
	if ( strcmp ( name, "hands" ) == 0 )
		return "XtNhand";
	return def_defined_name ( name );
}

hands を除くすべての Clock リソースは命名規則に従っているため、それらのリソースの変換には def_defined_name() が使用されます。

「子を追加可能」および「適切な親」関数

「適切な親」および「子を追加可能」関数を指定し、ユーザー定義ウィジェットに関する有効な親子関係の規則を定義することができます。これらの規則は、パレットアイコンのグレー表示、新しく作成されたウィジェットの自動選択、および構成領域におけるアイコンのドラッグなどの Sun WorkShop Visual の機能を制御します。

多くの場合、これらの関数は必要ありません。これらの関数を指定しない場合、Sun WorkShop Visual はウィジェットクラスの最初に認識した祖先に対しての規則を使用します。たとえば、ユーザー定義ウィジェットが Primitive クラスから派生している場合、Sun WorkShop Visual は Primitive クラスの規則を使用するため、ユーザーによるウィジェットへの子の追加は許可しません。

「適切な親」および「子を追加可能」関数は、他のウィジェットの規則と組み合わされます。たとえば、Sun WorkShop Visual はすでに、メニューバーウィジェットは子としてカスケードボタンのみを持つことができる、という規則と組み合わされているため、ユーザーがウィジェットをメニューバーの子に指定することを禁止するための「適切な親」関数は必要ありません。ウィジェットクラスに追加の規則がある場合に限り、これらの関数を指定する必要があります。

Motif 以外のコンポジットウィジェットを使用して Sun WorkShop Visual を構成する場合は、ウィジェットクラスに「子を追加可能」関数を指定して Motif の子を持たないようにする必要があります。Motif ウィジェットは、その親が Motif ウィジェットであることを前提としているため、Motif ウィジェット以外の子に指定されると、Sun WorkShop Visual はコアダンプする可能性があります。

「適切な親」関数のプロトタイプ

「適切な親」関数は、ユーザーがユーザー定義クラスのウィジェットを階層に追加しようとする、あるいはユーザー定義のウィジェットを他の親にドラッグまたはコピーしようとする場合に呼び出されます。この関数は、ユーザー定義ウィジェットを選択したウィジェットの子として追加することができるかどうかを判断します。

「適切な親」関数は以下の形式をとります。

Boolean is_appropriate_parent ( parent, childclass )
Widget parent;
WidgetClass childclass;

最初の引数は、指名された親ウィジェットである、階層内のウィジェットのインスタンスです。2 番目の引数は、新しいウィジェットクラスへのポインタです。指名された親ウィジェットへの新しいクラスの子の追加が有効な場合は、関数は TRUE を返し、その他の場合には FALSE を返します。

「適切な親」関数には指名された親ウィジェットのインスタンスが渡されるため、親ウィジェットのクラス、あるいは状態に基づいて規則を作成することができます。たとえば、ユーザーがユーザー定義クラスの子を追加する前に、親ウィジェットの寸法、祖先ウィジェット、あるいはその他の子をチェックすることができます。

「適切な親」関数の例

デフォルトでは、Sun WorkShop Visual はフォームおよびローカラムのような Motif マネージャウィジェットにどのような子でも持たせることができます。「適切な親」関数を使用すると、ウィジェットを特定のクラスの子に限定することができます。たとえば、ウィジェットを描画領域の子に限定する場合は、指名された親ウィジェットが描画領域である時には TRUE を返し、それ以外は FALSE を返す、「適切な親」関数を指定します。この場合のコードは、以下に示すように非常に単純なものです。

Boolean drawing_area_parent ( w, class )
Widget w;
WidgetClass class;
{
	if ( XtClass ( w ) == xmDrawingAreaWidgetClass )
		return True;
	return False;
}

「子を追加可能」関数のプロトタイプ

「子を追加可能」関数は以下の形式をとります。

Boolean can_add_child (parent, childclass)
XWidget_p parent;
WidgetClass childclass;
{
...
}

この関数は、2 つの目的に使用されます。Sun WorkShop Visual は「子を追加可能」関数を呼び出して、特定のクラスのウィジェットが有効なユーザー定義ウィジェットの子であるかを判断します。また、Sun WorkShop Visual は「子を追加可能」関数を呼び出して、新しく作成されたユーザー定義ウィジェットのインスタンスを自動的に選択するかどうかも決定します。

最初の引数は、ユーザー定義ウィジェットクラスの既存のインスタンスへのポインタです。親ウィジェットインスタンスは、ウィジェットインスタンスを表わす内部 Sun WorkShop Visual データ型である XWidget_s 構造体に渡されます。この構造体のフィールドの 1 つは、ウィジェットインスタンスへのポインタです。 XWidget_s 構造体の資料については、 $VISUROOT/user_widgets/hdrs/xwidget.h を参照してください。

2 番目の引数は、指名された子ウィジェットクラスへのポインタ、あるいは NULL です。第 2 引数が NULL 以外である場合、Sun WorkShop Visual は指名された子クラスについての問い合わせを行います。子が追加できる場合には、関数は TRUE を返し、追加できない場合には FALSE を返します。子ウィジェットはインスタンス化されていないため、親インスタンスへのポインタはあっても、子に対してのポインタは存在しないので注意してください。関数は、ユーザー定義ウィジェットのインスタンスが現在の状態に基づいて規則を作成することがあります。たとえば、ウィジェットが限られた数の子だけを受け取るようにする関数を作成することができます。第 2 引数が NULL である場合は、ユーザーはそのクラスのウィジェットしか作成していません。

「子を追加可能」関数が TRUE を返す場合、Sun WorkShop Visual は階層内に新しく作成されたウィジェットを選択します。それ以外の場合は、親ウィジェットが選択されたままとなります。この場合、「子を追加可能」関数は、ウィジェットがすべての種類の子を持つことができる場合は通常 TRUE を返し、それ以外は FALSE を返します。

「子を追加可能」関数の例

以下の例は、「子を追加可能」関数を示しています。

Boolean paned_can_add_child (XWidget_p xw, WidgetClass class) {

/* このウィジェットクラスの新しく作成されたインスタンスに対し、新しく作成されたウィジェットを現在階層で選択されているウィジェットにします。*/

if (class == NULL)
	return TRUE;

/* 描画領域およびスクロールバーを除くすべての子を許可します。 */

if	( class == xmDrawingAreaWidgetClass || class == xmScrollBarWidgetClass )
	return False;
else
	return True;
}

UIL の生成

他社のウィジェットに対しても UIL を生成することができます。UIL を生成するうえで Sun WorkShop Visual に必要な情報は、ウィジェット統合キット2 に納められています。新しい他社のウィジェットセットを統合する場合は、Sun WorkShop Visual のリソースに必要な情報をさらに指定する必要があります。

他社のウィジェットの UIL コードを生成するリソース

他社のウィジェットに対して UIL コードを生成するには、ヘッダーファイル、作成関数、テンプレートファイルに関する必要な情報を Sun WorkShop Visual に指定する必要があります2。頻繁に使用するウィジェットセットについては、この情報はすでに提供されています。詳細は、Sun WorkShop Visual のご購入先までお問い合わせください。

通常はほとんど使用しないウィジェットセットを使用する場合は、次の情報が必要です。

    1. 「UIL ヘッダーファイル」

    2. 「UIL 作成関数」

UIL ヘッダーファイル

他社のウィジェットに UIL ヘッダーファイルが関連付けられている場合は、次のように指定します。

visu.xw_<他社のウィジェットクラス>.uilHeaderFile: foo.uil

たとえば、XRT 3D ウィジェットは次のように定義します。

visu*xw_XtXrt3d.uilHeaderFile: Xrt3d.uil

    注 - UIL ヘッダーファイルは XRT ウィジェットセットに組み込まれています。

UIL ヘッダーファイルに組み込まれていない多くのウィジェットセットでは、Sun WorkShop Visual からの UIL コード生成を可能にするためにヘッダーファイルが作成されています。ヘッダーファイルは次の場所にあります。

$VISUROOT/user_widgets/USER_WIDGET_NAME/code_templates/UIL

$VISUROOT は、Sun WorkShop Visual のインストールディレクトリです。

他社のウィジェットに対して生成された make テンプレートには、通常のウィジェットベンダーの位置の他に、この code_templates ディレクトリを自動的にインクルードできる UILFLAGS セットがあります。そのため、XRT の場合、メークファイルには次の行が含まれます。

UILFLAGS=-I${XRTHOME}/include/Xm ...

このようにして、UIL ヘッダー付きの他社のウィジェットが構築されます。

UIL 作成関数

Motif 以外のウィジェットは UIL ヘッダーファイルで作成関数の事前宣言を行う必要がありますが、他社製のすべてのウィジェットでこの宣言が行われているとは限りません。そのため、Sun WorkShop Visual では、UIL を取得して他社のウィジェットを作成する場合に作成関数を制御する、 2 つのリソースを準備しています。次のような場合は、使用するリソースを考慮してください。

    1. 指定のヘッダーファイルですでに関数が宣言されている

    2. ウィジェットクリエータ名が指定されていない

    3. 事前定義されたクリエータが存在しない

    4. ウィジェットの作成に特別な処理が必要

    注 - UIL では同一関数を複数回宣言することは避けるべきです。したがって、状況がどうであれ、宣言を単純に生成することはできません。そのため、Sun WorkShop Visual が宣言の生成時期を判断できるように、2 つのリソースが用意されています。

上記の 4 点については、以下で詳細に説明します。

すでに関数が宣言されている

ヘッダーファイルですでに関数が宣言されている場合は、Sun WorkShop Visual で生成が必要な名前を次のように指定します。

visu*xw_<他社のウィジェットクラス>.uilBuiltinProcedureName: the_procedure_name

たとえば、XRT の UIL クリエータ XtCreateXrt3d が Xrt3d.uil ですでに宣言されている場合、Sun WorkShop Visual には生成する名前を指定するだけです。

visu*xw_XtXrt3d.uilBuiltinProcedureName: XtCreateXrt3d

生成したUILには、次のようなコードが表示されます。

object some_third_party_object: user_defined the_object_creator_procedure_name 

この XRT の例では、次のコードが生成されます。

include_file "Xrt3d.uil";
object my_xrt_3d_variable: user_defined XtCreateXrt3d;

ウィジェットクリエータ名が指定されていない

ウィジェットの作成者がウィジェットクリエータ名を指定しなかった場合は、クリエータの呼び出しだけでなく、宣言も Sun WorkShop Visual で生成する必要があります。

次のように指定した場合、

visu*xw_<他社のウィジェットクラス>.uilProcedureName:
the_procedure_name

次のコードが生成されます。

include_file "AnySpecifiedUilHeader.uil";
 
/* AnySpecifiedUilHeader.uil にすでに指定されている場合、次の行は無効 */
procedure the_procedure_name();  
...
object my_third_party_variable: user_defined the_procedure_name;

事前定義されたクリエータが存在しない

事前定義されたクリエータが存在しないということは、下位レベルの汎用 XtCreateWidget( ) 呼び出しを置換する XmCreatePushButton が存在しないのと同じことです。

このような場合、Sun WorkShop Visual は、UIL ファイルに以下のものを生成します。

    1. 名前がウィジェットクラスから構成されているクリエータ

    2. 宣言

    3. C と同じ名前の実関数
        この実関数はラップされます。

生成されるコンストラクタの形式は xdUilCreate<ウィジェットクラス名> です。

UIL のリソースが設定されていない他社のウィジェットを Sun WorkShop Visual で使用すると、このような事態が自動的に発生します。

たとえば、ウィジェットクラス FredWidgetClass の場合、UIL ファイルには以下の内容が含まれます。

procedure XdUilCreateFredWidgetClass();
...
object fred_variable : user_defined XdUilCreateFredWidgetClass

さらに、UIL に対する C には以下の内容が含まれます。

...
Widget XdUilCreateFredWidgetClass(parent, name, argv, argc)
Widget   parent ;
String   name ;
Arg     *argv ;
Cardinal argc ;
{
	return XtCreateWidget(name, fredWidgetClass, parent, argv, argc) ;
}

ウィジェットの作成に特別な処理が必要

他社のウィジェットの 1 つを作成する際に特別な処理が必要であるのに、UIL 作成関数が宣言されていない場合は、内容が事前構成されている標準形式の関数が必要です。

この処理には、次のリソースを使用します。

visu*xw_<ウィジェットクラス>.uilProcedureTemplate: some_file_name

Sun WorkShop Visual が UIL 用に生成する C コードの UIL 関数の角括弧 < > 内に、 some_file_name がそのまま書き出されます。

たとえば、fred ウィジェットのサイズを作成前に設定しなければならない場合、以下のようにします。

    1. fred.uil_template というファイルを作成します。

    2. 作成したファイルを $USER_WIDGETS/code_templates/UIL に置きます。

    3. 次のようにリソースを設定します。
       XDesigner*xw_fred.uilProcedureTemplate:

		$USER_WIDGETS/code_templates/UIL/fred.uil_template

    注 - このリソースの値には、シェル変数を使用できます。シェル変数は、自動的に拡張されます。

次に、このテンプレートファイル fred.uil_templates を作成します。

/* UILテンプレートファイルの開始 */
Arg     *av ;
Cardinal ac ;
Widget   w ;
/* 渡された引数をコピーする */
	av = (Arg *) XtMalloc((unsigned) (argc + 2) * sizeof(Arg)) ;
	for (ac = 0 ; ac < argc ; ac++) {
		av[ac].name  = argv[ac].name ;
		av[ac].value = argv[ac].value ;
	}
/* 必要な幅と高さを追加する */
	XtSetArg(av[ac], XmNwidth,  100) ; ac++ ;
	XtSetArg(av[ac], XmNheight, 100) ; ac++ ;
	w = XtCreateWidget(name, fredWidgetClass, parent, av, ac) ;
/* 整理する */
	XtFree((char *) av) ;
	return w ;
/* UIL テンプレートファイルの終了 */

この場合、X デザイナーは通常のアルゴリズムを使用して必要な UIL 関数の実名を決定し、UIL ファイルの C コードに含まれる UIL 関数の角括弧 < > 内に入力します。


1. $VISUROOT は、Sun WorkShop Visual のインストールルートディレクトリのパスです。

2. 使用できるウィジェット統合セットについては、Sun WorkShop Visual のご購入先にお問い合わせください。


前へ 次へ 目次 文書セット ホーム

サン・マイクロシステムズ株式会社
Copyright information. All rights reserved.