ほとんどの場合、透明オーバーレイウィンドウは標準 X InputOutput ウィンドウと似ています。特に、透明オーバーレイウィンドウには次のような特性があります。
オーバーレイウィンドウに対してもマップとアンマップができます。そのために、XMapWindow、XUnmapWindow、XMapSubwindows、XUnmapSubwindows の各ルーチンが利用できます。
オーバーレイウィンドウは独自のカーソルを所有するか、親ウィンドウのカーソルを使用します。すなわち、XDefineCursor と XUndefineCursor は、オーバーレイウィンドウにも適用されます。
オーバーレイウィンドウは、XQueryTree の出力に表示されます。
ウィンドウ属性の event_mask と do_not_propogate_mask は、正常に動作します。オーバーレイウィンドウは、任意の型のイベントを処理の対象とすることができます。
XTranslateCoordinates と XQueryPointer は、オーバーレイウィンドウに適用されます。
標準の X ウィンドウについては、save_under が適用されます。
標準の X ウィンドウについては、override_redirect が適用されます。
また、透明オーバーレイウィンドウには、ウィンドウを固有のものにする特性があります。以下の節ではこのような特性について説明します。
X 仕様で定義されているように、ウィンドウには背景を設定できます。ウィンドウの背景の主な目的は、クライアントがウィンドウの露出領域を再描画するのに時間がかかる場合に、なにか適当なものをその領域に表示することです。ウィンドウが Expose イベントを受信する度に背景が描画されます。背景が描画された後で、Expose イベントがクライアントに送信されます。クライアントが XClearArea 要求または XClearWindow 要求を発行したときにも背景が描画されます。
標準の X InputOutput ウィンドウと同様に、透明オーバーレイウィンドウにも背景を設定できます。通常のウィンドウと同様に、透明オーバーレイウィンドウの背景は、Expose イベント、XClearArea 要求、XClearWindow 要求に応答して描画されます。標準タイプの背景 (None、pixmap、pixel、ParentRelative) の他に、透明オーバーレイウィンドウでは transparent という新しいタイプの背景を設定することもできます。透明 (transparent) の背景を指定する場合は、XSolarisOvlSetWindowTransparent という新しいルーチンを使用します。
デフォルトでは、透明オーバーレイウィンドウの背景は透明ですが、アプリケーション内では、表 6-1 に示されているように、通常の X タイプの背景 (None、ピックスマップ XID、ピクセル値、ParentRelative) を指定することもできます。
表 6-1 透明オーバーレイウィンドウの背景値
背景 |
説明 |
---|---|
透明 |
透明オーバーレイウィンドウの背景はデフォルトで透明に描画される。 |
なし |
オーバーレイウィンドウ内で背景の描画を起動する条件が検出されると、描画は実行されない。透明ペイントも不透明ペイントも描画されない。 |
ピックスマップ ID |
背景は不透明ペイントで描画される。描画されるピクセル値は X 仕様で定義されたピックスマップから継承される。 |
単一のピクセル値 |
背景は不透明ペイントで一様なペイントのカラーで描画される。 |
ParentRelative |
ParentRelative の背景の動作は、親ウィンドウの背景とタイプによって異なる。親ウィンドウがアンダーレイである場合、オーバーレイウィンドウである子の背景は不透明ペイントで描画され、ピクセルは X 仕様の定義に従って描画される。親ウィンドウがオーバーレイの場合、オーバーレイウィンドウの子の背景は、その親ウィンドウの背景と同じになり、透明ペイントまたは不透明ペイントで描画される。 |
XSolarisOvlSetTransparent を使用してオーバーレイ以外のウィンドウの背景を設定しようとすると、BadMatch エラーが発生します。アンダーレイウィンドウの背景が ParentRelative であり、親ウィンドウが透明な背景を持つオーバーレイである場合、アンダーレイウィンドウである子は None の背景を持つものとして取り扱われます。
オーバーレイウィンドウの境界は不透明です。境界は常に不透明なペイントで描画されます。標準の X InputOutput ウィンドウと同様に、境界の幅は XSetWindowBorderWidth を使用して制御することができます。
バッキングストアはオーバーレイウィンドウについては無効です。
ビットとウィンドウのグラビティ属性 (bit_gravity と win_gravity) は透明オーバーレイウィンドウにも適用されますが、グラビティによってピクセルの移動が必要になる場合は、ピクセルのカラー情報とともに透明かどうかという情報も移動されます。
オーバーレイのカラーマップは、X の規則に従ってインストールされます。ピクセルを共有するオーバーレイ/アンダーレイのペアをアプリケーション内で使用する場合は、各ウィンドウごとに 1 つのカラーマップを作成してください。ピクセルを共有するウィンドウの問題については、「オーバーレイ/アンダーレイに使用するビジュアルの選択」と 「アプリケーションの移植性の設計」を参照してください。
オーバーレイ/アンダーレイのペアがハードウェアカラー LUT を共有しないことが分かっている場合は、それらの両ウィンドウに別々のカラーマップを安全に割り当てることができ、カラーマップフラッシングは発生しません。
アプリケーションの移植性を高め、カラーのフラッシングを最小限に抑えるために、オーバーレイとアンダーレイのカラーマップ内で同じカラーを使用してください。それができない場合は、フラッシングを発生させることなく異なるカラーマップを割り当てられるかどうかを、ビジュアル問い合わせルーチンを使用して調べてください。
オーバーレイウィンドウは、標準の X ウィンドウと同様にイベントを処理の対象とすることができます。オーバーレイウィンドウは、その実際に目に見える範囲内で発生する任意のイベントを受信します。イベントが発生する位置のピクセルのペイント型は問題ではありません。たとえば、オーバーレイウィンドウがウィンドウ進入イベントを処理の対象としている場合に、ポインタがウィンドウの実際に目に見える範囲内に入ると、ピクセルが透明であっても不透明であっても、オーバーレイウィンドウはウィンドウ進入イベントを受信します。
このことは、アプリケーション内でグラフィカルオブジェクトの対話的なピッキング (選択) をどのように実装するかという問題に影響を与えます。すなわち、アンダーレイウィンドウに描画されたグラフィカルオブジェクトの上にあるオーバーレイウィンドウに対して、別のグラフィカルオブジェクトを描画するアプリケーションは、オーバーレイウィンドウ内またはアンダーレイウィンドウ内のどちらかのイベントを処理の対象とする必要がありますが、その両方のウィンドウ内のイベントを処理の対象とする必要はありません。入力イベントを受け取ったアプリケーションは、オーバーレイ/アンダーレイの階層構造に関する知識を利用して、どちらのグラフィカルオブジェクトが選択されたかを確定しなければなりません。
たとえば、アプリケーションがアンダーレイウィンドウ内のイベントを処理の対象としていると想定します。このアプリケーションが座標 (x,y) でイベントを受信すると、まず最初にオーバーレイ内のその座標にグラフィカルオブジェクトが存在するかどうかが調べられます。存在すれば、そこで探索処理は終了します。存在しなければ、アプリケーションは、アンダーレイ内のその座標にグラフィカルオブジェクトが存在するかどうかを確認しなければなりません。
グラフィカルイメージが X ウィンドウに描画されると、ユーザーはウィンドウの表示内容を取り出してプリンタに送信し、ハードコピーを取ることができます。そのための最も一般的な方法は、画面のダンプを実行することです。すなわち、XGetImage を使用してウィンドウピクセルを読み取り、そのイメージをプリンタに送信します。印刷ページのサイズにイメージを合わせるために、イメージの拡大・縮小が必要になる場合もあります。このため、イメージ内にピクセル単位の拡大・縮小によるがたつきが生じることがあります。
X11 の利用者の間で一般的になりつつあるもう一つの方法は、特殊なプリンタグラフィックス API を通じてグラフィックスを再描画することです。この API は標準の Xlib グラフィックスコールをサポートし、これらの関数呼び出しをページ記述言語 (PDL) 形式に変換して適切なプリントスプーラに送信します。この方法の利点は、走査変換が適用された後のピクセルではなく座標自身を拡大・縮小することによって、グラフィックスを印刷ページに合わせられることです。したがって、イメージのがたつきが最小限に抑えられます。
ただし、プリンタ API を使用する方法は、オーバーレイ/アンダーレイウィンドウのペアに適用するときには重大な障害があります。大部分の PDL では、不透明なペイントの概念だけがサポートされ、透明なペイントはサポートされません。たとえば PostScript PDL の場合、以前に出力されたピクセルは新たに出力されたピクセルによって常に置き換えられます。このような制限があるため、プリンタ API を使用する方法では、オーバーレイ/アンダーレイウィンドウの組み合わせ中のイメージを完全に取り出せるとは限りません。特に、オーバーレイの背景が完全に透明で、不透明なペイントだけがそれに描画されるような特殊なアプリケーションでは、アンダーレイが最初に出力された後、オーバーレイが 出力されます。ただし、透明なペイントがオーバーレイに描画されて、そのオーバーレイ内の他の不透明なペイントが消去されると、上記の仕組みはうまく動作しません。
このような問題が解決されるまでは、XReadScreen と拡大・縮小処理を使用して、オーバーレイウィンドウ内のイメージの取り出しとプリンタへの送信を行ってください。あるいは、プリントする予定の情報を描画するときは、オーバーレイを使用しないでください。