オーバーレイを使用するアプリケーションの移植性を維持するためには、適切なオーバーレイビジュアルを探索し、指定されたアンダーレイビジュアルに使用できることが必要です。あるいは適切なアンダーレイビジュアルを探索し、指定されたオーバーレイビジュアルに使用できることが必要です。オーバーレイ拡張機能をサポートする各 X スクリーンでは、アンダーレイウィンドウの子として使用するのに最適なウィンドウを持つオーバーレイビジュアルの集合が定義されます。各アンダーレイビジュアルごとに最適なオーバーレイビジュアルの集合が存在します。アンダーレイビジュアルとそれらに最適なオーバーレイビジュアルの組み合わせによって、各スクリーンの「オーバーレイ/アンダーレイの最適なペア」が形成されます。最適なペアを形成するオーバーレイ/アンダーレイの各ビジュアルは、お互いの「パートナ」と呼ばれます。
ルーチン XSolarisOvlSelectPartner を使用すれば、アンダーレイビジュアルを入力として与えて、特定の条件を満たす最適なオーバーレイビジュアルを選択することができます。またその逆に、オーバーレイビジュアルを入力として与えて、特定の条件を満たす最適なアンダーレイビジュアルを選択することもできます。オーバーレイに関係のない X エラーは別として、選択されたビジュアルを使用すれば、ウィンドウを安全に作成することができます。
このルーチンは、特定のビジュアルの最適なパートナを探索し、条件に合致するビジュアルが見つかったかどうかに応じて成功または失敗を表す状態を戻します。条件には次の 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;
hardCriteriaMask と softCriteriaMask は、次に示す任意のビットマスクの論理和を値とするビットマスクです。
#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;
1 つの XSolarisOvlVisualCriteria 構造体で指定された、すべてのハード条件とソフト条件を満たすビジュアルが正常に見つかった場合は、XSolarisOvlSuccess が戻されます。
選択されたビジュアルが、1 つの XSolarisOvlVisualCriteria 構造体で指定された、すべてのハード条件は満たすが、ソフト条件は満たさない場合は、XSolarisOvlQualifiedSuccess が戻されます。この場合は、満たされなかったソフト条件の論理和が unmetCriteriaReturn に書き込まれます。
XSolarisOvlCriteriaFailure は、XSolarisOvlVisualCriteria 構造体で指定されたハード条件を満たすビジュアルが見つからなかったことを示します。この場合は、もっとも緩いハード条件を持つ XSolarisOvlVisualCriteria 構造体について、満たされなかったハード条件の論理和が unmetCriteriaReturn に書き込まれます。
条件の不一致以外のエラーが発生した場合は、XSolarisOvlFailure が戻されます。
このルーチンでは、優先順位の高い順に条件集合を指定することができます。すなわち、単一の呼び出しで複数の条件集合が指定できます。まず、最初の条件集合に合致するビジュアルの探索がルーチンにより行われ、最初の条件集合のすべてのハード条件を満たすビジュアルが見つかると、そのビジュアルが選択されます。そのようなビジュアルが見つからない場合は、2 番目の条件集合を使用して探索が続けられます。このような手続きは、特定の条件集合のすべてのハード条件を満たすビジュアルが見つかるか、すべての条件集合のテストが終了するまで続けられます。すなわち、この優先順位の仕組みでは、もっとも望ましいビジュアルを最初の条件集合として指定し、それより優先度の低いビジュアルについては 2 番目以降の条件集合として指定すればよいわけです。この仕組みにより、単一のサブルーチン呼び出しで、ビジュアルに関するユーザーの要求を優先順位の高い順に探索することができます。
特定の条件集合では、任意の条件をハード条件またはソフト条件として指定することができます。特定の条件の hardCriteriaMask は、探索時にハード条件として指定する条件ビットマスクの論理和です。同様に、softCriteriaMask はソフト条件ビットマスクの論理和です。
条件の中には特定の値を取るものがあります。これらの値は、XSolarisOvlVisualCriteria 構造体の他のデータメンバによって提供されます。以下の条件の説明では、これらのデータメンバを必要に応じて取り上げます。
XSolarisOvlVisualClass は、選択されたビジュアルが特定のビジュアルクラスを持つことを指定します。そのビジュアルクラスは c_class で指定します。
XSolarisOvlDepth, XSolarisOvlMinColors, XSolarisOvlMinRed, XSolarisOvlMinGreen, XSolarisOvlMinBlue の各条件は、相互に関連があります。通常は、これらの条件の一部だけを指定します。
XSolarisOvlDepth は、選択されたビジュアルのデプスが depth に等しくなることを指定します。
XSolarisOvlMinColors は、選択されたビジュアルで表示可能なカラーの総数が少なくとも minColors 個であることを指定します。
XSolarisOvlMinRed、XSolarisOvlMinGreen、XSolarisOvlMinBlue を使用すれば、DirectColor ビジュアルまたは TrueColor ビジュアルについて詳細なカラー条件を指定することができます。各条件に対応する値はそれぞれ、minRed、minGreen、minBlue で指定します。これらのデータメンバの値は、選択されたビジュアルの赤、緑、青の要素値の下限を指定するものです。
XSolarisOvlMinBitsPerRGB は、選択されたビジュアル上で作成されるカラーマップからのカラーチャネル出力が少なくとも minBitsPerRGB であることを指定します。
XSolarisOvlMinBuffers は、選択されたビジュアルに少なくとも minBuffers 個の高速 MBX イメージバッファを割り当てることを指定します。
XSolarisOvlUnsharedPixels は、引数のビジュアル vid のウィンドウピクセルとは異なる描画プレーングループ内に存在するウィンドウピクセルを持つパートナビジュアルを選択します。この条件下では、引数のビジュアルと同じ描画プレーングループを使用するビジュアルは選択されません。
XSolarisOvlUnsharedColors は、オーバーレイ/アンダーレイのウィンドウペアがカラーマップのフォーカスを保持しているときに、ウィンドウピクセルのカラーを同時に表示できるようなパートナビジュアルを選択します。この条件下では、ビジュアルが単一のカラー LUT プールを共有し、そのプール内に引数のビジュアルと同じカラー LUT が 1 個しか存在しない場合、そのビジュアルは選択されません。
条件集合の hardCriteriaMask をゼロに設定すると、任意のビジュアルがその条件集合のハード条件を満たすことになります。同様に、条件集合の softCriteriaMask をゼロに設定すると、その条件集合のソフト条件は必ず満たされることになります。