lark/Dockerfile
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

134 lines
5 KiB
Docker
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.

# syntax=docker/dockerfile:1
# Сборка и запуск Lark DE в контейнере.
#
# Этапы:
# builder — Rust, библиотеки разработки и `cargo build --release`
# runtime — библиотеки времени выполнения и сам композитор
# headless — runtime плюс Xvfb и клиент: проверка без дисплея
# binary — только исполняемый файл, чтобы забрать его из образа
#
# Примеры:
# docker build -t lark . # образ для запуска
# docker build --target binary -o dist . # только бинарник: dist/lark
# docker build --target headless -t lark:headless . # образ для проверки
#
# Сборка на удалённой машине и возврат бинарника: scripts/build-remote.sh.
# --- Этап сборки -------------------------------------------------------------
FROM rust:1-bookworm AS builder
ENV DEBIAN_FRONTEND=noninteractive
# Системные зависимости из docs/BUILD.md. clang и cmake нужны крейтам,
# которые генерируют привязки во время сборки, остальное находит pkg-config.
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
build-essential \
ca-certificates \
clang \
cmake \
git \
libclang-dev \
libdbus-1-dev \
libdrm-dev \
libexpat1-dev \
libffi-dev \
libgbm-dev \
libinput-dev \
libpipewire-0.3-dev \
libseat-dev \
libudev-dev \
libwayland-dev \
libxkbcommon-dev \
pkg-config \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /src
COPY . .
# Реестр Cargo, git-зависимости и target подключены как кэш: повторная
# сборка после правки кода не скачивает и не компилирует всё заново.
RUN --mount=type=cache,target=/usr/local/cargo/registry \
--mount=type=cache,target=/usr/local/cargo/git \
--mount=type=cache,target=/src/target \
cargo build --release --locked \
&& install -m755 target/release/lark /usr/local/bin/lark
# --- Этап запуска ------------------------------------------------------------
FROM debian:bookworm-slim AS runtime
ENV DEBIAN_FRONTEND=noninteractive
# Библиотеки времени выполнения: Wayland, xkbcommon, DRM и GBM нужны
# композитору; libX11, libxcursor, libxi, libxrandr и libxkbcommon-x11 —
# окну winit в X-сессии; libEGL и llvmpipe (libgl1-mesa-dri) — OpenGL ES,
# в том числе программный рендеринг; DejaVu — кириллица в подписях.
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
fonts-dejavu-core \
libdrm2 \
libegl-mesa0 \
libegl1 \
libgbm1 \
libgl1 \
libgl1-mesa-dri \
libglx-mesa0 \
libinput10 \
libseat1 \
libudev1 \
libwayland-client0 \
libwayland-server0 \
libx11-6 \
libx11-xcb1 \
libxcursor1 \
libxi6 \
libxkbcommon-x11-0 \
libxkbcommon0 \
libxrandr2 \
&& rm -rf /var/lib/apt/lists/*
COPY --from=builder /usr/local/bin/lark /usr/local/bin/lark
ENTRYPOINT ["/usr/local/bin/lark"]
# --- Этап проверки без дисплея -----------------------------------------------
FROM runtime AS headless
# Xvfb даёт виртуальный X-сервер, import снимает экран, xdotool позволяет
# «нажать» кнопку перед снимком. weston-terminal и foot — клиенты с
# .desktop-файлами: на них видно, что меню читает установленные приложения,
# а окна появляются в сессии.
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
foot \
imagemagick \
weston \
x11-utils \
xdotool \
xvfb \
&& rm -rf /var/lib/apt/lists/*
COPY scripts/dev-run.sh /usr/local/share/lark/dev-run.sh
# Рендеринг программный: доступа к видеокарте у контейнера нет.
ENV LIBGL_ALWAYS_SOFTWARE=1 \
LARK_BIN=/usr/local/bin/lark \
LARK_TEST_CLIENT=weston-terminal \
LARK_TEST_RUNTIME=/tmp/lark-test-run \
LARK_TEST_SHOT=/tmp/lark-shot.png \
LARK_TEST_LOG=/tmp/lark-dev-run.log
# Точку входа runtime переопределяем: контейнер запускает проверку, а не
# композитор напрямую.
ENTRYPOINT []
CMD ["/usr/local/share/lark/dev-run.sh"]
# --- Только бинарник ---------------------------------------------------------
FROM scratch AS binary
COPY --from=builder /usr/local/bin/lark /lark