Wayland
Содержание
Общее описание
Wayland -- протокол, с помощью которого описывается взаимодействие GUI приложений. Так же под термином Wayland могут иметь ввиду библиотеку, реализующую базовые примитивы для работы этого протокола [1].
Архитектура протокола подробно описана тут [2], упомянем лишь базовые принципы.
Композитор — программа, отвечающая за отрисовку окон является сервером, к которому подключаются один или несколько клиентов (GUI, программ которые хотят показывать окна пользователю).
Каждый клиент может зарегистрировать несколько "поверхностей" (в терминах wayland -- surface), которые он сможет связать с буфером, содержащим пиксели, которые должен показать композитор. Связанный с поверхностью буфер клиент передаёт в композитор через разделяемую память (shared memory), так же существуют оптимизации, позволяющие передать буфер через GPU.
"Поверхность" это любые данные, которые необходимо отобразить пользователю. Поверхностью может быть иконка курсора мыши, либо окно графического интерфейса, либо всплывающая подсказка, появляющаяся при наведении курсора в определённое место.
Композитор отвечает за позиционирование окон на экране и за обработку запросов от клиентов. При начале этого взаимодействия композитор сообщает клиенту список поддерживаемых интерфейсов.
Интерфейс представляет из себя описание некоторого объекта, с которым могут работать и клиент и сервер.
Например: * wl_surface -- интерфейс, описывающий порядок работы с "поверхностями". * wl_output -- интерфейс, описывающий устройства вывода, * wl_shm -- интерфейс, описывающий порядок передачи данных от клиента на сервер * wl_seat -- интерфейс, описывающий устройства ввода
Все интерфейсы состоят из следующих компонентов * Метод — функция, которую может вызвать клиент, для этого объекта.
Сервер регистрирует обработчик на каждый метод интерфейса. Эти обработчики вызываются асинхронно, при обращениях клиента. Пример -- метод attach объекта wl_surface (которы присоединяет буфер к surface)* Событие — функция, которую может вызвать сервер для этого объекта.
клиент может регистрировать обработчики, которые будут вызываться асинхронно, при наступлении события.
Интерфейсы (основные и дополнительные) описываются в специальном xml-файле, который по совместительству является и документацией [5].