Solaris X Window System 開発ガイド

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

オーバーレイを使用するアプリケーションの移植性を維持するためには、適切なオーバーレイビジュアルを探索し、指定されたアンダーレイビジュアルに使用できることが必要です。あるいは適切なアンダーレイビジュアルを探索し、指定されたオーバーレイビジュアルに使用できることが必要です。オーバーレイ拡張機能をサポートする各 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ゼロに設定すると、その条件集合のソフト条件は必ず満たされることになります。