lark/scripts/build-remote.sh
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

87 lines
3.3 KiB
Bash
Executable file
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.

#!/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"