Сборка: - 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 из меню «Пуск» - анимации появления меню и настроек (отключаются в настройках) - исправлено: обои перекрывали окна, клик оболочки уходил приложению, значки рабочего стола отбирали указатель, тень вылезала из-за скруглений прямоугольником, ярлыки не сдвигались при панели сверху Документация: раздел про удалённую сборку, описание интерфейса и настроек, холст и слои в архитектуре, обновлённая дорожная карта.
181 lines
10 KiB
Markdown
181 lines
10 KiB
Markdown
# Архитектура 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]`
|