Сборка: - Dockerfile (builder/runtime/headless/binary) и .dockerignore - scripts/build-remote.sh: сборка на другой машине, возврат бинарника и проверка без дисплея (--check) - в требования добавлен libseat-dev; dev-run.sh принимает LARK_BIN Интерфейс: - свой программный холст (src/canvas.rs): скругления, градиенты, тени, значки; слои кэшируются по отпечатку состояния, поэтому неизменный слой не перерисовывается - панель задач в раскладке Windows 10: «Пуск», строка поиска, рабочие области, кнопки окон с подписями и индикатором, трей, часы и полоска «показать рабочий стол» - меню «Пуск» «1 в 1»: полоса со списком, настройками и питанием, поиск, список по алфавиту с группами, плитки, прокрутка - настройки в стиле Windows 11: разделы и карточки, обои, анимации, раскладки, ввод, окна, сброс общий и у каждой настройки - рабочий стол: шесть вариантов обоев, значки приложений и ~/Desktop - значки вместо прямоугольников: свой набор фигур, включая кнопки заголовков окон - растровщик текста: целые кегли и базовая линия, кривая контраста вместо «загустения», кэш ширин для измерений Ввод и состояние: - список приложений читается из .desktop-файлов, ярлыки ~/Desktop тоже - индикаторы трея читают батарею, Wi-Fi, звук и Bluetooth - переключение раскладок (Super+Space) и настраиваемый их список - поиск в интернете через uv + ddgs из меню «Пуск» - анимации появления меню и настроек (отключаются в настройках) - исправлено: обои перекрывали окна, клик оболочки уходил приложению, значки рабочего стола отбирали указатель, тень вылезала из-за скруглений прямоугольником, ярлыки не сдвигались при панели сверху Документация: раздел про удалённую сборку, описание интерфейса и настроек, холст и слои в архитектуре, обновлённая дорожная карта.
10 KiB
Архитектура Lark DE
Обзор
Lark DE — среда рабочего стола на Rust для слабых устройств. Раскладка повторяет Windows 10 (панель задач и меню «Пуск»), оформление собрано по правилам Material 3 Expressive.
Документ описывает и то, что уже работает, и то, что запланировано. Разница отмечена явно: иначе план легко принять за текущее состояние.
Компоненты
1. Композитор
Ядро системы — Wayland-композитор на smithay.
Реализовано:
- Сессия Wayland: сокет создаётся сам, окружение наследуется потомками
- Управление окнами: создание, фокус, подъём, закрытие, очистка реестра
- Рендеринг через
GlesRenderersmithay с отслеживанием повреждений - Ввод: клавиатура, указатель, прокрутка; раскладка через xkbcommon
xdg-shellдля приложений,xdg-decoration,viewporter,presentation-time- Декорации: скруглённый заголовок с подписью и кнопками со значками, перетаскивание, изменение размера за края и углы
- Рабочие области и переключатель окон по
Alt+Tab
План:
- XWayland для приложений X11
- Бэкенд DRM/KMS для запуска без окна winit
- Эффекты: тени, анимации
Ключевые оптимизации:
- Ленивая композиция (damage tracking)
- Кэш растеризованных глифов
- Переиспользование буферов
2. Shell
Интерфейс пользователя: раскладка Windows 10, оформление Material 3 Expressive.
Реализовано:
- Панель (~48px): «Пуск», строка поиска, рабочие области, кнопки окон с подписями и индикаторами, значки трея, раскладка клавиатуры, часы и полоска «показать рабочий стол»
- Меню «Пуск»: полоса со списком приложений, настройками и питанием, поиск, список по алфавиту с группами, закреплённые плитки, прокрутка
- Рабочий стол: обои по теме оформления, значки приложений, двойной клик
- Настройки: тема, акцент, панель, рабочие области; применяются сразу и сохраняются в файл конфигурации
- Переключатель окон:
Alt+Tabсо списком названий
План:
- Системный трей: чтение состояний сети, звука и батареи
- Центр уведомлений
- Контекстное меню рабочего стола
3. Службы
Фоновые службы для системной функциональности. Сейчас это заготовки: потоки запускаются и завершаются, ничего не делая.
| Служба | Ответственность | Состояние |
|---|---|---|
| powerd | Питание, яркость, сон, батарея | заготовка |
| networkd | Сетевой апплет (NetworkManager) | заготовка |
| audiod | Аудио-микшер (PipeWire) | заготовка |
| sessiond | Автозапуск, блокировка, выход | заготовка |
| notificationd | Очередь уведомлений | заготовка |
Сетевой и аудио-апплеты требуют D-Bus. В тестовой среде этих служб нет, поэтому заглушки показывали бы неверные значения — это хуже, чем ничего.
4. Приложения
Собственные приложения на Rust. Пока не написаны: пункты меню «Пуск»
запускают системные программы (thunar, alacritty и подобные), перебирая
кандидатов до первого найденного. Настройки и рабочий стол встроены в shell:
отдельного процесса и окна Wayland им не нужно.
План:
- Файловый менеджер
- Терминал
- Остальные приложения: почта, просмотр снимков, плеер
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.
Программный холст
Интерфейс собирается на холсте (src/canvas.rs), а не из списка заливок:
скругления, градиенты, тени, значки и текст — это разные фигуры, и списком
прямоугольников их не описать. Холст рисует в буфер RGBA, а края фигур
сглаживаются подвыборкой: пиксель считается закрытым на долю попавших в него
точек.
Значки (src/shell/icons.rs) описаны в сетке 24×24 и рисуются теми же
фигурами: кругами, отрезками и контурами. Готовых картинок нет намеренно —
они заняли бы место в бинарном файле и не масштабировались бы с высотой
панели.
Слои и кэш кадров
Каждый слой интерфейса (обои, значки рабочего стола, панель, меню, настройки, переключатель) держит свой буфер и отпечаток состояния. Буфер перерисовывается только при смене отпечатка; пока состояние прежнее, слой возвращает тот же буфер, и отслеживание повреждений smithay не видит изменений — кадр не отправляется вовсе. Это заметно экономит слабому устройству и кадры, и батарею.
Раскладка при этом считается каждый кадр (она дешёвая: ширины строк кэшированы в растровщике), поэтому попадание указателем всегда совпадает с нарисованным.
Порядок элементов
Элементы сцены отрисовываются в обратном порядке списка: последний элемент списка оказывается ниже всех. Поэтому слои добавляются сверху вниз — переключатель окон, настройки, меню, панель, значки, обои — и внутри слоя мелкие детали рисуются после фона. На порядок есть тесты: ошибка здесь не видна в коде, только на экране.
Конфигурация
- Формат: TOML
- Путь:
~/.config/lark/config.toml - Секции:
[compositor],[desktop],[panel],[theme],[decoration],[language],[keyboard],[input],[seat]