Я работаю над созданием сервера X11 для Windows с нуля на основе копии «Справочного руководства по протоколу X: нулевой том».Я добился большого прогресса в расшифровке сообщений и получении содержательного разговора с клиентами, но у меня возникают проблемы с пониманием того, что на самом деле должны делать вызовы рисования.
Сообщения в этом примере приходят от запуска xbiffна машине с Linux и разговаривая с моим xserver в Windows.Вполне возможно, что я неправильно понял некоторые интерпретации протокола, но данные пока кажутся правильными.
Графические вызовы начинаются с этого, когда клиент создает графический контекст с корнемID окна (90) в качестве отрисовки:
X_CreateGC: ID: 2097152, Drawable: 90, ValueMask: 8, Value0: 16777215
Какое значение имеет создание ГХ на основе корневого окна?
Затем он создает два 48x48 растровых изображения и помещает на них изображения:
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 в этом эквиваленте MemoryDC и конечный результат должен быть двумя 48x48 битовыми картами в памяти, содержащей данные, которые были в вызове PutImage?
Здесь он создает другой графический контекст на основе корневого окна, но я не понимаю, почему:
X_CreateGC: ID: 2097157, Drawable: 90, ValueMask: 65544, Value0: 16777215, Value1: 0
Затем он создает два окна 48x48, одно с корнем в качестве родителя, а другое спервое окно в качестве родителя:
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
Похоже, что это создает базовое окно 48x48 с окном внутри, которое имеет идентичный размере и происхождение.Какой в этом смысл?Разве подокно не закроет корневое окно, сделав его избыточным вызовом?
Затем мы получим вызов CreatePixmap, основанный на дочернем окне, созданном выше, с шириной и высотой 0:
X_CreatePixmap: ID: 2097162, Drawable: 2097161, Width: 0, Height: 0
Какова цель этого?
Затем xbiff (клиент) создает другой графический контекст на основе дочернего окна и выполняет для него CopyPlane из одного из 48x48 растровых изображений.
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 для дочернего окна и выполняем CopyArea из одного из 48x48 растровых изображений в окно:
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
ThisВызов 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 копирует растровое изображение 0x0 из более раннего в дочернее окно в расположении 24x24:
X_CopyArea: SrcDrawable: 2097162, DestDrawable: 2097161, GraphicsContext: 2097157, SrcX: 0, SrcY: 0, DstX: 24, DstY: 24, Width: 0, Height: 0
Ширина и высота также равны нулю.Еще раз, я не уверен, почему.
Я был бы рад получить некоторую помощь в понимании того, как работают вызовы рисования X11 и почему странные (для меня) вызовы такие, какие они есть.