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

# Курсор мыши. У телевизора мыши нет, указывать им некому, а висящая посреди
# дашборда стрелка выглядит как зависшая программа.
#
# Здесь эта переменная НЕ работает, и знать об этом важнее, чем кажется. Наш
# cage просит у wlroots тему с пустым именем, а тот подставляет буквально
# `default` — то есть /usr/share/icons/default/index.theme, — и XCURSOR_THEME
# не читает вовсе. Прячет курсор подмена того файла, она едет пакетом вместе с
# dpkg-divert. Переменную оставляем ради версий cage, которые её читают: вреда
# нет, а на другой плате пригодится.
#
# XCURSOR_SIZE отсюда убран: cage создаёт менеджер курсоров с зашитым в код
# размером и эту переменную не смотрит. Она ничего не делала, зато при разборе
# выглядела как возможная причина и стоила отдельного круга проверок.
XCURSOR_THEME="${XCURSOR_THEME:-dashdash-none}"
export XCURSOR_THEME

# Разрешить композитору работать без единого устройства ввода.
#
# Без этого cage не запускается вовсе: wlroots считает отсутствие устройств
# ошибкой настройки и отказывается поднимать backend с «libinput
# initialization failed, no input devices». Проверка разумна для настольной
# машины и бессмысленна для телевизора на стене.
#
# Устройств у нас ноль намеренно: правило udev отключает оба приёмника пультов
# (ИК платы и канал CEC телевизора) — они объявляют относительные оси и
# выглядят для libinput мышью. Правило и эта переменная связаны: убрать одно
# без другого значит получить либо курсор, либо чёрный экран.
WLR_LIBINPUT_NO_DEVICES="${WLR_LIBINPUT_NO_DEVICES:-1}"
export WLR_LIBINPUT_NO_DEVICES

# Каталог, в котором композитор создаёт сокет 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"
