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