Композитор Wayland на smithay: сессия, xdg-shell, ввод, рендеринг через OpenGL ES с отслеживанием повреждений. Протоколы xdg-decoration, viewporter и presentation-time. Окна в стиле Windows 11: заголовок с названием и кнопками, перетаскивание, изменение размера за края и углы, сворачивание и разворачивание. Панель задач с подписями окон, часами и переключателем рабочих областей. Меню «Пуск» со списком приложений и поиском в текущей раскладке. Переключение окон по Alt+Tab с подтверждением при отпускании Alt. Собственный растровщик текста на fontdb + fontdue с гамма-коррекцией покрытия: без хинтинга штрихи на мелком кегле выходят рваными. Приложения запускаются в отдельной сессии D-Bus, иначе однопользовательские программы находят уже запущенный экземпляр во внешней сессии и открывают окно не в Lark. 127 тестов, clippy без замечаний.
7.5 KiB
Архитектура Lark DE
Обзор
Lark DE — среда рабочего стола на Rust для слабых устройств. Интерфейс повторяет Windows 11 при минимальном потреблении ресурсов.
Документ описывает и то, что уже работает, и то, что запланировано. Разница отмечена явно: иначе план легко принять за текущее состояние.
Компоненты
1. Композитор
Ядро системы — Wayland-композитор на smithay.
Реализовано:
- Сессия Wayland: сокет создаётся сам, окружение наследуется потомками
- Управление окнами: создание, фокус, подъём, закрытие, очистка реестра
- Рендеринг через
GlesRenderersmithay с отслеживанием повреждений - Ввод: клавиатура, указатель, прокрутка; раскладка через xkbcommon
xdg-shellдля приложений,xdg-decoration,viewporter,presentation-time- Декорации в стиле Windows 11: заголовок с названием, кнопки, перетаскивание, изменение размера за края и углы
- Рабочие области и переключатель окон по
Alt+Tab
План:
- XWayland для приложений X11
- Бэкенд DRM/KMS для запуска без окна winit
- Эффекты: тени, анимации
Ключевые оптимизации:
- Ленивая композиция (damage tracking)
- Кэш растеризованных глифов
- Переиспользование буферов
2. Shell
Интерфейс пользователя в стиле Windows 11.
Реализовано:
- Панель (~48px): кнопка «Пуск» с логотипом, подписи открытых окон, часы, переключатель рабочих областей
- Меню «Пуск»: список приложений, поиск с клавиатуры
- Переключатель окон:
Alt+Tabсо списком названий
План:
- Системный трей: сеть, звук, батарея
- Центр уведомлений
- Рабочий стол: иконки, обои, контекстное меню
3. Службы
Фоновые службы для системной функциональности. Сейчас это заготовки: потоки запускаются и завершаются, ничего не делая.
| Служба | Ответственность | Состояние |
|---|---|---|
| powerd | Питание, яркость, сон, батарея | заготовка |
| networkd | Сетевой апплет (NetworkManager) | заготовка |
| audiod | Аудио-микшер (PipeWire) | заготовка |
| sessiond | Автозапуск, блокировка, выход | заготовка |
| notificationd | Очередь уведомлений | заготовка |
Сетевой и аудио-апплеты требуют D-Bus. В тестовой среде этих служб нет, поэтому заглушки показывали бы неверные значения — это хуже, чем ничего.
4. Приложения
Собственные приложения на Rust. Пока не написаны: пункты меню «Пуск»
запускают системные программы (thunar, alacritty и подобные), перебирая
кандидатов до первого найденного.
План:
- Файловый менеджер
- Терминал
- Центр настроек
5. i18n
Мультиязычность через Fluent (.ftl).
- Языки: русский (ru-RU), английский (en-US)
- Структура:
locales/{lang}/app.ftl
Схема взаимодействия
┌──────────────────────────────────────────┐
│ Lark (один процесс) │
│ │
│ ┌────────────┐ ┌───────────────┐ │
│ │ Shell │ │ Композитор │ │
│ │ панель, │◄──────►│ smithay, │ │
│ │ меню, часы│ │ GLES, ввод │ │
│ └────────────┘ └───────┬───────┘ │
│ ▲ │ │
│ └──── растеризация ────┘ │
│ текста (fontdue) │
└──────────────────┬───────────────────────┘
│ xdg-shell
▼
┌─────────────┐
│ Wayland │
│ клиенты │
└─────────────┘
Оболочка и композитор живут в одном процессе и обмениваются состоянием напрямую: общий сокет, общий растровщик текста, готовая раскладка панели. Отдельного канала между ними нет — это осознанное решение в пользу простоты на текущем этапе.
Рендеринг
Сейчас — GlesRenderer smithay поверх EGL. Тот же путь работает и на
llvmpipe программной растеризации, поэтому композитор запускается в
виртуальной машине без видеокарты.
Планировавшийся ранее wgpu не используется: smithay даёт готовый рендерер с отслеживанием повреждений, а второй графический стек только удвоил бы зависимости.
Свои элементы сцены (панель, подписи, декорации) рисуются как текстуры:
сплошная заливка — один буфер, текст — растр, построенный fontdue.
Порядок элементов
Элементы сцены отрисовываются в обратном порядке списка: последний элемент списка оказывается ниже всех. Поэтому фон панели добавляется последним, а мелкие детали (логотип, точки рабочих областей) — раньше своей заливки. На это есть тесты: ошибка здесь не видна в коде, только на экране.
Конфигурация
- Формат: TOML
- Путь:
~/.config/lark/config.toml - Секции:
[compositor],[desktop],[panel],[theme],[decoration],[language],[keyboard],[input],[seat]