5

C++ と X11 を使用して、完全に透明なウィンドウを作成しようとしました。イベントを消費せず、下のウィンドウに転送するだけです。Java-Windows で知られているある種の GlassPane ですが、全画面表示です。次に、このウィンドウに描画したいと思います。

これはX11で何とか可能ですか?

XGetImage()私の最初の試みはすべてのイベントを無視することでした。単に...を使用してルート ウィンドウから画像をコピーするだけです。XShmGetImage残念ながら、ここではオプションではありません。

確かに、このウィンドウに装飾は必要ありませんが、それは大きな問題ではありません。

X11 / Xlibのみを使用してこれを行うには? それが不可能な場合、他に何が必要ですか?

どんな助けでも大歓迎です!

PS:Xineramaと同様にアクティブ化されていCompizます。問題が発生した場合は、それらを非アクティブ化することができます。

4

3 に答える 3

5

入力シェイプを空に設定することで、出力専用ウィンドウを作成できます。

API は、 とは別にXFixesSetWindowShapeRegion()設定できます。渡すリージョンを取得するために使用されます。ShapeInputShapeBoundingXFixesCreateRegion()

次に、ほとんどのウィンドウに透明なピクセルを描画できるように、RGBA (アルファ チャネル付き)ビジュアルが必要です。

透明度を機能させるには、合成ウィンドウ マネージャーが必要です。

于 2010-12-01T19:01:55.620 に答える
4

X サーバーでこれを視覚的にサポートするオーバーレイが必要です。そうしないと、ウィンドウを継続的にマップ/マップ解除したり、get/putimage ダンスを常に実行したりする必要があるため、パフォーマンスがまったく低下します。

メイン/ルート プレーンを非オーバーレイにし、その上にオーバーレイ ビジュアルを作成する必要があります。オーバーレイ プレーンで透明なものはすべて、「メイン スクリーン」を通過します。

「プレーンX」でこれを行う方法に関するドキュメントは非常にまばらです。より簡単な方法は、OpenGL / GLX、http: //www.opengl.org/sdk/docs/man/xhtml/glXChooseVisual.xmlを使用することです-単に試してください:

int query[] = { /* GLX_RGBA, */ GLX_LEVEL, 1, 0 };
overlayVisual = glXChooseVisual(mydisplay, DefaultScreen(mydisplay), query);
myWindow = XCreateWindow(..., overlayVisual, ...);

次に、ウィンドウをクリアして「メインルート」を表示し、それを覆うように描画できるはずです。「昔」のオーバーレイは、多くの場合、非 RGB (カラー インデックス/パレット化) のビジュアルである必要があり、透明な部分にはクロマ キーが使用されていました。ただし、OpenGL RGBA はアルファ チャネルを介した透明度/ブレンドをサポートする必要があります...

試したことはありません。現在のフレームバッファはオーバーレイをサポートしていません。Nvidiaは、X11ドライバー/構成ファイルのドキュメントでそれらについて言及しているため、それらはまだ存在しており、この方法で引き続き使用できると思います。

于 2010-12-01T17:13:38.943 に答える