Как композитор работает на X?

Я пытаюсь понять, как композиторы работают на X (ну, в основном потому, что ни xcompmgr, ни cairo-compmgr не могут правильно отрисовывать тени для моего потрясающего wm~~~)

Я прочитал часть исходного кода как xcompmgr, так и cairo-compmgr, но до сих пор не очень понимаю, как они это делают.

Я хочу знать, как они узнают, где должна быть тень (ну, точно вокруг окна, но тень может быть и под другим окном, и ее не нужно рисовать), а также где (на каком слое/окне ) они рисуют тень. Вероятно также, как используются все эти расширения X (и для чего они нужны) и как cairo-compmgr использует cairo для работы с низкоуровневыми вещами X.

Мне немного сложно изучить их из исходного кода, потому что многие вещи (особенно X-расширения) плохо документированы. Также будет полезно просто указать, где я должен смотреть.


person yuyichao    schedule 09.12.2011    source источник
comment
Для тех, кто также интересуется тем, как композитор использует окно наложения для рисования теней и других вещей, src/compositor/compositor-clutter.c в mutter 2.27.1 — отличный пример.   -  person yuyichao    schedule 11.02.2012


Ответы (1)


Чем проще вы закодируете его, тем лучше он будет работать.

  • Получить список видимых окон
  • Отсортируйте их в обратном z-порядке (от самого нижнего до самого верхнего)
  • Нарисуйте тень, а затем само окно для каждого окна

Вам не нужна черная магия.

Если вам интересно, как это работает, это просто: вы должны использовать «составное» расширение X. Он включает окно наложения, которое является единственным видимым окном на экране, когда оно включено, тогда вам нужно нарисовать на нем все окна, так как вам будет предоставлен Pixmap для каждого окна.

РЕДАКТИРОВАТЬ: Если вы ищете документацию, вы можете использовать руководство по Linux (команда man) и файлы заголовков, они являются основным (также лучшим и, возможно, единственным реальным) источником документации. , так как все остальные источники/веб-сайты полагаются на них.

person moongoal    schedule 10.12.2011
comment
Да, это прямой путь~~, но не будет ли проблем с обработкой фокуса (или других событий)? И я не думаю, что {x, cairo-} compmgr использует этот способ на самом деле. Хм, я читаю справочные страницы и заголовки, но у некоторых из них нет справочной страницы или комментариев в заголовочном файле (например, pixman), и я думаю, что дополнительная документация будет полезна. - person yuyichao; 10.12.2011
comment
@yuyichao Почему должны быть такие проблемы, как фокусировка? Окно наложения является обычным окном, но не появляется при вызове таких функций, как XQueryTree или подобных. Он не будет мешать вашей среде и не получит фокус ввода, вы будете использовать его ручку только для рисования, не более того. Трудно начинать с такого рода вещами, так как на самом деле не так много документации, и она тоже немного скудна. Только не сдавайся, это единственный известный мне способ, и он работает. - person moongoal; 11.12.2011
comment
Хм, я понял, что вы имеете в виду. Но мне нужно передать событие настоящему окну (или нет)? и это, вероятно, сломает xprop/xwininfo и т. д.? Я все еще не думаю, что это единственный способ (хотя, возможно, это самый простой способ), поскольку я не нашел ни одного XCompositeGetOverlayWindow в исходном коде xcompmgr. - person yuyichao; 11.12.2011
comment
@yuyichao Думайте об оверлейном окне как об объекте, с которым связан дескриптор окна, но который не является окном. Когда вы отправляете/получаете события, вы должны делать это как обычно, не принимая это во внимание. Поэтому ничего не ломается. Единственное, что меняется, это то, что вам нужно вручную рисовать окна на объекте наложения, который затем будет представлен на экране. И если вы не знаете о каком-либо другом композитном расширении, я думаю, что это единственный доступный способ. - person moongoal; 12.12.2011
comment
По крайней мере, так работают некоторые композиторы. (афаик, бормотание 2.27.1 (часть беспорядка) - один из них). - person yuyichao; 11.02.2012