Нужна помощь Понимание иерархии окон X11 и команд рисования - PullRequest
3 голосов
/ 07 января 2011

Я работаю над созданием сервера 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 и почему странные (для меня) вызовы такие, какие они есть.

Ответы [ 2 ]

2 голосов
/ 07 июня 2011

(Большая часть этого может быть найдена в спецификации протокола X Window System, которая свободно доступна в многих местах в Интернете.)

Значение создания GC относительно корневого окна состоит в том, что корневое окно называет экран, а экраны - это странная вещь в X, которая определяет набор связанных состояний. Пиксельные карты и форматы, окна, визуальные элементы, цветные карты и т. Д. Привязаны к конкретному экрану. Вы можете иметь несколько экранов; если вы делаете, окна из одного не могут перейти в другой. Это так называемый режим работы Zaphod. Но в большинстве распространенных установок с несколькими головками у вас просто есть одно корневое окно, охватывающее несколько выходов.

ГХ в вызове PutImage определяет режим передачи пикселей на изображении в Pixmap на сервере: плоскостная маска, отсечение, растровые операции и т. Д.

Вы видите несколько ГХ, созданных потому, что глубина ГХ является статическим свойством, а не тем, что вы можете изменить с помощью ChangeGC. У вас есть как растровое изображение размером 1 бит на пиксель, так и окна и растровые изображения, которые унаследовали глубину корневого окна, поэтому им нужны разные GC.

Разница между двумя вызовами CreateWindow заключается в маске свойств, связанных с каждым. Второй, относительно первого, также имеет установленный бит CWCursor; клиент просит установить конкретный курсор, когда мышь находится внутри этого окна. Почему так получилось, я понятия не имею; Я не думаю, что кто-то когда-либо утверждал, что xbiff был хорошо написан.

0x0 не является допустимым размером для растрового изображения (или любого другого, если на то пошло), поэтому я не уверен, что там происходит. В этом случае правильное решение для сервера - выбросить BadValue, но, похоже, это признак того, что что-то пошло не так.

1 голос
/ 17 июля 2011

Просто чтобы дополнить отличный ответ ajax.Обратите внимание, что одно из окон имеет границу, а другое - нет.И вспомните, что именно делает xbiff (показывает значок «нет почты» или «у вас есть почта»).Два окна обеспечивают эффект двойной буферизации.Чтобы изменить изображение, xbiff должен только отобразить или снять отображение дочернего окна (окна без рамки).

...