xorgで累積ウィンドウを描画するには?

xorgで累積ウィンドウを描画するには?

私はLow Level X Window ProgrammingRoss Maloneyの本を読んでいます。彼は、ウィンドウを「削除」するときに「隠された」コンテンツを復元するスタックウィンドウシステムの主な側面の1つについて話しています。

通常、「後ろの」コンテンツはすぐに表示されると予想されます。ただし、x一部の実装では提供していますが、これは明らかに実装で提供する必要はありません。

これ別名で保存そしてバックアップストアサービスが少し異なります。保存は、ウィンドウがマップされる前にインスタンスのサーバーメモリを使用して、サーバー上のウィンドウがマップされた画面の内容を保存します。

  1. サーバーが提供していない場合は、xクライアント側で実装する必要がありますか?
  2. いくつかの一般的なウィンドウマネージャはスタッキングをどのように実装しますか?
  3. この機能が実際に提供されている場合、xorg「保存」に特に使用できる特定のアルゴリズムはありますか?後で使用するために重複する領域のコピーを保存する方法を理解していません。特に複数の重複部分がある場合=)私のアイデアはすでに興味深いです!これらのデルタを使用してスタックを再構築できますか?

そうでない場合は、ウィンドウをランダムに削除した場合、累積された各ウィンドウを1つずつ再描画しますか?ウィキペディアはこう述べています。

スタッキングは、最も背面、最も外側から最前面、最も内側まで、各ウィンドウを1つずつ再描画する必要がある比較的遅いプロセスです。多くの累積ウィンドウマネージャが常に背景ウィンドウを再描画するわけではありません。一部のアプリケーションは出力が変更されたときにスタックを要求するため、他のプログラムはすべてのウィンドウを再描画する時期を検出できます。再スタッキングは通常、必要に応じてウィンドウを選択的に再描画するウィンドウマネージャへの関数呼び出しによって実行される。たとえば、背景ウィンドウを前方にインポートすると、そのウィンドウだけを再描画できます。

PS:これは大きな質問であることを知っていますが、いくつかのガイドラインを得ることが役に立ちます。

答え1

両方バックアップストアそして別名で保存を使用してウィンドウを作成するときに設定できるプロパティ/フラグですXCreateWindow()。ただし、これはX11サーバーのヒントであり、デフォルトではオンになっておらず、最新のハードウェアでは問題を引き起こす価値はありません。

通常、背景ウィンドウ(一部)が表示されると、X11サーバーはExposeX11クライアントにイベントを送信して再描画します。これはヒントであるため、クライアントがウィンドウとその上に開くポップアップに設定されていてExposeも、X11サーバーはヒントを送信し続けることができます。.backing_store = AlwaysCWSaveUnder

XDoesBackingStore()クライアントがサーバーがバックアップリポジトリーを実装し、それを保管するか下に保管するかを照会するためのインターフェースもありますXDoesSaveUnders()

ウィンドウマネージャはこれとは何の関係もありません。ウィンドウを再描画しません(セルフウィンドウ:タイトルバー、閉じるボタンを除く)。

答え2

そうでない場合は、ウィンドウをランダムに削除した場合、累積された各ウィンドウを1つずつ再描画しますか?

最も広く使用されているデスクトップは、最新のXCOMPOSITE拡張を使用します。完全なウィンドウコンテンツはオフスクリーンバッファとしてレンダリングされるため、アプリケーションはコンテンツを再描画することなくコンポジションマネージャで使用できます。

これはから抜粋したものです。公式ウェブサイト:

この拡張を使用すると、ウィンドウ階層のサブツリー全体がオフスクリーンバッファとしてレンダリングされます。その後、アプリケーションはそのバッファの内容を取得して目的の操作を実行できます。オフスクリーンバッファは自動的に親ウィンドウにマージすることも、コンポジションマネージャと呼ばれる外部プログラムによってマージすることもできます。コンポジションマネージャを使用すると、多くの興味深い効果を得ることができます。

関連情報