"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のパズルのClearAreaは、X、Yのすべて(XとYが0の場合はウィンドウ全体)をクリアすることになっています。 –