2011-01-07 19 views
3

"Xプロトコルリファレンスマニュアル:ボリュームゼロ"のコピーに基づいて、Windows用のX11サーバーを最初から構築する作業を進めています。私はメッセージの解読とクライアントとの有意義な会話を進める上で多くの進歩を遂げましたが、実際に何をすべきかを理解することができません。X11ウィンドウの階層構造と描画コマンドの理解

この例のメッセージは、Linuxマシンでxbiffを実行し、Windows上のxserverと通信することに由来します。プロトコルを解釈するのに間違ったことがある可能性は全くありますが、これまでのところデータはほぼ正しいと思われます。

グラフィックコールは、クライアントが描画可能としてルートウィンドウのID(90)とグラフィックスコンテキストを作成し、これを起動します。

X_CreateGC: ID: 2097152, Drawable: 90, ValueMask: 8, Value0: 16777215 

ルートウィンドウに基づいてGCを作成する意義は何ですか?

次に、2つの48×48ピックスマップを作成し、その上に画像を置く:

X_CreatePixmap: Depth: 1, ID: 2097153, Drawable: 90, Width: 48, Height: 48 

X_CreateGC: ID: 2097154, Drawable: 2097153, ValueMask: 12, Value0: 1, Value1: 0 

X_PutImage: Format: 0, Size: 408, Drawable: 2097153, GraphicsContext: 2097154, Width: 48, Height: 48, X: 0, Y: 0, LeftPad: 0, Depth: 1 

X_FreeGC: Graphics Context: 2097154 

X_CreatePixmap: Depth: 1, id: 2097155, Drawable: 90, Width: 48, Height: 48 

X_CreateGC: ID: 2097156, Drawable: 2097155, ValueMask: 12, Value0: , Value1: 0 

X_PutImage: Format: 0, Size: 408, Drawable: 2097155, Graphics Context: 2097156, WIdth: 48, Height: 48, X: 0, Y: 0, LeftPad: 0, Depth: 1 

X_FreeGC: Graphics Context: 2097156 

アムは、私がこれでGCは2つの48×48のビットマップでなければなりませんMemoryDCと最終結果と同等であることを考えるに修正しますPutImageコールにあったデータを含むメモリ?

ここでは、ルートウィンドウに基づいて、別のグラフィックスコンテキストを作成しますが、私は理由を理解していない:それは2つの48×48のウィンドウ、親としてルートと1とで次が作成されます

X_CreateGC: ID: 2097157, Drawable: 90, ValueMask: 65544, Value0: 16777215, Value1: 0 

次へ親として最初のウィンドウ:

X_CreateWindow: Depth: 24, ID: 2097158, Parent: 90, X: 0, Y: 0, Width: 48, Height: 48, BorderWidth: 1, Class: 1, Visual: 0, Bitmask: 10266, Value0: 16777215, Value1: 0, Value2: 1, Value3: 6422576, Value4: 32 

X_CreateWindow: Depth: 24, ID: 2097161, Parent: 2097158, X: 0, Y: 0, Width: 48, Height: 48, BorderWidth: 0, Class: 1, Visual: 0, Bitmask: 26650, Value0: 16777215, Value1: 0, Value2: 0, Value3: 163852, Value4: 32, Value5: 0 

これは、同一のサイズと原点を持ち、その中のウィンドウと48×48のベースウィンドウを作成しているように思えます。それはどういう意味ですか?サブウィンドウはルートウィンドウを覆い隠して冗長な呼び出しをしませんか?

次は、私たちは、0の幅と高さで、上記で作成した子ウィンドウに基づいてCreatePixmapコールを取得:

X_CreatePixmap: ID: 2097162, Drawable: 2097161, Width: 0, Height: 0 

本の目的は何ですか?

次に、xbiff(クライアント)は子ウィンドウに基づいて別のグラフィックスコンテキストを作成し、48x48ピックスマップの1つからCopyPlaneを実行します。

X_CreateGC: ID: 2097163, Drawable: 2097161, ValueMask: 65544, Value0: 16777215, Value1: 0 

X_CopyPlane: SrcDrawable: 2097155, DestDrawable: 2097162, GraphicsContext: 2097163, SrcX: 0, SrcY: 0, DstX: 0, DstY: 0, Width: 0, Height: 0, Bitplane: 1 

X_FreeGC: 2097163 

この呼び出しでは、幅と高さは0です。それはそれをNOOPにしますか、または0x0のディメンションは "すべてをコピーする"という意味ですか?もしそうなら、これはちょうどビットマップを子ウィンドウに合わせるべきでしょうか?

次は、クライアントが子ウィンドウに基づいて、0x0のピックスマップを作成します。

X_CreatePixmap: Depth: 24, ID: 2097164, Drawable: 2097161, Width: 0, Height: 0 

0x0のピックスマップで何が良いですか?それはどういうわけか「ウィンドウの寸法をコピーする」という意味ですか?

ここでは、子ウィンドウのためのGCを作成し、ウィンドウに48×48ビットマップのいずれかからCopyAreaを実行します。

X_CreateGC: ID: 2097165 Drawable: 2097161, ValueMask: 65548, Value0: 16777215, Value1: 0, Value2: 0 

X_CopyArea: SrcDrawable: 2097153, DestDrawable: 2097164, GraphicsContext: 2097165, SrcX: 0, SrcY: 0, DstX: 0, DstY: 0, Width: 0, Height: 0, Bitplane: 1 

このCopyAreaコールも0の幅と高さを有しているが、「意味しています全部をコピーしますか? "

次に、2097158(ルートに接続されている親)のサブウィンドウをマップし、親自体をマップします。

X_MapSubwindows: Window: 2097158 
[We send a MapNotify and Expose event for window 2097161] 

X_MapWindow: Window: 2097158 
[We send a MapNotify and Expose event for window 2097158] 

それがその後、子ウィンドウ上ClearAreaを呼び出して、なぜ私はわからない:

X_ClearArea: Window: 2097161, X: 0, Width: 0, Width: 0, Height: 0 

は明確な何もまたは全部ことをしていますか?その後

CopyAreaコールコピー場所24×24で、子ウィンドウに以前から0x0のピックスマップ:

X_CopyArea: SrcDrawable: 2097162, DestDrawable: 2097161, GraphicsContext: 2097157, SrcX: 0, SrcY: 0, DstX: 24, DstY: 24, Width: 0, Height: 0 

幅と高さもゼロです。しかし、私は再び理由は分かりません。

私はX11描画呼び出しの動作方法と、なぜ奇妙な(私にとって)呼び出しが彼らの方法であるのかを理解するのを助けてくれることを嬉しく思います。

+0

幅と高さが0のパズルのClearAreaは、X、Yのすべて(XとYが0の場合はウィンドウ全体)をクリアすることになっています。 –

答えて

2

(これのほとんどは、インターネット上many placesで自由に利用可能であるXウィンドウシステムプロトコル仕様、に見出すことができる。)

ルートウィンドウにGCを相対的に作成の重要性は、そのルートウィンドウであります画面に名前をつけ、スクリーンは関連する状態のセットを定義するXの奇妙なものです。ピクサップとフォーマットとウィンドウとビジュアルとカラーマップなどは、特定の画面にバインドされています。複数の画面を持つことができます。もしあなたがそうするなら、窓からの窓は他の窓と交差できません。これは、いわゆる「Zaphod」動作モードです。しかし、ほとんどの一般的なマルチヘッド設定では、複数の出力をカバーする1つのルートウィンドウがあります。

PutImage呼び出しでGCをサーバにピックスマップにイメージ内のピクセルの転送モードを決定しますなどplanemask、クリッピング、ラスタOP、

あなたは深ので、作成された複数のGCを見ていますGCは静的なプロパティであり、ChangeGCで変更できるものではありません。 1bppピックスマップと、ルートウィンドウの深さを継承したウィンドウとピックスマップの両方があるので、それぞれ異なるGCが必要です。

2つのCreateWindow呼び出しの違いは、それぞれに関連付けられたプロパティのマスクです。 2番目のものは、最初のものと比較してCWCursorビットが設定されています。マウスがそのウィンドウ内にあるときにクライアントが特定のカーソルを設定するよう要求しています。それがなぜ2つのようにするのか、私は分かりません。私は誰もxbiffがよく書かれていると主張したとは思わない。

0x0はピクスマップ(または描画可能なもの)の正当なサイズではありません。そのため、何が起こっているのかわかりません。その場合サーバーが行う正しいことはBadValueを投げることですが、それは間違った何かの症状だと思われます。

1

ajaxによる優れた答えを補うために。ウィンドウの1つに境界線があり、もう一方の境界線には境界線がありません。正確にxbiffが何をしているかを思い出してください(「メールなし」アイコンまたは「あなたにメールがあります」アイコンを表示します)。 2つのウィンドウはダブルバッファリングの効果を提供します。イメージを変更するには、xbiffは子ウィンドウ(境界線を持たないウィンドウ)をマップまたはマップ解除するだけです。

関連する問題