Solaris X Window System 開発ガイド

第 5 章 サーバーオーバーレイウィンドウ

この章では、以下の項目について説明します。

サーバーオーバーレイと透明オーバーレイ

オーバーレイウィンドウに透明なピクセルを描画する場合、2 つの API を使用できます。透明オーバーレイ拡張機能は Sun 独自の方法で X Window System にオーバーレイ機能を提供します。透明オーバーレイは、ハードウェアのオーバーレイサポートがない場合でもオーバーレイ機能を提供できます。ハードウェアがサポートしている場合には、サーバーオーバーレイというもう 1 つの方法を使用できます。

透明オーバーレイ拡張機能は完全な X 拡張機能で、透過性の効果を得るために拡張機能を呼び出す必要があります。この方法は確実であり、ハードウェアが実際にオーバーレイをサポートしていない場合でも、ほとんどのシステムで透過性をエミュレートできます。しかし、ハードウェアでサポートされていない場合には、透明なウィンドウの操作は非常に遅くなります。

サーバーオーバーレイは X 拡張機能ではなく、代わりに API が X クライアントに対して、オーバーレイであるビジュアルと、透過性のために使用するピクセル値を判断するための方法を提供します。この API はハードウェアサポートを必要とします。

透明オーバーレイ拡張機能およびサーバーオーバーレイは同じスクリーン上で使用できますが、同じウィンドウ内で使用しないでください。結果は未定義となります。サーバーオーバーレイ専用に設計されたビジュアル内で透明オーバーレイウィンドウを作成しようとすると、BadMatch が発生します。透明オーバーレイでは、適切な手順に従ってパートナオーバーレイビジュアルを特定することによりこれを回避できます。第 6 章「透明オーバーレイウィンドウ」を参照してください。

オーバーレイのプログラミングのヒント

以下の情報は、使用するモデルとスタッキングの処理方法を決めるときに役立ちます。

親子モデル

すべての透過性およびオーバーレイの設計において、アンダーレイ (下層) が親、オーバーレイが子という単純なモデルを使用することをお勧めします。アンダーレイウィンドウを最初に作成した後、アンダーレイの子としてオーバーレイを作成します。オーバーレイはアンダーレイの唯一の子です。これにより、X サーバーの多くの奇妙な状況が回避され、アンダーレイとオーバーレイの間に誤ってウィンドウが挿入されることがなくなります。

Xlib を使用したり、これらの呼び出しについて独自の XCreateWindow をプログラミングしたりする場合、親と異なるビジュアルを持つウィンドウを作成するときにはクライアントはより多くの情報を提供しなければなりません。ビジュアルがデフォルトのビジュアルでない場合、カラーマップを指定するか、カラーマップが同じ場合は親のビジュアルのカラーマップを子に割り当てなければなりません。デプスが異なる場合は、BorderPixel または BorderPixmap を指定しなければなりません。そうしないと、ウィンドウ作成の結果として BadMatch が返されることがあります。

カラーマップの等価性については、『X Server Device Developer's Guide』を参照してください。

スタッキング

ウィンドウを手前に配置する場合、そのウィンドウがオーバーレイウィンドウであるかどうかに関係なく、スタックの一番上に配置されます。ウィンドウを後ろに配置する場合、そのウィンドウがオーバーレイウィンドウであるかどうかに関係なく、スタックの一番下に配置されます。

これにより、オーバーレイウィンドウがアンダーレイウィンドウの下になるという混乱が生じます。実際に、このようなことは頻繁に発生します。これは X サーバーが単純なスタッキングポリシーを使用するためで、ソフトウェアでクリップしなければならない場合でも、あらゆる処理を行ってオーバーレイウィンドウを他のウィンドウの下に表示します。

アンダーレイが親、オーバーレイが子というモデルを使用することにより、この問題を解決できます。これにより、アンダーレイとオーバーレイのペアは、親ウィンドウのアプリケーションとして処理され、一緒に手前および後ろに移動されます。

サーバーオーバーレイ

サーバーオーバーレイ API により、アプリケーションは簡単にオーバーレイビジュアルと対応する透明なピクセル値を見つけることができます。オーバーレイビジュアルはオーバーレイウィンドウを作成するために使用され、透明なピクセルは下にあるアンダーレイが見えるようにするためにクライアントが使用する特殊なピクセル値です。このピクセル値は、すべての描画操作での一般的な前景や背景、またはオーバーレイウィンドウの背景で使用されます。

サーバーオーバーレイ API は、ルートウィンドウの SERVER_OVERLAY_VISUALS プロパティに以下の情報が含まれていることを指定しています。サーバーにより返される情報のサイズにより、返されるこの構造体のインスタンスの数 (リストされた各ビジュアルについて 1 つのインスタンス) が決まります。

typedef struct { 

	unsigned int visualid;  	unsigned int

trans_type;  	unsigned int

value;  	unsigned int

layer;  } ServerOverlaysInfoRec;

visualid

X サーバーにより参照されるビジュアル ID。通常、XGetVisualInfo によりクライアントに返される。

trans_type

透過性のタイプ。0 は None、1 は Transparent Pixel、2 は Transparent Mask。 

value

透明なピクセル値またはマスク値。 

layer

透過性の効果に関するビジュアルの相対的なハードウェアレイヤ。 

trans_type の値は、仕様では一般的ではない他の透過性のタイプがある、という前提で存在しています。透明なピクセルが使用できない場合 trans_type はゼロになりますが、これは X サーバーが、通常のウィンドウとは異なるプレーングループのセットに存在することを、知らせようとするためです。

通常のウィンドウの場合 layer は普通ゼロですが、実際には相対的な数値で、数値の大きいプレーングループは数値の小さいプレーングループよりも上であることを示します。負の数値の場合もあります。

SERVER_OBERLAY_VISUALS プロパティにリストされていないビジュアルは、レイヤが 0、透過性が none であるとみなされます。これらのデフォルト値は、サーバーオーバーレイ操作にのみ適用されます。

透明なピクセルは次のレイヤの最初のウィンドウに通過して表示されます。レイヤはスタック順序に影響せず、透過性の効果にのみ適用されます。対象となるアンダーレイの直接かつ唯一の子としてオーバーレイを使用することをお勧めします。これにより、最適のパフォーマンスが得られ、混乱が少なくなります。

サーバーオーバーレイのサポートはデバイスに依存し、完全なハードウェア移植や部分的なソフトウェアエミュレーション、またはソフトウェアとハードウェアの組み合わせの場合があります。

サーバーオーバーレイは、『The X Journal』July/August 1993 号の Mark J. Kilgurad による「Programming X Overlay Window」で定義されています。