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