この章では、ツールキットの用語、共通のウィジェット、CDE 専用ウィジェット、高度なウィジェットについて説明します。また、各種ライブラリについても説明します。
「OPEN LOOK と Solaris Motif のツールキットとの比較」
「XView ライブラリと Solaris Motif ライブラリの違い」
「OLIT ライブラリと Solaris Motif ライブラリの違い」
OPEN LOOK アプリケーションを Solaris Motif アプリケーションと比べると、対照的な視覚的要素がいくつかあることが一目でわかります。たとえば、OPEN LOOK のボタンは丸型ですが Solaris Motif のボタンは四角型です。三次元的に見せるためにボタンや他のオブジェクトにつけるシェーディングも異なります。このような体裁上の要素はプログラムの動作には影響せず、移植するときには無視されることが多いですが、CDE の見た目からかけ離れるとアプリケーションは CDE スタイルガイドに準拠しなくなります。
変換作業中にいくつかの違いが重要になることがあります。この節では、これらの機能や他の GUI 要素のうち最も重要なものについて説明します。
Solaris Motif にはない OPEN LOOK ユーザインタフェースの機能
OPEN LOOK ユーザインタフェースで表示されない Solaris Motif の機能
どちらの仕様にもあるが実装が異なる機能や他の要素
スタイルガイドのリストと、OPEN LOOK および Solaris Motif の GUI を説明している他の参考資料については、「はじめに」を参照してください。
OPEN LOOK から CDE への GUI 環境の変更点の詳細は、付録 A 「GUI 環境の変更」 を参照してください。
次の機能は OPEN LOOK ユーザインタフェースに組み込まれており、XView や OLIT (またはその両方) に実装されていますが、Solaris Motif にはありません。
分割ウィンドウコントロール
スクロールバーのアンカー
メニューのデフォルト
自動デフォルト。デフォルトを選択するショートカット方式
「リング」で表示されるデフォルトのメニュー項目
フォントチューザウィジェット
通知でのポインタ移動
アイコン化されたウィンドウへのドロップ
次の機能は Solaris Motif には組み込まれていますが、OPEN LOOK ユーザインタフェースには組み込まれていません。
フロントパネル
ハイパーテキスト機能を使用してヘルプボリュームを生成し登録するためのツール
『共通デスクトップ環境 スタイル・ガイド』で指定され、アプリケーションで使用可能な追加のユーザインタフェースオブジェクト (「ウィジェット」)
OPEN LOOK ユーザインタフェースと Solaris Motif は多くの機能がほぼ同じですが、実装には重要な違いがあります。最も重要な違いは次のとおりです。
ティアオフメニュー
入力フォーカスインジケータ
ウィジェットクラス (スライダとゲージに対してスケールなど)
二次 (secondary) テキストセレクション
その他にも、次の重要な違いがあります。
キーボードの割り当て
各ウィンドウに関連付けられたウィンドウマネージャコントロール
国際化
マウスボタンの動作
この節の残りの部分では、これらの機能について説明します。
Solaris Motif では、OPEN LOOK ユーザインタフェースの「ピンでとめられたメニュー」の代わりにティアオフメニューを使用します。メニュー最上部の破線を選択すると、そのメニューをそのままの状態で表示しておくことができます。
OPEN LOOK の二次テキストセレクションは、Motif のクイック転送機構とほぼ同じです。
もっとも重要な実装上の違いの 1 つは、ウィンドウコントロールに関するものです。Motif ユーザがタイトルバーの左上隅の「ウィンドウ」メニューボタンを押すか、OPEN LOOK ユーザがウィンドウのバックグラウンドのどこか (ヘッダなど) で「メニュー」ボタンを押すとメニューが表示されます。この 2 つの GUI に基づくオプションによってキーの違いが生じます。
Motif の「ウィンドウ」メニューでは、「復元」、「移動」、「サイズ」、「アイコン化」、「最大表示」、「奥へ」、「閉じる」を選択できます。OPEN LOOK の「ヘルプウィンドウ」メニューでは、「クローズ」、「フルサイズ」、「プロパティ」、「後ろへ」、「再表示」、「終了」を選択できます。この 2 つのリストは根本的には同じですが、その効果には大きな違いがあります。
OPEN LOOK ユーザインタフェースでは、「クローズ」オプションを選択するとウィンドウが最小化 (アイコン化) され、「終了」を選択するとアプリケーションが終了します。
Motif では、「アイコン化」オプションを選択するとウィンドウがアイコン化され、「閉じる」オプションを選択するとアプリケーションが終了します。OPEN LOOK ユーザインタフェースに慣れたユーザの多くは、ウィンドウを閉じてアイコン化するときに Motif プログラム自体を終了してしまうことがあるので注意してください。
マウスボタンの構造はどちらの仕様でもよく似ていますが、混乱を招く可能性のある重要な違いがあります。
表 5-1 は、OPEN LOOK の 3 つのマウスボタンのデフォルトの左から右へのマッピングを示します。
表 5-1 OPEN LOOK のマウスボタン
ボタン |
機能 |
---|---|
セレクト |
オブジェクトを指定するか、オブジェクトとコントロールを操作してドラッグする |
アジャスト |
選択したオブジェクトの数を増減させる |
メニュー |
ポインタ位置または指定したオブジェクトに関連付けられたメニューを表示する |
表 5-2 は Motif の 3 つのマウスボタンの割り当てを示します。OPEN LOOKと同様に、デフォルトは左マウスボタンから始まります。
表 5-2 Motif のマウスボタン
ボタン |
機能 |
---|---|
BSelect |
位置カーソルを選択、起動、設定、またはドラッグする |
BTransfer |
要素を移動してコピーし、転送内容をドラッグ&ドロップする。OPEN LOOK の「アジャスト」ボタンとしてカスタマイズできる。 |
BMenu |
メニューを表示する |
この節では、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 とはまったく異なります。
Solaris Motif と OLIT では、ユーザインタフェース内でオブジェクトを操作するときに役立つ多数のルーチンをサポートしています。
次の機能は、OLIT ライブラリに固有のものです。
エラー処理ルーチン
OLIT にはアプリケーションでエラー処理をカスタマイズできるように、特定の範囲のルーチンがあります。
動的リソース
OLIT ではユーザがアプリケーションを起動した後で、特定のリソース (色やフォントなど) の値を動的に変更できるようサポートしています。
次の機能は、Solaris Motif ライブラリに固有のものです。
Solaris Motif では、ユーザインタフェースのレイアウト用の UIL 定義を使用するためのエンジンをサポートしています。このように分離されているため、プログラムの実行可能ルーチンをコンパイルし直さなくてもユーザインタフェースを変更できます。OLIT の Devguide 解決法 (golit) は、ユーザインタフェースを GIL ファイル形式で定義できるようにして同様の機能を提供します。ユーザインタフェースを変更する場合は、アプリケーションをコンパイルし直さなければなりません。
クリップボードルーチン
Solaris Motif には、クリップボードとその選択を管理するライブラリがあります。
ウィジェット作成ルーチン
Solaris Motif には、特定のタイプのウィジェットまたはウィジェットグループを作成する完全なルーチンセットがあります。
複合文字列のサポート
Solaris Motif では、ほとんどのテキストに複合文字列を使用する必要があります。これらの特殊な文字列形式をサポートするために、Solaris Motif には複合文字列を作成して処理するための多数のルーチンが組み込まれています。
OLIT と Solaris Motif のツールキットは、類似する機能を持つ多数の共通ウィジェットとガジェットをサポートし、それぞれのツールキットではより固有の多数のウィジェットをサポートします。あるウィジェットが一方のツールキットには実装されているが他方には実装されていない場合は、実装されていないツールキット内で複数のウィジェットを使用すると同等のオブジェクトを構築できる場合が多いです。
表 5-4 は共通ウィジェット名と、各ツールキット内のそのウィジェットに対応する実際のクラス名を示します
表 5-4 共通ウィジェットのマッピング
OLIT のクラス名 |
Solaris Motif のクラス名 |
---|---|
BulletinBoard |
XmBulletinBoard |
DrawArea |
XmDrawingArea |
ExclusiveChoice + RectButtons |
XmRowColumn + XmToggleButtons (ラジオボックス) |
Form |
XmForm |
Manager |
XmManager |
MenuButton |
DtMenuButton (OpenWindows 環境ではアクセスできない) |
NoticeShell |
XmDialogShell + XmMessageBox |
AbbrevMenuButton |
XmRowColumn (オプションメニュー) |
PopupWindowShell |
XmDialogShell |
NonExclusiveRectButton |
XmRowColumn + XmToggleButtons (チェックボックス) |
PopupMenuShell |
XmMenuShell |
Primitive |
XmPrimitive |
OblongButton |
XmPushButton |
ControlArea |
XmRowColumn |
Scrollbar |
XmScrollBar |
ScrollingList |
XmList + XmScrolledWindow |
ScrolledWindow |
XmScrolledWindow |
Slider |
XmScale |
StaticText |
XmLabel |
TextEdit |
XmText |
TextField |
XmTextField |
RectButton |
XmToggleButton |
この節では、Solaris Motif に固有のウィジェットについて簡単に説明します。
これらのウィジェットのうち、次のウィジェット以外は、OpenWindows 環境での Motif 開発にも使用できます。
DtTerm、DtEditor、DtComboBox、DtSpinBox、DtMenuButton
このウィジェットは、ANSI X3.64-1979 スタイルの端末エミュレータ (特に DEC VT220 のような拡張機能付き端末) のエミュレートに必要な機能を提供します。
このウィジェットは、カット&ペーストなどの編集サービス用のプログラムインタフェースを提供します。
このウィジェットはテキストフィールドと、そのテキストフィールドに有効な選択肢のリストを提供するリストウィジェットとを組み合わせたものです。このリストから項目を選択すると、そのリスト項目がテキストフィールドに自動的に表示されます。
このウィジェットは、任意の TextField を増減させる便利なユーザインタフェースコントロールです。
このウィジェットは、XmCascadeButton ウィジェットのメニュー階層化機能を補足するコマンドウィジェットです (OLIT には独自のメニューボタンウィジェットがあり、その機能は DtMenuButton と同等です)。
このボタンは、矢印ラベルを表示するプリミティブプッシュボタンウィジェットです。
これはコマンドボックスを構築し、ユーザが選択したコマンドとコマンドヒストリを管理するマネージャウィジェットです。
このボタンは、ラベルをプログラムで描画できるプリミティブプッシュボタンです。
このマネージャウィジェットは、1 つの子に親を設定して、その子を枠で囲むために使用します。
このガジェットは、読み専用テキストのための低オーバーヘッドオブジェクトです。
このマネージャウィジェットは、メニューバー、コマンド領域、作業領域をサポートします。
このマネージャウィジェットは、ウィンドウ内にサイズ変更可能な区画を実装します。
このウィジェットボックスを使用すると、通常のダイアログボックス内のリストから項目を 1 つ選択できます。
このウィジェットは、標準的なファイルの選択方法 (通常はアプリケーションの読み書きのため) を提供します。
libDtWidget ライブラリには DtComboBox、DtSpinBox、DtMenuButton、DtEditor ウィジェットが入っていて、次のライブラリに直接依存します。
この節では、OLIT に固有のウィジェットについて簡単に説明します。
このプリミティブウィジェットによって、ドラッグ&ドロップ操作のソース側と出力側が実装されます。
これらの特殊ウィジェットは、1 つのウィジェットのコンテキスト内で任意の数のサブオブジェクトを管理します。多数のサブ項目が入ったメニューや選択オブジェクトを実装すると、メモリを大幅に節約できます。
このマネージャウィジェットによって、フローティングフッタ領域を持つウィンドウが自動的にサポートされます。
このマネージャウィジェットを使用すると、その子に相対サイズの制約を設けることができます。
このプリミティブウィジェットを使用すると、サブクラスに入れなくても動作をカスタマイズできます。