ウィジェットの色や位置、大きさ、表示形態等を指定するパラメータをリソー スと呼びます。リソースの仕組みはそれに標準値を与えたり個別の変更を系統 的にフレクシブルに出来るように用意されています。ウィジェットクラスには それ自身が扱えるリソースが定義されています。例えば先ほど見たLabelウィ ジェットクラスでは
label ラベル文字 font 文字フォント justify 文字寄せの方向 foreground 前景色 background 背景色 border 境界線の色 borderWidth 境界線の太さ height 高さ width 幅 x 水平位置 y 垂直位置 resize サイズ変更の可否
などがリソースとして定義されています。リソースには名前がついています。 プログラムの中から参照するときは名前の前にXtNがついたシンボルが定義さ れているのでそれを使います。つづりのまちがいを防ぐためです。labelリソー スの名前はXtNlabelということになります。
Xtではリソースの名前に対して値を与えることでカスタマイズを行います。 ですから全てのウィジェットがユニークに識別される必要があります。同じ名 前のウィジェットでも親が違うことで識別できます。一番上位のウィジェット はXtInitializeで作りました。
Widget XtInitialize( name, class, options, num_options, argc, argv ) char *name; char *class; XrmOptionDescRec* options; Cardinal num_options; Cardinal *argc; char *argv[];
ここで付けたnameが最上位のウィジェットの名前になります。アプリケーショ ンそのものの名前でもあります。それゆえmainで渡されるargvの最初の要素を 使うこともあります。それを実行したコマンド名ですね。このとき、classも 指定しました。この引数はアプリケーションクラスの名前を与えます。リソー スの標準値を定義するのに、コマンドごとに定義しなくても同じアプリケーショ ンクラスに属するアプリケーションが共通の定義を使うことが出来るようにな るわけです。同様にXtCreateManagedWidgetでは個別のウィジェットインスタ ンスに名前を付けましたが、それぞれがウィジェットクラスに属するわけです からウィジェットクラスのリソースを設定することも出来るわけです。クラス リソースの名前は大文字で始まります。上の例では前景色はForegroundとなり ます。プログラムの中で参照するときは前にXtCを付けてXtCForegroundとなり ます。これらを使って特定のリソースを記述します。左から右に向かって親か ら子の名前を.でつないでゆき、最後がリソース名です。.Xdefaultsのような リソースファイルの中では:で区切ってその後に設定する値を書きます。次の ようになります。
hello.hello_world.label: "Hello !! World!" Hello.Label.Foreground: red 最初の例ではhelloがアプリケーション名、hello\_worldがラベルインスタンス の名前、最後のlabelがリソースを表わしています。次の例ではアプリケーショ ンクラスHelloの下のLabelクラスのForegroundクラスリソースをredに設定し ています。 \begin{verbatim} hello*background: blue
.のかわりに*でウィジェット名を区切りました。この場合*の位置には中間の ウィジェットがいくつ入ってもよいワイルドカードになります。今の例ではこ れはhello.backgroundとhello.hello_world.backgroundをblueに設定すること になります。これらの設定によりこのプログラムhelloはウインドウに表示さ れるラベルがhello_worldではなくてHello!! Wo rld!になり、色も変わります。
次にプログラムの中でリソースを設定する方法を見ていきましょう。Xt Intrinsicsではリソースの値の制御は全てArg構造体を用いて行います。Arg構 造体にリソースの名前と値を代入して、その構造体を使ってXtSetValues関数 を呼びます。リソースの値を読みだすときも同じ構造体を使ってXtGetValues 関数を呼びます。リソースによってはウィジェットが作られるときに指定しな ければならないものもあります。それらはXtCreateManagedWidge tを呼び出す ときにこのArg構造体でリソース指定を行います。
Widget widget; Arg args[3]; int n; n = 0; XtSetArg( args[ n ], XtNlabel, "Hello!! World!" ); n++; XtSetArg( args[ n ], XtNwidth, 200 ); n++; XtSetArg( args[ n ], XtNheight, 100 ); n++; XtSetValues( widget, args, n );
XtSetArgはマクロです。最初の引数が2度参照されるのでargs[ n++ ]とは書け ません。Ar g構造体を用いずに値をセットする関数もあります。可変長の引数 を扱えるものでXtの後にVaのついた関数です。例えば上の例は
XtVaSetValues( widget, XtNlabel, ( XtArgVal ) "Hello!! World!", XtNwidth, ( XtArgVal ) 200, XtNheight, ( XtArgVal ) 100, NULL );
最後のNULLが引数リストの終わりを表わします。XtCreateWidgetと同じ機能の 関数XtVaCr eateWidgetもあります。
このようにプログラムの中ではウィジェットはWidget型変数として特定でき ますからそれぞれのリソース名を指定するだけでいいわけです。