lark/docs/ARCHITECTURE.md
Niko Marmeladkov 41fa466410 Первая версия Lark DE
Композитор Wayland на smithay: сессия, xdg-shell, ввод, рендеринг через
OpenGL ES с отслеживанием повреждений. Протоколы xdg-decoration,
viewporter и presentation-time.

Окна в стиле Windows 11: заголовок с названием и кнопками, перетаскивание,
изменение размера за края и углы, сворачивание и разворачивание.

Панель задач с подписями окон, часами и переключателем рабочих областей.
Меню «Пуск» со списком приложений и поиском в текущей раскладке.
Переключение окон по Alt+Tab с подтверждением при отпускании Alt.

Собственный растровщик текста на fontdb + fontdue с гамма-коррекцией
покрытия: без хинтинга штрихи на мелком кегле выходят рваными.

Приложения запускаются в отдельной сессии D-Bus, иначе однопользовательские
программы находят уже запущенный экземпляр во внешней сессии и открывают
окно не в Lark.

127 тестов, clippy без замечаний.
2026-10-18 09:18:57 +03:00

7.5 KiB
Raw Blame History

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

Обзор

Lark DE — среда рабочего стола на Rust для слабых устройств. Интерфейс повторяет Windows 11 при минимальном потреблении ресурсов.

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

Компоненты

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

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

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

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