atuq-nested: CAPTURA=<png> — la prueba en el píxel, en una variable

Durante horas dije «mirá tu pantalla» y reporté «el proceso vive» como si fuera lo mismo. No lo es:
la ventana estaba ahí desde el principio y lo que fallaba era el branding DENTRO del zip, que
ningún log iba a contar.

`grim` ya estaba en el corpus (`incoming-wlr`), se hidrata en el mismo rootfs y captura la pantalla
real contra el mismo socket wayland desde dentro de la jaula. Ahora es parte del runner: con
`CAPTURA=/ruta/foto.png` se lanza atuq, se espera a que pinte y se deja el PNG afuera para mirarlo.

De paso, la resolución de raíces prueba el corpus Y `incoming-wlr`, en ese orden — el mismo que usa
la resolución de deps (sibling-first, luego el catálogo padre). Sin eso, `grim` no se encontraba y
el script habría dicho «falta un artefacto» sobre una receta que existe.
This commit is contained in:
Sergio
2026-09-05 17:06:17 +00:00
parent 5c8d5ba956
commit 52d3bbfeb3
+22 -2
View File
@@ -39,7 +39,12 @@ RAICES="atuq gtk3 atk gdk-pixbuf-shared pango-shared cairo-shared libepoxy glib-
libffi-shared zlib-shared harfbuzz-shared fribidi freetype-shared fontconfig-shared pixman libpng-shared
libjpeg-turbo-shared wayland libxkbcommon mesa libdrm dbus pipewire pulseaudio alsa-lib
libxml2-shared dejavu-fonts
xkeyboard-config"
xkeyboard-config grim"
# `grim` no lo necesita atuq: lo necesita QUIEN LO MIRA. Con `CAPTURA=<fichero.png>` este script
# saca la pantalla real desde dentro de la jaula, contra el mismo socket wayland. Es lo que separó
# «el proceso vive» de «la ventana muestra lo que queremos»: durante horas dije «mirá tu pantalla»
# y la ventana estaba ahí desde el principio — lo que fallaba era el branding DENTRO del zip.
# La receta vive en `recipes/incoming-wlr/grim.toml`; se resuelve más abajo con el resto.
# `xkeyboard-config` son DATOS, no una librería, y sin ellos el navegador ni pinta:
# xkbcommon: ERROR: failed to add default include path /usr/share/X11/xkb
# Es el mismo modo de fallo silencioso que las fuentes: nada en la clausura lo ve venir.
@@ -52,7 +57,10 @@ RAICES="atuq gtk3 atk gdk-pixbuf-shared pango-shared cairo-shared libepoxy glib-
VIGENTES=""
faltan=""
for r in $RAICES; do
h="$("$H" --store "$STORE" hash "recipes/$r.toml" 2>/dev/null | tail -1 | sed 's/^b3://')"
# La receta puede vivir en el corpus o en una cola: `grim` es de `incoming-wlr`. Se prueban las
# dos, en ese orden, que es el mismo que usa la resolución de deps (sibling-first, luego padre).
rec="recipes/$r.toml"; [ -f "$rec" ] || rec="recipes/incoming-wlr/$r.toml"
h="$("$H" --store "$STORE" hash "$rec" 2>/dev/null | tail -1 | sed 's/^b3://')"
if [ -z "$h" ] || [ ! -d "$STORE/$h-$r" ]; then faltan="$faltan $r"; continue; fi
VIGENTES="$VIGENTES$h-$r
"
@@ -85,6 +93,7 @@ echo "==> pantalla: $SOCK"
exec bwrap --overlay-src "$ALPINE" --overlay-src "$RFS" --tmp-overlay / \
--dev-bind /dev /dev --proc /proc --bind /sys /sys --tmpfs /tmp --tmpfs /run \
--ro-bind "$SOCK" /run/wayland-0 \
--bind "$(dirname "${CAPTURA:-/tmp/atuq-captura.png}")" /salida \
--uid 0 --gid 0 \
--setenv PATH /usr/bin:/bin:/usr/sbin:/sbin \
--setenv LD_LIBRARY_PATH /usr/lib:/lib \
@@ -106,5 +115,16 @@ exec bwrap --overlay-src "$ALPINE" --overlay-src "$RFS" --tmp-overlay / \
echo "=== ¿vive? ==="
if kill -0 $PID 2>/dev/null; then echo " ✓ atuq corriendo (PID $PID) — mirá tu pantalla"; else echo " ✗ murió"; fi
echo "=== log ==="; tail -25 /tmp/atuq.log
# ── LA PRUEBA EN EL PÍXEL ─────────────────────────────────────────────────────────────────
# Un proceso vivo NO es una ventana correcta. Se captura la pantalla entera (grim sin `-o`
# compone todas las salidas) y se deja el PNG afuera, para mirarlo de verdad.
if [ -n "'"${CAPTURA:-}"'" ]; then
sleep 4
if grim "/salida/'"$(basename "${CAPTURA:-captura.png}")"'" 2>/dev/null; then
echo "captura: $(wc -c < "/salida/'"$(basename "${CAPTURA:-captura.png}")"'") bytes → '"${CAPTURA:-}"'"
else
echo "captura: grim NO pudo — ¿el compositor expone wlr-screencopy?"
fi
fi
wait $PID 2>/dev/null || true
'