Это старая версия (1.13) ПротоколWayland.

Wayland

Данная статья ни в коем случае не является попыткой точно описать тонкости работы 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].

Для того, чтобы работать с интерфейсом в c-коде необходимо сгенерировать заголовочные файлы для клиента и сервера с помощью утилиты wayland-scanner.

wayland API

Базовую информацию о том, как писать клиент и сервер настоятельно рекомендуется посмотреть тут [6].

Структура библиотеки:

  • структуры данных wl_list, wl_array, ...
  • петля событий
  • таймеры
  • wayland-сигналы — примитив, позволяющий доставлять асинхронные нотификации при возникновении произвольных событий

Ссылки

  1. https://github.com/wayland-project/wayland
  2. https://wayland.freedesktop.org/architecture.html
  3. https://drewdevault.com/2017/06/10/Introduction-to-Wayland.html
  4. https://habr.com/en/post/322580/
  5. https://github.com/wayland-project/wayland/blob/master/protocol/wayland.xml
  6. https://jan.newmarch.name/Wayland/ProgrammingClient/
  7. https://github.com/dzruyk/amcs-wm