diff --git a/fosfeno-launcher.sh b/fosfeno-launcher.sh new file mode 100755 index 0000000..51ea4ea --- /dev/null +++ b/fosfeno-launcher.sh @@ -0,0 +1,63 @@ +#!/usr/bin/env bash +# =========================================================================== +# FOSFENO :: lanzador de escritorio (para el icono/app en Linux) +# +# A diferencia de ./fosfeno (que corre en primer plano y se cierra con Ctrl+C), +# este arranca el servidor DESACOPLADO y abre las visuales + el panel, pensado +# para lanzarse con doble clic desde el icono. No necesita terminal. +# +# ./fosfeno-launcher.sh arranca y abre FOSFENO +# ./fosfeno-launcher.sh --stop cierra el servidor y la ventana de visuales +# =========================================================================== +set -u + +DIR="$(cd "$(dirname "$0")" && pwd)" +PORT="${FOSFENO_PORT:-8080}" +URL="http://localhost:${PORT}/" + +notify() { + command -v notify-send >/dev/null 2>&1 && notify-send "FOSFENO" "$1" 2>/dev/null + echo "FOSFENO: $1" +} + +# --- cerrar --- +if [ "${1:-}" = "--stop" ]; then + pkill -f "fosfeno-stage" 2>/dev/null # ventana de visuales (Chromium --app) + pkill -f "backend/server.py" 2>/dev/null # servidor + notify "cerrado." + exit 0 +fi + +# --- comprobaciones --- +if [ ! -x "$DIR/.venv/bin/python3" ]; then + notify "no está instalado. Ejecuta primero: bash install.sh --laptop" + exit 1 +fi + +# --- servidor (desacoplado, solo si no responde ya) --- +if ! curl -fsS -o /dev/null "$URL" 2>/dev/null; then + FOSFENO_PORT="$PORT" FOSFENO_NO_KIOSK=1 \ + setsid "$DIR/.venv/bin/python3" "$DIR/backend/server.py" \ + > "$DIR/fosfeno-server.log" 2>&1 & + # espera (hasta ~20 s) a que responda + for _ in $(seq 1 40); do + curl -fsS -o /dev/null "$URL" 2>/dev/null && break + sleep 0.5 + done +fi + +# --- ventana de visuales (Chromium --app), solo si no está ya abierta --- +BROWSER="$(command -v chromium-browser || command -v chromium \ + || command -v google-chrome || true)" +if [ -n "$BROWSER" ] && ! pgrep -f "fosfeno-stage" >/dev/null 2>&1; then + setsid "$BROWSER" --app="${URL}stage" \ + --user-data-dir="/tmp/fosfeno-stage" \ + --use-fake-ui-for-media-stream \ + --autoplay-policy=no-user-gesture-required \ + >/dev/null 2>&1 & +fi + +# --- panel de control en el navegador por defecto --- +xdg-open "$URL" >/dev/null 2>&1 || true + +notify "en marcha — panel en ${URL}"