Solaris X Window System 開発ガイド

アプリケーションの移植性の設計

Solaris オーバーレイ API には、デバイス間でアプリケーションの移植性を保証できるように、次の 2 つのルーチンが用意されています。

次に、この 2 つのルーチンについて説明します。

オーバーレイ/アンダーレイウィンドウのビジュアルの選択

オーバーレイを使用するアプリケーションの移植性を維持するためには、適切なオーバーレイビジュアルを探索し、指定されたアンダーレイビジュアルに使用できることが必要です。あるいは適切なアンダーレイビジュアルを探索し、指定されたオーバーレイビジュアルに使用できることが必要です。オーバーレイ拡張機能をサポートする各 X スクリーンでは、アンダーレイウィンドウの子として使用するのに最適なウィンドウを持つオーバーレイビジュアルの集合が定義されます。各アンダーレイビジュアルごとに最適なオーバーレイビジュアルの集合が存在します。アンダーレイビジュアルとそれらに最適なオーバーレイビジュアルの組み合わせによって、各スクリーンの「オーバーレイ/アンダーレイの最適なペア」が形成されます。最適なペアを形成するオーバーレイ/アンダーレイの各ビジュアルは、お互いの「パートナ」と呼ばれます。

ルーチン XSolarisOvlSelectPartner を使用すれば、アンダーレイビジュアルを入力として与えて、特定の条件を満たす最適なオーバーレイビジュアルを選択することができます。またその逆に、オーバーレイビジュアルを入力として与えて、特定の条件を満たす最適なアンダーレイビジュアルを選択することもできます。オーバーレイに関係のない X エラーは別として、選択されたビジュアルを使用すれば、ウィンドウを安全に作成することができます。

このルーチンは、特定のビジュアルの最適なパートナを探索し、条件に合致するビジュアルが見つかったかどうかに応じて成功または失敗を表す状態を戻します。条件には次の 2 つの種類があります。

  1. ハード条件 – 必ず満たされなければならない条件。ハード条件を満たすビジュアルだけが最適なペアの候補となります。

  2. ソフト条件 – 必須ではないが満たされたほうが望ましい条件。

すべてのハード条件と大部分のソフト条件を満たすビジュアルが選択され、そのビジュアルの属性が戻されます。すべてのハード条件および同じ数のソフト条件を満たすビジュアルが複数見つかった場合は、そのうち 1 つのビジュアルが選択されて戻されます。どのビジュアルが選択されるかは、実装状態によって異なります。

XSolarisOvlSelectPartner の構文と引数を次に示します。

XSolarisOvlSelectStatus

XSolarisOvlSelectPartner (Display *display, int screen,  VisualID vid,

XSolarisOvlSelectType seltype, int numCriteria, XSolarisOvlVisualCriteria

*pCriteria, 		XVisualInfo *visinfoReturn, 		unsigned long

*unmetCriteriaReturn)

display

X サーバーへの接続を指定する。 

screen

ビジュアル vid のスクリーンを指定する整数。

vid

パートナを探すビジュアルの XID。 

seltype

選択対象となるビジュアルの種類を指定する。 

numCriteria

pCriteria 配列の中にあるXSolarisOvlVisualCriteria 構造体の数。

pCriteria

ビジュアルを選択するための条件を優先順位の高い順に指定した XSolarisOvlVisualCriteria 構造体の配列。 

visinfoReturn

呼び出し側が提供する XVisualInfo 構造体へのポインタ。正常終了の場合は、選択されたビジュアルの属性がこの構造体に書き込まれる。

unmetCriteriaReturn

満足されなかった条件を記述するビットマスクへのポインタ。この出力引数が意味を持つのは、ルーチンが XSolarisOvlQualifiedSuccessまたは XSolarisOvlCriteriaFailure という値を戻すときに限られる。

引数の型

XSolarisOvlSelectType は、XSolarisOvlSelectPartner 内で選択できる 2 種類のビジュアルを定義する列挙型です。この構造体は、次のように定義されます。

typedef

enum { 	XSolarisOvlSelectBestOverlay,   XSolarisOvlSelectBestUnderlay, }

XSolarisOvlSelectType;

XSolarisOvlVisualCriteria はビジュアルの選択時に使用される各種条件と、それらの条件の重要度を定義する構造体です。この構造体は次のように定義されます。

typedef

struct {  unsigned long  hardCriteriaMask; unsigned 

long  softCriteriaMask  int   c_class;  unsigned int  depth;  unsigned

int     minColors; 	unsigned int    minRed;   unsigned int   minGreen;

  unsigned int   minBlue; 	unsigned int   minBitsPerRGB;  

unsigned   int      minBuffers; }

XSolarisOvlVisualCriteria;

hardCriteriaMasksoftCriteriaMask は、次に示す任意のビットマスクの論理和を値とするビットマスクです。

#define

XSolarisOvlVisualClass                          (1L<<0) #define

XSolarisOvlDepth                                (1L<<1) #define

XSolarisOvl     MinColors                       (1L<<2) #define

XSolarisOvlMinRed                               (1L<<3) #define

XSolarisOvl    MinGreen                         (1L<<4) #define

XSolarisOvl       MinBlue                       (1L<<5) #define

XSolarisOvlMinBitsPerRGB                        (1L<<6) #define

XSolarisOvl    MinBuffers                       (1L<<7) #define

XSolarisOvlUnsharedPixels                       (1L<<8) #define

XSolarisOvlUnsharedColors                       (1L<<9) #define

XSolarisOvlPreferredPartner                     (1L<<10)

戻り値の型

XSolarisOvlSelectStatus はルーチンがビジュアルの探索に成功したかどうか、失敗した場合はその理由を示す値です。戻り値は、次のいずれかになります。

typedef

enum { 	XSolarisOvlSuccess, 	XSolarisOvlQualifiedSuccess,

	XSolarisOvlCriteriaFailure, 	XSolarisOvlFailure, }

XSolarisOvlSelectStatus;

複数の条件集合

このルーチンでは、優先順位の高い順に条件集合を指定することができます。すなわち、単一の呼び出しで複数の条件集合が指定できます。まず、最初の条件集合に合致するビジュアルの探索がルーチンにより行われ、最初の条件集合のすべてのハード条件を満たすビジュアルが見つかると、そのビジュアルが選択されます。そのようなビジュアルが見つからない場合は、2 番目の条件集合を使用して探索が続けられます。このような手続きは、特定の条件集合のすべてのハード条件を満たすビジュアルが見つかるか、すべての条件集合のテストが終了するまで続けられます。すなわち、この優先順位の仕組みでは、もっとも望ましいビジュアルを最初の条件集合として指定し、それより優先度の低いビジュアルについては 2 番目以降の条件集合として指定すればよいわけです。この仕組みにより、単一のサブルーチン呼び出しで、ビジュアルに関するユーザーの要求を優先順位の高い順に探索することができます。

特定の条件集合では、任意の条件をハード条件またはソフト条件として指定することができます。特定の条件の hardCriteriaMask は、探索時にハード条件として指定する条件ビットマスクの論理和です。同様に、softCriteriaMask はソフト条件ビットマスクの論理和です。

条件の中には特定の値を取るものがあります。これらの値は、XSolarisOvlVisualCriteria 構造体の他のデータメンバによって提供されます。以下の条件の説明では、これらのデータメンバを必要に応じて取り上げます。

条件集合の hardCriteriaMask をゼロに設定すると、任意のビジュアルがその条件集合のハード条件を満たすことになります。同様に、条件集合の softCriteriaMaskゼロに設定すると、その条件集合のソフト条件は必ず満たされることになります。

オーバーレイ/アンダーレイビジュアルの最適なペアの選択

このルーチンは XSolarisOvlSelectPartner と似ていますが、特定のビジュアルのパートナビジュアルを見つけるのではなく、特定のスクリーン上のすべてのビジュアルペアから、指定された条件にもっとも合致するオーバーレイとアンダーレイのペアを同時に選択します。オーバーレイに関係のない X エラーは別として、選択されたビジュアルを使用すれば、ウィンドウを安全に作成することができます。

このルーチンは、pCriteria で指定された条件に基づいて、特定のスクリーンの最適なビジュアルペアを探索し、それからすべてのビジュアルペア (最適なペアとそれ以外のペア) を探索します。オーバーレイとアンダーレイに関する条件は、pCriteria の各要素で指定されます。このルーチンは、指定された条件に合致するペアが見つかったかどうかに応じて成功または失敗を表す状態を戻します。

選択されたペアのオーバーレイビジュアルは、オーバーレイに関するすべてのハード条件を満たします。また、このペアのアンダーレイビジュアルは、アンダーレイに関するすべてのハード条件を満たします。オーバーレイビジュアルの属性は ovVisinfoReturn に戻され、アンダーレイビジュアルの属性は unVisinfoReturn に戻されます。すべてのハード条件 (オーバーレイとアンダーレイ) および同じ数のソフト条件 (オーバーレイまたはアンダーレイ) を満たすビジュアルペアが複数見つかった場合は、そのうち 1 つのペアが選択されて戻されます。どのペアが選択されるかは、実装状態によって異なります。

構文と引数を次に示します。

XSolarisOvlSelectStatus

XSolarisOvlSelectPair (Display *display, int screen, int numCriteria,

  XSolarisOvlPairCriteria *pCriteria, XVisualInfo *ovVisinfoReturn,

XVisualInfo *unVisinfoReturn,  unsigned long *unmetOvCriteriaReturn,

  unsigned long *unmetUnCriteriaReturn)

display

X サーバーへの接続を指定する。 

screen

ビジュアルの探索場所となるスクリーンを指定する整数。 

numCriteria

pCriteria 配列の中にある XSolarisOvlPairCriteria 構造体の数。

pCriteria

ビジュアルのペアを選択するための条件を優先順位の高い順から低い順に指定した XSolarisOvlPairCriteria 構造体の配列。

ovVisinfoReturn

呼び出し側が提供する XVisualInfo 構造体へのポインタ。正常終了の場合は、選択されたオーバーレイビジュアルの属性がこの構造体に書き込まれる。

unVisinfoReturn

呼び出し側が提供する XVisualInfo 構造体へのポインタ。正常終了の場合は、選択されたアンダーレイビジュアルの属性がこの構造体に書き込まれる。

unmetOvCriteriaReturn

オーバーレイビジュアルに関して満足されなかった条件を記述するビットマスクへのポインタ。この出力引数が意味を持つのは、ルーチンが XSolarisOvlQualifiedSuccess または XSolarisOvlCriteriaFailure という値を戻すときに限られる。

unmetUnCriteriaReturn

アンダーレイビジュアルに関して満足されなかった条件を記述するビットマスクへのポインタ。この出力引数が意味を持つのは、ルーチンが XSolarisOvlQualifiedSuccess または XSolarisOvlCriteriaFailure という値を戻すときに限られる。

引数の型

XSolarisOvlPairCriteria はビジュアルの選択時に使用される各種条件と、それらの条件の重要度を定義する構造体です。この構造体は次のように定義されます。

typedef

struct {  XSolarisOvlVisualCriteria  overlayCriteria;

  XSolarisOvlVisualCriteria   underlayCriteria; }

XSolarisOvlPairCriteria;

XSolarisOvlVisualCriteria は、XSolarisOvlSelectPartner の仕様で定義されています。

戻り値の型

XSolarisOvlSelectStatus はこの型の定義については、XSolarisOvlSelectPartner の仕様を参照してください。

条件集合

XSolarisOvlSelectPartner と同様に、XSolarisOvlSelectPair では、優先順位の高い順に条件集合を指定することができます。すなわち、単一の呼び出しで複数の条件集合が指定できます。まず、オーバーレイとアンダーレイに関する最初の条件集合に合致するビジュアルペアの探索がルーチンにより行われ、最初の条件集合のすべてのハード条件を満たすペアが見つかると、そのペアが選択されます。そのようなペアが見つからない場合は、2 番目の条件集合を使用して探索が続けられます。このような手続きは、特定の条件集合のすべてのハード条件を満たすペアが見つかるか、すべての条件集合がテストされるまで続けられます。すなわち、この優先順位の仕組みでは、もっとも望ましいペアを最初の条件集合として指定し、それより優先度の低いペアについては 2 番目以降の条件集合として指定すればよいわけです。この仕組みにより、単一のサブルーチン呼び出しで、ペアに関するユーザーの要求を優先順位の高い順に探索することができます。

指定できる条件マスクの詳細については、オーバーレイ/アンダーレイウィンドウのビジュアルの選択を参照してください。