この節では、XView と Solaris Motif のライブラリの違いについて説明します。
XView ツールキットと Xt (OLIT と Motif) のツールキットは、次の用語を使用します。
XView |
Xt (OLIT と Motif) |
---|---|
パッケージ |
ウィジェット |
属性 |
リソース |
フレーム |
シェル |
XView は Xlib を直接ベースとしていますが、Motif はイントリンシクス (Xt) ツールキットを、イントリンシクスツールキットは Xlib をそれぞれベースとしています。
XView |
OLIT |
Motif |
---|---|---|
XLib |
Xt |
Xt |
|
XLib |
XLib |
このように根本的な違いがあるため、環境を初期化し、グラフィカルオブジェクトを作成、変更、削除する基本的なライブラリ関数には、次の例のような違いがあります。
XView |
Motif/Xt |
---|---|
xv_init() |
XtAppInitialize() |
xv_create() |
XtCreateWidget() |
xv_set() |
XtSetValues() |
xv_destroy() |
XtDestroyWidget() |
たとえば、イベント処理コールバックを取り扱う関数や国際化機能はさらに複雑です。これらの機能には、単純な 1 対 1 の対応関係は存在しません。
OLIT と Motif のアーキテクチャはよく似ていますが、XView と Motif には違いがあります。XView から Motif に移行するときには、このようなツールキットの違いに注意する必要があります。
XView のツールキットでは、「パッケージ」と呼ばれるユーザインタフェースオブジェクトと、インタフェースをまとめて保持するルーチンやプロセス (作成ルーチン、イベント処理など) が実装されます。これに対して Motif と OLIT には、基本的にはユーザインタフェースオブジェクトである「ウィジェット」しか実装されず、ルーチンとプロセスはイントリンシクスライブラリに残されます。たとえば xv_init() は、XView ライブラリに入っている関数です。それに対応するものとして OLIT や Motif のプログラミングに使用する関数である XtAppInitialize() がありますが、これは Xt イントリンシクスライブラリに入っています。
これら 3 つのツールキットは、2 つの異なる GUI を示します。XView と OLIT のツールキットの外観は似ていますが、Solaris Motif の外観は大きく異なります。ライブラリ内の関数呼び出し間には、ほぼ 1 対 1 の対応関係がありますが、並列プログラムの「動作」は異なります。つまり、Solaris Motif ライブラリを使用するように OLIT (または XView) プログラムを変換した後も、ある程度は OPEN LOOK の外観が残ります。このような状態のプログラムは、どちらのスタイルにも完全に準拠していません。
API は異なりますが、XView と Motif はユーザインタフェースのプログラミングに関して、次のように同じオブジェクト指向方法論に基づきます。
ツールキットを初期化する
ユーザインタフェースオブジェクトをインスタンス化する
イベントループに入り、ユーザがユーザインタフェースオブジェクトに関するイベントを生成するまで待つ
すべての関数呼び出しを一方の API から他方へ変換しなければならない場合でも、XView から Motif に移植されるプログラムの構造全体はそのまま保持できます。
XView と Motif は、共通タイプのユーザインタフェースオブジェクトをサポートするユーザインタフェースツールキットです。ただし XView では、1 つの XView オブジェクトと同等の効果を生むために、これらのオブジェクトの多くは複数の Motif ウィジェットを必要とする上位に実装されます。
表 5-3 は、XView の共通オブジェクトの基本マッピングと、対応する Solaris Motif ウィジェットを示します。
表 5-3 共通オブジェクトの基本マッピング
対応する Solaris Motif ウィジェット |
|
---|---|
ベース・フレーム |
XmTopLevelShell + XmMainWindow |
コマンド・フレーム |
XmDialogShell + XmBulletinBoard |
確認 |
XmDialogShell + XmMessageBox (メッセージダイアログ) |
キャンバス |
XmScrolledWindow + XmDrawingArea |
パネル |
XmBulletinBoard または XmForm |
パネル・ボタン |
XmPushButton |
メニュー・ボタン |
DtMenuButton (OpenWindows 環境ではアクセスできない) |
アブリビエイト・メニュー・ボタン |
XmRowColumn (オプションメニュー) |
チェックボックス |
XmRowColumn + XmToggleButtons (チェックボックス) |
排他的選択肢 |
XmRowColumn + XmToggleButtons (ラジオボックス) |
スクローリング・リスト |
XmScrolledWindow + XmList |
メッセージ |
XmLabel |
スライダ |
XmScale |
テキストフィールド |
XmTextField |
数値テキストフィールド |
DtSpinBox (OpenWindows 環境ではアクセスできない) |
テキスト・サブウィンドウ |
XmScrolledWindow + XmText (スクロールテキスト) |
TTY サブウィンドウ |
XmScrolledWindow + XmTermPane、 DtTerm (OpenWindows 環境ではアクセスできない) |
スクロールバー |
XmScrollBar |
ポップアップ・メニュー |
XmMenuShell + XmRowColumn (ポップアップメニュー) |
プルダウン・メニュー |
XmMenuShell + XmRowColumn (プルダウンメニュー) |
プルライト・メニュー |
XmMenuShell + XmRowColumn (プルダウンメニュー) |
ファイルチューザ |
XmDialogShell + XmFileSelectionBox |
XView では、Motif (Xt) では提供されない多数の X11 関数を抽象化して提供しています。XView と同等の機能を Motif に持たせるには、Xlib の関数を直接使用して、これらの関数をコーディングし直さなければなりません。
Motif には、次の XView パッケージに対応するものがありません。
アイコン
サーバ・イメージ
カラーマップ・セグメント (CMS)
カーソル
フルスクリーン
サーバ
フォント
Solaris Motif には、ウィンドウを別の表示に分割する OPEN LOOK のユーザインタフェースと同等の機能がありません。この機能を実装するには、Motif のマネージャウィジェットの 1 つをサブクラスに入れなければなりません。
XView の機能には Motif/Xt の API を使用してコーディングできるものもありますが、これらの API はまったく異なるので、全面的に設計変更してコーディングし直す必要があります。これらの機能は次のとおりです。
XView の API |
Motif/Xt |
---|---|
選択サービス |
Xt 選択 API |
ドロップターゲットパッケージ |
Motif ドラッグ&ドロップ API1 |
通知用インタフェース |
Xt イベント管理 API |
CDE に移植する場合は、CDE のドラッグ&ドロップ API を使用してください。この API は、Motif 1.2 のドラッグ&ドロップ API の拡張機能で簡単に使用できます。
XView アプリケーションと Motif アプリケーションでは、その動作と外観を制御する X リソースが異なります。Motif/Xt のオブジェクトと違って、XView のオブジェクトにはインスタンス名が接続されているとは限りません。XView のリソースはインスタンス名から独立しています。たとえば Window.Foreground.Color は、関連するすべての XView オブジェクトに影響を与えます。
Motif/Xt のリソースには、mainframe.control_panel.button1.foreground などのクラス名またはインスタンス名が入っています。Xt リソースが複数のオブジェクトに影響を与えるようにするには、ワイルドカードとクラス名を使用します。
XView は、メッセージファイルや、X リソースが入っているアプリケーション固有のデフォルトファイルなどの複数のファイルを起動時に読み込みます。これらのファイルのなかには、内容と位置が Motif と異なるものがあります (たとえば、Motif/Xt は $OPENWINHOME の下のメッセージドメインファイル (.mo ファイル) を読み込みません)。国際化メッセージスキーマは、Motif とはまったく異なります。