[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ]

# 1 はじめに

この章では次のトピックの概要をはじめとする，DECwindows for OpenVMS ツールキットについて説明します。

- DECwindows Motifツールキット

- DECwindows Motifツールキットの基本的なプログラミングの概念

この章を読んで，DECwindows for OpenVMSツールキットについて理解してください。

注意
  この章は，Motifツールキットのプログラミングについて規定している『OSF/Motif プログラマーズ・ガイド』の序章を補完することを目的としています。

DECwindows for OpenVMSツールキットには，DECburgerというアプリケーション例が入っています。DECburger はOSF/Motif MotifBurgerアプリケーションをベースとし，DEC が提供するウィジェットの使用方法を示しています。 第1.5節でDECburgerアプリケーションのコンパイル， リンク，および実行方法を説明しています（DECburger アプリケーションはDEC UNIXあるいはWindows NTシステムではサポートされません）。

# 1.1 DECwindows Motifツールキットの概要

DECwindows for OpenVMSツールキット(以下，ツールキットと呼ぶ)とは， DECwindowsアプリケーションのユーザ・インターフェイスを作成および管理するために使用できる， アプリケーション開発ツールと実行時ルーチンのセットです。

このツールキットはOSF/MotifツールキットとMIT XツールキットIntrinsics ( リリース5)をベースとし，DECが追加したウィジェットと支援ルーチンを組み込んでいます。DEC が提供するウィジェットと支援ルーチンには先頭文字DXm が付いています。Structured Visual Navigation(SVN)ウィジェットの場合には，先頭文字はDXmSvnです。

ツールキットを使用すると，次の操作を実行できます。

- ディスプレイ装置への接続をオープンする。

- アプリケーションに対応する完全なユーザ・インターフェイスを作成する。

- ウィンドウへの出力操作を実行する。

- ウィンドウからの入力を受信する。

ツールキットの構成要素は次のとおりです。

- ユーザ・インターフェイス・オブジェクトのセットと，それらを作成するための実行時ルーチン。

- ユーザ・インターフェイス言語(UIL)とMotifリソース・マネージャ(MRM) と呼ばれる2つのアプリケーション開発ツール。

- XツールキットIntrinsicsと呼ばれる，ウィジェット操作のための実行時ルーチンのセット。Intrinsics ルーチンの先頭文字はXt。

## 1.1.1 ツールキット構成ブロック-ウィジェットとガジェット

ツールキットはウィジェットというユーザ・インターフェイス・ オブジェクトのセットを提供します。ウィジェットはアプリケーションのユーザ・ インターフェイス用の構成ブロックです。

ユーザの観点からみると，ウィジェットはアプリケーションのためのインターフェイスです。 ユーザはMenu，Push Button，Scroll Bar，Textの各ウィジェットを使用して選択， 出力の表示，入力などを行います。ツールキットが実現するウィジェットは見た目と動作が一貫するため， ユーザは新しいインターフェイスの使用方法を習得しなくても，DECwindows のアプリケーション間を移動できます。

プログラマの観点からみると，ウィジェットはアプリケーションの機能に論理的に接続されているウィンドウです。 ユーザが(たとえばメニューを選択することで) ウィジェットと会話すると，ウィジェット内の情報がアプリケーションに適切な応答をさせます。

ツールキットのウィジェットは，入出力機能を備えているウィンドウから構成されます。 ウィジェットにはテキストやグラフィックなどの情報を表示するものと， 他のウィジェットの単なる容器でしかないものがあります。 また，ウィジェットには出力専用でポインタやキーボード入力に応答しないものと， 入力に応じてディスプレイを変え，アプリケーションがそのウィジェットに付加した機能を呼び出せるものがあります。

各ウィジェットは幅，高さ，フォント，カラー，枠幅などの属性をサポートしており， プログラマはその属性を使用してウィジェットの見た目と機能を変更できます。 ツールキットはウィジェットに割り当てた省略時の属性によって， 『OSF/Motifスタイル・ ガイド』の勧告に準拠するウィジェットを作成します。

ツールキットのウィジェットには，ガジェットと呼ばれるものがあります。 ガジェットの見た目は対応するウィジェットと同じですが， 機能は制限されています。ガジェットのほうが使用するシステム資源が少なく， アプリケーションの性能が高くなります。たとえば，ガジェットは関連するウィンドウを持たないことによって， ウィンドウを作成するための処理を省いています。 一方，ガジェットはウィジェットがサポートする属性のすべてにはアクセスすることができません。

ウィジェット(またはガジェット)を使用してユーザ・インターフェイスを作成するには， アプリケーション・プログラムでウィジェットのインスタンスを作成します。 ウィジェットを作成する際には，ウィジェットの属性に値を割り当てることにより， 親子関係や初期状態，およびその他の特性を指定します。

アプリケーションでウィジェットを作成する際には，次の項目を指定します。

- ウィジェットの階層

  たとえば，あるインターフェイス・オブジェクトが1つのボックス(親) と，そのボックス内に入っている複数のボタン(子)から構成されるとします。 ボックスとボタンはともにウィジェットであるため，ウィジェットの階層を指定すると， 必然的にボックスとボタンの関係が確立されます。

- 各ウィジェットの特性

  ウィジェットの高さ，幅，位置などを指定します。

- ユーザがインターフェイスに入力したときにアプリケーションが実行するルーチン

## 1.1.2 ウィジェットの種類

ツールキットには，次の主要な３種類のウィジェットがあります。

- 入出力ウィジェット

  入出力ウィジェットはユーザ・インターフェイスの基本的な入出力機能を備えており， テキストやグラフィックを表示したり，テキストの編集を行ったり， アプリケーションへのユーザの入力を可能にしたりします。 これらの機能を備えているウィジェットはXmLabel， XmPushButton，XmToggleButton，XmScale，XmScrollBar，XmTextの各ウィジェットです。

- 容器ウィジェット

  容器ウィジェットは他のウィジェットの容器として働きます。これらのウィジェットは， アプリケーションの各種機能へアクセスするウィジェットを1 つにまとめるときに使用します。この機能を備えているウィジェットにはXmBulletinBoard ，XmForm，XmMainWindowの各ウィジェットがあります。 ツールキットには，警告メッセージ表示などの共通機能を実行できるようにあらかじめ構成済みの容器ウィジェットが入っています。

- 選択ウィジェット

  選択ウィジェットはアプリケーションのユーザに選択肢を提示するものです。 この機能を備えているウィジェットにはXmListがあります。

## 1.1.3 OSF/Motifツールキットのウィジェット

第1.1節で説明したように， DECwindows MotifツールキットはOSF/Motifツールキットをベースとしています。OSF/Motif ツールキットのウィジェットについては『OSF/Motifプログラマーズ・ガイド』で説明しています。

OSF/Motifデモ用プログラムのPeriodicは，OSF/Motifのさまざまなウィジェットの使用方法と見た目を示しています。Periodic のメイン・ウィンドウを 図 1-1に示します。

### 図 1-1 OSF/MotifのPeriodicデモ用プログラム

## 1.1.4 DECが提供するウィジェット

OSF/Motifの標準的なウィジェットのほか，DECwindows Motifツールキットには次のようなDEC 固有のウィジェットも入っています。

- Helpウィジェット

- Printウィジェット

- Color Mixingウィジェット

- Compound String Textウィジェット

- SVN(Structured Visual Navigation)ウィジェット

これらのウィジェットを使用すると，アプリケーションを『OSF/Motifスタイル・ ガイド(DECwindows 追補版)』(日本語)，『DECwindows Companion to the OSF/Motif Style Guide』(英語)に準拠させながら，プログラミング時間をかなり短縮することができます。 これらのウィジェットへのプログラミング・ インターフェイスについては，例を示して以降の章で説明します。

## 1.1.5 ツールキットのウィジェットとガジェットのルーチン

ツールキットのルーチンを使用すると，DEC提供のウィジェットを含め， ツールキットのすべてのウィジェットを作成および操作することができます。 これらのルーチンを使用するには，引数リストと呼ばれるデータ構造体でウィジェットの属性に値を割り当てます。 そして例 1-1に示すように，この引数リストをツールキットのルーチンへ渡します。

### 例 1-1 引数リストの引き渡し

    static void create_help (topic)
                XmString   topic;
    {

         unsigned int    ac;
         【1】Arg              arglist[10];
         static Widget   help_widget;
         static int      low_num;

         if (!help_widget) {

          ac = 0;
            【2】XtSetArg (arglist[ac], DXmNapplicationName,
                         XmStringLtoRCreate("Toolkit Help","")); ac++;
            XtSetArg (arglist[ac], DXmNglossaryTopic,
                         XmStringLtoRCreate("glossary","")); ac++;
            XtSetArg (arglist[ac], DXmNoverviewTopic,
                         XmStringLtoRCreate("overview","")); ac++;
            XtSetArg (arglist[ac], DXmNlibrarySpec,
                         XmStringLtoRCreate("decburger.hlb","")); ac++;
            XtSetArg (arglist[ac], DXmNfirstTopic, topic); ac++;

            【3】help_widget = DXmCreateHelpDialog (toplevel_widget,
                                                      "Toolkit Help",
                                                       arglist,
                                                       ac);

1. 10個のArgデータ構造体の配列を宣言します。

2. XtSetArgを呼び出して，引数リストに値を設定します。

3. 引数リストと引数データ構造体の数を渡して，ウィジェットを作成します。

ウィジェット操作ルーチンを使用すれば，ウィジェットの作成後でもウィジェットのすべての属性をアクセスすることができますが， ウィジェットの作成時に値を属性に割り当てるほうが効率的です。

ツールキットのルーチンのうち，OSF/Motifツールキットと共通なルーチンについては， 『OSF/Motif プログラマーズ・リファレンス』で説明しています。DEC固有のルーチンについては『日本語DECwindows Motif for OpenVMS 拡張機能説明書』(日本語)，『DECwindows Extensions to Motif』(英語)で説明しています。

## 1.1.6 アプリケーション開発ツール

ツールキットのルーチンには，ウィジェットの階層を作成したり，ウィジェットのすべての属性を指定するためのルーチンが用意されています。 さらに， ツールキットにはプロセスをより簡単にする追加のツールとして， ユーザ・インターフェイス言語(UIL)コンパイラとMotifリソース・マネージャ(MRM) ルーチンの2つのツールもあります。

UILはユーザ・インターフェイス定義言語です。UILを使用して，UIL 仕様ファイルと呼ばれるテキスト・ファイルにアプリケーションの「形式」， つまりユーザ・インターフェイスを指定し，UILコンパイラを使用して， この仕様ファイルをコンパイルします。

UIL仕様ファイルはユーザ・インターフェイスの次の特性を定義します。

- インターフェイスを構成するウィジェット

- アプリケーションにおけるウィジェットの階層

- 指定されたウィジェットの特性

- 各ウィジェットのコールバック・ルーチン

仕様ファイルは機能ルーチンと別にコンパイルするため，アプリケーションにおいて形式と機能を分割することになります。 たとえばUILを使用すると， ユーザが「了解」XmPushButtonを押したときの結果を指定せずに， このボタンを作成できます。ユーザが「了解」プッシュ・ボタンを押したときの結果は， アプリケーションの機能ルーチンが決定します。

UIL仕様ファイルにウィジェットを定義するとき，ウィジェットのすべての属性をアクセスすることができます。UIL コンパイラは，属性に割り当てる値が， そのウィジェットに適切なデータ型であることをチェックします。 実行時，アプリケーションはMRMルーチンを使用して，UIDファイル と呼ばれるコンパイル済みのインターフェイス仕様を検索します。

MRMルーチンを使用すると，実行時に，UID仕様ファイルをオープンして， そのファイルからウィジェットの定義を検索し，ウィジェットを作成してユーザ・ インターフェイスを構築することができます。

## 1.1.7 UILとMRMを使用した各国語対応

UILとMRMを使用すると，アプリケーションのメイン・プログラムを大幅に変更しなくても， ユーザ・インターフェイスの仕様を変更できます。UIL とMRMのこのような機能は，特に国際市場向けに開発されたアプリケーションにとって重要です。 たとえば，1つのアプリケーションについて，ユーザ・ インターフェイスを複数の言語で作成できます。

## 1.1.8 ツールキットIntrinsicsルーチン

Intrinsicsと呼ばれるXツールキットのルーチンを使用すると， 実行時にウィジェットを操作することができます。XツールキットIntrinsics は，X Window Systemバージョン11，リリース5に搭載されている標準のルーチン・ ライブラリです。

Intrinsicsはすべてのアプリケーションの基礎です。次のような操作を行うにはIntrinsics を使用します。

- ツールキットの初期化

- ウィジェットの画面へのマップおよびアンマップ

- アプリケーションのエンド・ユーザからの入力の処理

# 1.2 ツールキット・ルーチンとUILの対比

UILまたはツールキット・ルーチンのいずれを使用しても，アプリケーションに各ウィジェットの初期のインスタンスを作成できます。 ただし， UILでは形式と機能を分けることができるため，おそらくUILの方が使いやすいでしょう。 たとえば，アプリケーションのユーザ・インターフェイスを大幅に変更して，UIL モジュールを再コンパイルしてUIDファイルを作成し直しても， アプリケーションのソース・コードはまったく変更する必要がありません。

ただし，初期のユーザ・インターフェイスを作成した後は，ユーザのアクションに応じてウィジェットのリソースを変更するには， ツールキット・ ルーチンを使用しなければなりません。たとえば，UILを使用してColor Mixingウィジェットを作成するとします。UILでウィジェットに初期の赤， 緑，青の色を設定することができますが，その後，ユーザのアクションに応じてこれらの色を変更する必要があるときには， ツールキット・ルーチンを使用しなければなりません。

# 1.3 ツールキット・ルーチンとXlibルーチンの対比

Xlibルーチンを使用する場合に比べ，ツールキットを使用するほうがユーザ・ インターフェイスを作成するタスクが簡単になります。たとえば，1 つのツールキット・ルーチンを呼び出すだけでメニューを作成することができます。Xlib ルーチンを使用して同じメニューを作成しようとすると， もっと多くの呼び出しとプログラムのコーディングが必要になります。また， ツールキット・ルーチンを使用すると，アプリケーション・インターフェイスが『OSF/Motif スタイル・ ガイド(DECwindows追補版)』(日本語)，『DECwindows Companion to the OSF/Motif Style Guide』(英語)に準拠するという利点もあります。

ツールキットはほとんどのアプリケーション・プログラミングに使用できます。 ただし，次の操作にはXlibルーチンを使用しなければなりません。

- コンパウンド・ストリングの表示を除くほとんどの描画操作

- ビジュアル・タイプ(XDefaultVisualOfScreen)や省略時のカラーマップ(XDefaultColormapOfScreen) の判断など画面に関する情報取得

- インストールされたカラーマップからのカラー・セルの割り当て(XAllocColor)

- アイコンとして使用するXbitmapsの作成

# 1.4 ツールキット・プログラミング上の注意事項

この節では次のトピックをはじめとする，ツールキットを使用したプログラミング上の注意事項について説明します。

- アプリケーションのウィジェット階層

- 形式と機能

- 機能とコールバックの関連付け

- アプリケーションにおけるウィジェット属性の使用

## 1.4.1 アプリケーションのウィジェット階層

親子関係に基づいたウィジェット階層にウィジェットを配置することによって， アプリケーションのユーザ・インターフェイスを作成します。親ウィジェットは， 子の動作と見た目を制御します。その子もまた子を持つことができます。 この親子関係の層がアプリケーションのウィジェット階層 を作成します。

アプリケーションのウィジェット階層をウィジェットのクラス階層と混同しないようにしてください。 アプリケーションのウィジェット階層は，ユーザ・ インターフェイスにおけるウィジェットの親子関係を定義するものであり， ウィジェットのクラス階層は，ツールキットにおけるウィジェットのサブクラスとスーパークラスの関係を定義するものです。 ウィジェットのクラス階層は， ウィジェットがどの属性をスーパークラスから受け継ぎ， どの属性が特定のウィジェット・クラスに固有であるかを決定します。

アプリケーション階層を設計するときは，親ウィジェットがどの子ウィジェットをサポートするか事前にわかるように， アプリケーション階層の上から下へと設計していくとよいでしょう。 また，ツールキットのすべてのウィジェットが親になれるわけではありません。 ウィジェットには コンポジット・ウィジェットとプリミティブ・ウィジェット の２種類があります。コンポジット・ウィジェットは他のコンポジット・ ウィジェットの親または子になることができますが，プリミティブ・ ウィジェットは子にしかなることができません。

## 1.4.2 DECburgerのアプリケーション階層

アプリケーションのコンテキストでアプリケーション階層の概念を理解するため， 図 1-2に示すDECburgerのメイン・ ウィンドウの例を考えてみてください。

### 図 1-2 DECburgerのウィジェット階層

DECburgerプログラムのアプリケーション・ウィジェット階層の一番上は，Application Shell ウィジェットです。Application Shellウィジェットは， アプリケーション・プログラムとそのアプリケーションを実行するワークステーション環境間の媒介として働きます。 アプリケーションはすべて， アプリケーション・ウィジェット階層の一番上に，Shellウィジェットを持たなければなりません。

DECburgerアプリケーションのMainウィジェットはXmMainWindowウィジェットです。 このウィジェットはApplication Shellウィジェットの子です。Application Shell ウィジェットは子を1つしか持つことができません。XmMainWindow ウィジェットは，XmMenuBarとXmScrolledList (図には示されていない) の2つの子を持ちます。XmScrolledListウィジェットはスクロール・ バーを作成します。

XmMenuBarウィジェットは空のメニュー・バーを作成します。メニュー・ バーにメニュー項目を追加するため，XmMenuBarウィジェットは「ファイル」， 「編集」，「注文」，「ヘルプ」の4つのXmCascadeButtonウィジェットの子を持っています。 カラー・システムの場合には，カラーの設定用として5 つめのXmCascadeButtonがあります。

XmCascadeButtonウィジェットは，プルダウン・メニューでユーザに選択肢を提示します。 このため，各XmCascadeButtonウィジェットはXmPulldownMenu ウィジェットの子を1つ制御します。

XmPulldownMenuウィジェットは空のプルダウン・メニューを作成します。 プルダウン・メニューの内容を制御するため，XmPulldownMenuウィジェットはXmPushButton ガジェットの子を持っています。たとえば，「注文」のXmPulldownMenu ウィジェットは，3つのXmPushButtonガジェット(「注文表を閉じる」， 「注文取消」，「注文発行」)と，1つのSeparatorガジェットを制御します。

XmPushButtonガジェットは子をサポートしません。

## 1.4.3 形式と機能

ツールキットを使用したプログラミングの基本概念は，形式と機能の分割です。 ツールキットを使用すると，アプリケーションの形式，つまりユーザ・ インターフェイスを，そのアプリケーションの機能を実現するルーチンから切り離して考えることができます。

アプリケーションの形式は，そのアプリケーションがどのように機能するかではなく， 見た目を定義します。アプリケーションの形式はそのアプリケーションの外見であり， アプリケーションの機能ルーチンがサポート構造を提供します。

このように形式と機能が分割されているため，ウィジェットやウィジェットのグループを構成ブロックとして使用することにより， アプリケーションを作成できます。 いったんウィジェットを作成した後は，さまざまな組み合わせでそれらのウィジェットをグループ化して， アプリケーションを構築します。 プログラミングの観点からみると，新規のウィジェットを作成するよりも既存のウィジェットを変更するほうが， 時間が少なくてすみます。

たとえば例 1-2に示すように，ユーザがボタン上でMB1 をクリックしたときの結果を指定せずに，XmPushButtonウィジェットを作成できます。

### 例 1-2 形式と機能

    object
            do_button : XmPushButton {

                arguments {
                    XmNlabelString = compound_string("do label");
                    XmNaccelerator = compound_string("do label");
                    XmNacceleratorText = compound_string("do text");
                    XmNmnemonic = keysym("D");
                };

                callbacks {
                    XmNactivateCallback = procedure do_proc();
                };
            };

このUILコードはXmPushButtonウィジェットを作成しますが，ユーザがこのボタンでMB1 をクリックしたときの結果は指定していません。ウィジェットは コールバック・ルーチンを使用して，特定のアクションまたは一連のアクションが起こったときの結果を指定します。 コールバックについては 第1.4.4項で詳しく説明します。

ユーザがPush ButtonウィジェットでMB1をクリックすると，アプリケーションの アクティベート・ルーチン(この場合はdo_proc)が呼び出されます。 このルーチンはボタンが押された結果，プログラムがどのような処理をするかを決定します。

Push Buttonウィジェットは本来機能と結びついていないため，プッシュ・ ボタンが必要なときにはいつでもこのコードを使用し，必要に応じてアクティベート・ コールバック・プロシージャを変更することができます。 たとえば，プッシュ・ボタンに関連付けられたラベル文字列とアクティベート・ コールバックを変更することによって，このプッシュ・ボタンを「了解」， 「取消」，「適用」のいずれのプッシュ・ボタンとしても使用できます。

また，例 1-3で作成した汎用プルダウン・ メニューを使用し， 必要に応じてこのメニューを変更することも可能です。

### 例 1-3 形式と機能-汎用プルダウン・メニュー

    object
        my_menu : XmPulldownMenu {
            controls {
                XmPushButton do_button;
                XmPushButton clear_button;
                XmPushButton save_button;
            };
            callbacks {
                MrmNcreateCallback = procedure create_proc (k_my_menu);
                XmNhelpCallback = procedure sens_help_proc(k_my_menu);
            };
        };

    object
            do_button : XmPushButton {

                arguments {
                    XmNlabelString = k_do_label_text;
                    XmNaccelerator = k_do_accelerator;
                    XmNacceleratorText = k_do_accelerator_text;
                    XmNmnemonic = keysym("D");
                };

                callbacks {
                    XmNactivateCallback = procedure do_proc();
                };
            };

    object
            clear_button : XmPushButton {

                arguments {
                    XmNlabelString = k_clear_label_text;
                    XmNaccelerator = k_clear_accelerator;
                    XmNacceleratorText = k_clear_accelerator_text;
                    XmNmnemonic = keysym("C");
                };

                callbacks {
                    XmNactivateCallback = procedure clear_proc();
                };
            };

    object
            save_button : XmPushButton {

                arguments {
                    XmNlabelString = k_save_label_text;
                    XmNaccelerator = k_save_accelerator;
                    XmNacceleratorText = k_save_accelerator_text;
                    XmNmnemonic = keysym("S");
                };

                callbacks {
                    XmNactivateCallback = procedure save_proc();
                };
            };

       .
       .
       .

このプルダウン・メニューを作成しておくと，そのまま使用することも， あるいはアプリケーションの要求に合うように変更することもできます。 たとえば，プッシュ・ボタンのラベルを「消去」と「切抜き」に変更し， それに応じてアクティベート・コールバックを変更することもできます。

注意
  構成ブロックを使用したアプローチはUIL 独特のものではありません。ツールキット・ルーチンでこれらのウィジェットを作成し， 必要に応じてそのウィジェットを使用することもできます。

## 1.4.4 機能とコールバックの関連付け

ユーザがVMS DECwindowsアプリケーション・プログラムを起動すると，ディスプレイ上にアプリケーションの初期のユーザ・ インターフェイスが表示されます。 そしてアプリケーションは，ユーザがそのインターフェイスと会話するのを無限ループで待ちます。DECwindows 環境で実行しているアプリケーションは， ユーザとインターフェイスとの会話に応じてのみ機能を実行します。

アプリケーションのユーザがマウスまたはキーボードを使用してアクションを行うと， ウィジェットの状態が変更されます。各ウィジェットはその状態で特定の状態変更をサポートし， アプリケーションに通知します。実行時におけるインターフェイスからアプリケーションへのこのようなデータの流れは， コールバック・メカニズムを通して行われます。 コールバック・メカニズムはインターフェイスからアプリケーションへの１方向の通信を行います。 アプリケーションはおもにこのようにして， インターフェイスから入力を受け取ります。

ウィジェットはその状態で通信したい変更内容の数によって，1つ以上のコールバックを定義できます。 コールバックを引き起こすユーザの特定のアクションを 条件といいます。ウィジェットの状態の変化によってコールバックが呼び出されると， アプリケーションはそのウィジェットに関連付けられたルーチンを実行します。 このルーチンをコールバック・ ルーチンといいます。このようにして，アプリケーションの機能を実現するルーチンと， アプリケーションのユーザ・インターフェイスを構成するウィジェットを関連付けます。1 つ以上のコールバック・ ルーチンを1つのコールバック条件に関連付けることもできます。複数のコールバック・ ルーチンがある場合，それらのルーチンはプログラマが指定する順序で実行されます。

条件は"MB1"がアクションであるという意味でのアクションではありません。 条件は「アクティブ化」のような，もっと抽象的な概念です。たとえば，Push Button ウィジェットはアクティベート・コールバックの条件として，MB1 を押して離すというイベントのシーケンスを定義します。

ツールキットがベースとしているX Windouw Sysytemは，ウィンドウ内で起こるアクション(MB1 を離すことなど)をイベントとして定義します。 ウィンドウ内でイベントが起こると，サーバがそれを通知する役割を果たします。 一般に，ツールキットのウィジェットを使用するアプリケーションは， イベントに関与する必要はありません。ツールキットのウィジェットは， そのウィジェットが条件として定義するイベントまたはイベントのシーケンスが起こると， 自動的にアプリケーションに通知します。

## 1.4.5 アプリケーションにおけるウィジェット属性の使用

ツールキットのすべてのウィジェットは属性のセットをサポートしており， その属性を使用すると，ウィジェットの見た目と機能のアスペクトを変更できます。 これらウィジェット属性のサブセットは， ツールキットのすべてのウィジェットによってサポートされています。 このような属性を，共通のウィジェット属性といいます。 また，ほとんどのウィジェットは固有の属性もサポートしています。 各ウィジェットがサポートしている属性のセットについては，『OSF/Motifプログラマーズ・ リファレンス』を参照してください。

すべてのウィジェットは，次の基本的な種類の属性をサポートしています。

- サイズ属性と位置属性(ジオメトリ管理)

- 見た目の属性

- コールバック属性

この節では，アプリケーションでウィジェットを使用するための， プログラミング上の注意事項を簡単に説明します。詳しくは『OSF/Motifプログラマーズ・ ガイド』を参照してください。

### 1.4.5.1 サイズ属性と位置属性

すべてのウィジェットはサイズ属性と位置属性をサポートしています。表 1-1 にこれらの属性をリストします。

### 表 1-1 ウィジェットのサイズおよび位置属性

属性 | 説明
--- | ---
XmNwidth | ウィジェットの幅を指定する。
XmNheight | ウィジェットの高さを指定する。
XmNx | ウィジェットの左上の角のx座標を指定する。
XmNy | ウィジェットの左上の角のy座標を指定する。

これらの属性を使用してウィジェットのサイズと位置を指定できますが， ウィジェットが使用されるコンテキストで，そのウィジェットに自分のサイズと位置を定義させるほうが好ましい場合が多くあります。 ウィジェットのサイズと位置はその親によって制御されます。 子は特定のサイズになれるように要求することができますが， 最終決定を下すのはその親です。 親ウィジェットは，そのほかの子のサイズと位置要求も考慮しなければなりません。 さらに，親ウィジェットはそれ自身が子であり，その上の親とスペース要求について交渉しなければなりません。 ディスプレイのスペースに関するこの親と子の交渉を， ジオメトリ管理といいます。

### 1.4.5.2 見た目の属性

ツールキットのウィジェットはすべて，見た目のアスペクトを指定する属性をサポートしています。 これらの属性の多くは各ウィジェットに固有のものです。 たとえば，XmPushButtonウィジェットは3次元の印象を与えるため， ディスプレイに表示されるときは影が付いています。ただし，Push Buttonウィジェットの XmNshadowThicknessリソースを省略時の設定である2 以外の値に設定すると，影の濃淡が異なるプッシュ・ボタンを作成できます。

ウィジェットの見た目のリソースを設定しなければ，ツールキットは省略時の値を使用します。 省略時の値では，『OSF/Motifスタイル・ガイド』の勧告に準拠するウィジェットが作成されます。

### 1.4.5.3 コールバック属性

ツールキットのウィジェットはすべて，コールバック・ルーチンとコールバック条件を関連付けることができる属性をサポートしています。 たとえば， 表 1-2はXmPushButtonウィジェットがサポートしているコールバック属性のリストです。

### 表 1-2 Push Buttonウィジェットがサポートしているコールバック属性

XmNactivateCallback | ユーザがPush Buttonウィジェット内でMB1 をクリックすると実行されるコールバック
XmNarmCallback | ユーザがPush Buttonウィジェット内でMB1 を押すと実行されるコールバック
XmNdisarmCallback | ユーザがMB1を押したままプッシュ・ ボタンからポインタ・カーソルを移動すると実行されるコールバック
XmNhelpCallback | ユーザがHelpキーを押し，Push Buttonウィジェット内でMB1をクリックすると実行されるコールバック
XmNdestroyCallback | Push Buttonウィジェットが破壊されると実行されるコールバック

### 1.4.5.4 ウィジェット属性への値の割当て

ウィジェットを作成すると，ツールキットは次の情報源をチェックして， ウィジェット属性の初期設定を決定します。

1. 作成ルーチンで与えられた引数リスト

2. ウィジェットのリソース・データベース

3. ウィジェットに組み込まれている省略時の値

ツールキットはリソースの値についてまず引数リストをチェックします。 プログラマはツールキット・ルーチンまたはUIL/MRMを使用してウィジェットを作成するとき， ウィジェット属性に値を割り当てます。引数リストで属性の値が指定されている場合， ツールキットはウィジェットの作成時， ウィジェットにこの値を割り当てます。

プログラマが値を割り当てない属性については，ツールキットはリソース値のデータベースから省略時の値を検索します。

ツールキットが引数リストまたはリソース・データベースでリソースの値を見つけられない場合， ウィジェット自身に組み込まれている省略時の値が使用されます。 各ウィジェットには，それがサポートするすべてのリソースの省略時の値が組み込まれています。

# 1.5 DECburgerデモ用アプリケーション

DECburgerは架空のファースト・フード・レストランのオーダーエントリ・ システムです。DECburgerでは，ユーザ・インターフェイスは数十のウィジェット( およびガジェット)から構成されています。DECwindowsの基本的なアプリケーションに慣れるため，DECburger アプリケーションを実行してください（DECburger アプリケーションはOpenVMSシステムでのみ有効です。DEC UNIX あるいはWindows NTシステムではサポートされません）。

DECburgerサンプル・アプリケーションのC言語とUILのソース・ファイルは， 例のディレクトリ(DECW$EXAMPLES)に入っています。 DECW$EXAMPLES:DECBURGER.COMコマンド・プロシージャはDECburgerのC 言語プログラムをコンパイルして，ツールキットおよびXlibの共用可能イメージにリンクし， ヘルプ・ライブラリを作成して，DECburgerの実行可能なイメージを実行します。

DECW$EXAMPLES:DECBURGER.COMはまた，UILコンパイラを使用してDECburger アプリケーションのユーザ・インターフェイスを定義するUIL モジュールをコンパイルします。このコマンド・プロシージャはDECBURGER.UID ファイルおよびDECBURGER.EXEファイルを生成します。

         $@DECW$EXAMPLES:DECBURGER.COM

# 1.6 C以外の言語の例

『X and Motif Quick Reference Guide』にAda，FORTRAN，Pascalの言語バインディング情報が含まれています。HELLOMOTIF とMOTIFBURGERプログラムのAdaおよびFORTRAN のバージョンは，DECW$EXAMPLESに入っています。

[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ]