#!/bin/sh
# Киоск: композитор cage, внутри него cog на весь экран.
#
# Почему cog, а не Chromium. Cog — это WPE WebKit без слоя совместимости с
# десктопом: около сотни мегабайт памяти против трёхсот-пятисот у Chromium и
# заметно более быстрый старт. Мы уходили с него на Chromium из-за дефектов в
# работе с буферами, но два из трёх оказались следствием неподнявшегося GPU
# (без рендер-ноды WebKit отдавал кадры как wl_shm), а третий касался только
# видео внутри страницы — а видео там больше нет.
#
# Почему внутри cage, а не прямо в KMS, как cog умеет сам. DRM master может
# быть только один. Видео у нас играет отдельный процесс, который рисует
# вторым окном поверх браузера, и без композитора ему просто некуда рисовать.
# Платим за это несколькими десятками мегабайт на wlroots — и получаем
# аппаратное декодирование, которое из браузера недоступно.
set -eu

[ -r /etc/default/dashdash ] && . /etc/default/dashdash

URL="http://127.0.0.1:${SCREEN_PORT:-3000}/"

# Курсор мыши. У телевизора мыши нет, указывать им некому, а висящая посреди
# дашборда стрелка выглядит как зависшая программа.
#
# Тему называем свою, а не правим /usr/share/icons/default: тот путь
# принадлежит пакету adwaita-icon-theme, и в образе наш файл затирался при
# установке зависимостей. Переменную же не перезапишет никто.
XCURSOR_THEME="${XCURSOR_THEME:-dashdash-none}"
XCURSOR_SIZE="${XCURSOR_SIZE:-1}"
export XCURSOR_THEME XCURSOR_SIZE

# Каталог, в котором композитор создаёт сокет Wayland. Юнит заводит его через
# RuntimeDirectory; здесь — подстраховка на случай ручного запуска при отладке,
# без неё cage молча не создаст сокет и экран останется пустым.
if [ -z "${XDG_RUNTIME_DIR:-}" ]; then
	XDG_RUNTIME_DIR=/run/dashdash-kiosk
	export XDG_RUNTIME_DIR
	mkdir -p "$XDG_RUNTIME_DIR"
	chmod 700 "$XDG_RUNTIME_DIR"
fi

# Сессионная шина D-Bus: без неё браузер работает, но сыпет в журнал ошибки
# подключения к шине на каждый запрос. Журнал экрана нам нужен читаемым.
if command -v dbus-run-session >/dev/null 2>&1; then
	set -- dbus-run-session --
else
	set --
fi

# Фон страницы у браузера. Умолчание у cog — белый.
#
# Не путать с чёрным прямоугольником на заставке: тот приходит с другой
# стороны. WPE рисует страницу плитками 512×512, и плитка, которую движок
# выделил, но ни разу не нарисовал, показывает обнулённую текстуру — а нули в
# RGBA это непрозрачный чёрный. Фон под ней не просвечивает, поэтому этим
# флагом такую плитку не вылечить; лечит принудительная перерисовка в самой
# странице (nudgeRepaint в kiosk.html).
#
# Флаг всё равно нужен, и ровно из-за умолчания: белый фон на тёмном экране
# это вспышка при каждой загрузке страницы. Ставим тот же цвет, что у body в
# kiosk.html.
#
# Проверяем, а не предполагаем: cog с неизвестным аргументом не запускается
# вовсе, а цена ошибки здесь — чёрный телевизор, к которому некому подойти.
COG_BG=""
if cog --help 2>&1 | grep -q -- "--bg-color"; then
	COG_BG="--bg-color=${KIOSK_BG_COLOR:-#0f1420}"
fi

# shellcheck disable=SC2086 # COG_BG и COG_EXTRA_FLAGS — наборы аргументов
exec "$@" cage -- cog --platform=wl $COG_BG ${COG_EXTRA_FLAGS-} "$URL"
