lark/docs/ARCHITECTURE.md
Niko Marmeladkov 725ca2ba37 Интерфейс Material 3 и сборка в Docker на удалённой машине
Сборка:
- 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 из меню «Пуск»
- анимации появления меню и настроек (отключаются в настройках)
- исправлено: обои перекрывали окна, клик оболочки уходил приложению,
  значки рабочего стола отбирали указатель, тень вылезала из-за
  скруглений прямоугольником, ярлыки не сдвигались при панели сверху

Документация: раздел про удалённую сборку, описание интерфейса и
настроек, холст и слои в архитектуре, обновлённая дорожная карта.
2026-10-18 14:46:30 +03:00

10 KiB
Raw Permalink Blame History

Архитектура Lark DE

Обзор

Lark DE — среда рабочего стола на Rust для слабых устройств. Раскладка повторяет Windows 10 (панель задач и меню «Пуск»), оформление собрано по правилам Material 3 Expressive.

Документ описывает и то, что уже работает, и то, что запланировано. Разница отмечена явно: иначе план легко принять за текущее состояние.

Компоненты

1. Композитор

Ядро системы — Wayland-композитор на smithay.

Реализовано:

  • Сессия Wayland: сокет создаётся сам, окружение наследуется потомками
  • Управление окнами: создание, фокус, подъём, закрытие, очистка реестра
  • Рендеринг через GlesRenderer smithay с отслеживанием повреждений
  • Ввод: клавиатура, указатель, прокрутка; раскладка через 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]