Сборка: - 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 из меню «Пуск» - анимации появления меню и настроек (отключаются в настройках) - исправлено: обои перекрывали окна, клик оболочки уходил приложению, значки рабочего стола отбирали указатель, тень вылезала из-за скруглений прямоугольником, ярлыки не сдвигались при панели сверху Документация: раздел про удалённую сборку, описание интерфейса и настроек, холст и слои в архитектуре, обновлённая дорожная карта.
87 lines
3.3 KiB
Bash
Executable file
87 lines
3.3 KiB
Bash
Executable file
#!/usr/bin/env bash
|
||
# Собирает Lark DE в Docker на удалённой машине и приносит готовый композитор
|
||
# обратно: локальная машина может быть слабой, а сборка Rust со smithay долгой.
|
||
#
|
||
# Использование:
|
||
# scripts/build-remote.sh <пользователь@хост> [порт] [--check]
|
||
#
|
||
# Пример:
|
||
# scripts/build-remote.sh niko@n1ko.dev 2241 --check
|
||
#
|
||
# Переменные окружения:
|
||
# LARK_REMOTE_DIR каталог сборки на удалённой машине (/tmp/lark-build)
|
||
# LARK_LOCAL_BIN куда положить бинарник (target/release/lark)
|
||
# LARK_CHECK непустое значение равносильно --check
|
||
#
|
||
# На удалённой машине нужны ssh, rsync и Docker. Бинарник собирается по
|
||
# Dockerfile (этапы builder/binary), проверка --check поднимает Xvfb внутри
|
||
# контейнера, запускает композитор с weston-terminal и забирает снимок
|
||
# экрана и журнал в target/lark-headless/.
|
||
set -euo pipefail
|
||
|
||
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||
REMOTE=""
|
||
PORT="22"
|
||
CHECK="${LARK_CHECK:-}"
|
||
REMOTE_DIR="${LARK_REMOTE_DIR:-/tmp/lark-build}"
|
||
LOCAL_BIN="${LARK_LOCAL_BIN:-$ROOT/target/release/lark}"
|
||
|
||
for arg in "$@"; do
|
||
case "$arg" in
|
||
--check)
|
||
CHECK=1
|
||
;;
|
||
--help|-h)
|
||
sed -n '2,18p' "${BASH_SOURCE[0]}" | sed 's/^# \{0,1\}//'
|
||
exit 0
|
||
;;
|
||
*)
|
||
if [[ -z "$REMOTE" ]]; then
|
||
REMOTE="$arg"
|
||
elif [[ "$PORT" == "22" ]]; then
|
||
PORT="$arg"
|
||
else
|
||
echo "Лишний аргумент: $arg" >&2
|
||
exit 1
|
||
fi
|
||
;;
|
||
esac
|
||
done
|
||
|
||
if [[ -z "$REMOTE" ]]; then
|
||
echo "Использование: $0 <пользователь@хост> [порт] [--check]" >&2
|
||
exit 1
|
||
fi
|
||
|
||
SSH=(ssh -p "$PORT")
|
||
RSYNC=(rsync -az -e "ssh -p $PORT")
|
||
|
||
echo "==> Копирую исходники: $ROOT -> $REMOTE:$REMOTE_DIR"
|
||
"${SSH[@]}" "$REMOTE" "mkdir -p '$REMOTE_DIR'"
|
||
"${RSYNC[@]}" --delete --exclude target --exclude .git "$ROOT/" "$REMOTE:$REMOTE_DIR/"
|
||
|
||
echo "==> Собираю бинарник в Docker"
|
||
"${SSH[@]}" "$REMOTE" "cd '$REMOTE_DIR' && rm -rf out && docker build --target binary -o out ."
|
||
|
||
echo "==> Забираю бинарник: $LOCAL_BIN"
|
||
mkdir -p "$(dirname "$LOCAL_BIN")"
|
||
"${RSYNC[@]}" "$REMOTE:$REMOTE_DIR/out/lark" "$LOCAL_BIN"
|
||
chmod +x "$LOCAL_BIN"
|
||
ls -lh "$LOCAL_BIN"
|
||
|
||
if [[ -n "$CHECK" ]]; then
|
||
SHOTS="$ROOT/target/lark-headless"
|
||
echo "==> Проверка без дисплея в контейнере (Xvfb)"
|
||
"${SSH[@]}" "$REMOTE" "cd '$REMOTE_DIR' && docker build --target headless -t lark:headless ."
|
||
"${SSH[@]}" "$REMOTE" "cd '$REMOTE_DIR' && mkdir -p headless && docker run --rm \
|
||
-v '$REMOTE_DIR/headless:/shots' \
|
||
-e LARK_TEST_SHOT=/shots/lark-shot.png \
|
||
-e LARK_TEST_LOG=/shots/lark.log \
|
||
lark:headless"
|
||
mkdir -p "$SHOTS"
|
||
"${RSYNC[@]}" "$REMOTE:$REMOTE_DIR/headless/" "$SHOTS/"
|
||
echo "==> Снимок и журнал: $SHOTS"
|
||
ls -l "$SHOTS"
|
||
fi
|
||
|
||
echo "==> Готово. Локальный запуск: $LOCAL_BIN"
|