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

181 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Архитектура 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]`