Ich arbeite an der Erstellung eines X11-Servers für Windows von Grund auf basierend auf einer Kopie des "X Protocol Reference Manual: Volume Zero". Ich habe große Fortschritte bei der Entschlüsselung der Nachrichten gemacht und eine bedeutungsvolle Konversation mit den Kunden gemacht, aber ich habe Schwierigkeiten zu verstehen, was die Zeichnungsaufrufe eigentlich tun sollten.Benötigen Sie Hilfe Erläuterungen zu X11-Fensterhierarchie- und Zeichnungsbefehlen
Die Nachrichten in diesem Beispiel stammen aus dem Ausführen von XBIFF auf einem Linux-Rechner und es hat mit meinem XServer unter Windows zu sprechen. Es ist durchaus möglich, dass ich bei der Interpretation des Protokolls etwas falsch verstanden habe, aber die Daten scheinen so gut zu sein.
Die Grafiken Anrufe mit diesen zu starten, mit dem Kunden einen Grafikkontext mit der Root-Fenster-ID (90) als ziehbar erstellen:
X_CreateGC: ID: 2097152, Drawable: 90, ValueMask: 8, Value0: 16777215
Was die Bedeutung eine GC zu schaffen, basierend auf dem Root-Fenster ist ?
Als Nächstes erstellt es zwei 48x48 pixmaps und stellt Bilder auf sie:
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
Bin ich in der Annahme richtig, dass die GC in diesem ist das Äquivalent eines MemoryDC und das Endergebnis sollte zwei 48x48 Bitmaps werden in Speicher mit den Daten, die im PutImage-Aufruf enthalten waren?
Hier schafft es eine anderen Grafikkontext auf den Root-Fenstern basieren, aber ich verstehe nicht, warum:
X_CreateGC: ID: 2097157, Drawable: 90, ValueMask: 65544, Value0: 16777215, Value1: 0
Als nächstes es zwei 48x48 Fenster erzeugt, eine mit der Wurzel als Mutter und dem nächsten mit der erstes Fenster als Mutter:
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
es scheint, wie dies ein 48x48 Basisfenster mit einem Fenster im Innern zu schaffen, die eine identische Größe und Ursprung hat. Was ist das für ein Gefühl? Wird das Unterfenster nicht gerade das Root-Fenster verdecken, was es zu einem redundanten Anruf macht?
Als nächstes erhalten wir einen CreatePixmap Anruf basierend auf dem Kindfenster oben gestaltet, mit einer Breite und Höhe von 0:
X_CreatePixmap: ID: 2097162, Drawable: 2097161, Width: 0, Height: 0
Was ist der Zweck ist das?
Als nächstes erstellt xbiff (der Client) einen weiteren Grafikkontext basierend auf dem Child-Fenster und führt einen CopyPlane von einer der 48x48 Pixmaps aus.
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
Die Breite und Höhe sind 0 für diesen Aufruf. Ist das ein NOOP, oder bedeuten die Dimensionen 0x0 "alles kopieren"? Wenn dies der Fall ist, sollte dies nur die Bitmap in das Kindfenster blitten, richtig?
Als nächstes erstellt der Client eine 0x0 Pixmap auf das Kind Fenster basiert:
X_CreatePixmap: Depth: 24, ID: 2097164, Drawable: 2097161, Width: 0, Height: 0
Was nützt ein 0x0 pixmap? Heißt das irgendwie "kopiere die Fenstermaße"?
Hier schaffen wir ein GC für das Kind Fenster und führen Sie eine CopyArea von einem der 48x48 Bitmaps zum Fenster:
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
Dieser CopyArea Aufruf auch eine Breite und Höhe von 0. Hat hat die "bedeuten Kopiere das Ganze? "
Als nächstes werden die Unterfenster von 2097158 (das übergeordnete Element, das an den Stamm angefügt ist) zugeordnet und dann das übergeordnete Element selbst zugeordnet.
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]
Ich bin mir nicht sicher, warum es ClearArea auf das Kind Fenster hinterher ruft:
X_ClearArea: Window: 2097161, X: 0, Width: 0, Width: 0, Height: 0
Ist das klar nichts oder das Ganze?
Dann ein CopyArea Anruf kopiert die 0x0 pixmap von früher das Kind Fenster an der Stelle 24x24:
X_CopyArea: SrcDrawable: 2097162, DestDrawable: 2097161, GraphicsContext: 2097157, SrcX: 0, SrcY: 0, DstX: 24, DstY: 24, Width: 0, Height: 0
Breite und Höhe sind ebenfalls Null. Wiederum bin ich mir nicht sicher warum.
Ich wäre glücklich, etwas Hilfe zu haben, um zu verstehen, wie X11-Zeichnungsaufrufe funktionieren und warum die ungeraden (für mich) Anrufe so sind, wie sie sind.
Ein kleiner Teil des Puzzles - ClearArea mit der Breite und Höhe von 0 soll alles von X, Y aus löschen (ganzes Fenster, wenn X und Y 0 sind). –