Boton cerrar y cerrar la pestaña apaga JARVIS

Cerrar el panel dejaba el proceso vivo (whisper agarrando la grafica, el
microfono escuchando). Ahora hay un boton "cerrar" (dos clics) y cerrar la
ultima pestaña apaga JARVIS del todo: para la voz, suelta whisper y cierra
el proceso, via SIGINT (la misma limpieza que Ctrl+C).
This commit is contained in:
sito 2026-08-16 16:31:11 +02:00
parent 3a2a1bb111
commit fde0fc1c72
6 changed files with 95 additions and 10 deletions

View file

@ -758,6 +758,13 @@
} else if (tipo === "medidas") {
ponMedidas(datos);
} else if (tipo === "cerrando") {
// JARVIS se esta apagando: cerrar la ventana del panel. En chromium
// --app window.close() cierra la ventana de la aplicacion.
document.body.classList.add("parado");
ponEstado("parado");
setTimeout(() => { try { window.close(); } catch (e) {} }, 300);
} else if (tipo === "telemetria") {
if (datos.nucleos) ponNucleos(datos.nucleos);
ponConstantes(datos);
@ -851,6 +858,35 @@
}
});
// Cerrar JARVIS del todo. Dos clics para no apagarlo por un roce: el primero
// arma ("pulsa otra vez"), el segundo lo manda. Si no se confirma en 3 s,
// vuelve a como estaba. Al confirmar, Python contesta "cerrando" y la ventana
// se cierra sola.
(function () {
const b = document.getElementById("cerrar");
if (!b) return;
const rotulo = b.querySelector(".rotulo");
let armado = false, reloj = null;
b.addEventListener("click", () => {
if (!armado) {
armado = true;
b.classList.add("armado");
rotulo.textContent = "¿seguro?";
reloj = setTimeout(() => {
armado = false;
b.classList.remove("armado");
rotulo.textContent = "cerrar";
}, 3000);
return;
}
clearTimeout(reloj);
rotulo.textContent = "cerrando";
try {
window.webkit.messageHandlers.accion.postMessage("cerrar");
} catch (e) { /* suelto en el navegador: no hay Python que apagar */ }
});
})();
// Lanza la tanda de prueba. No cambia nada en el boton: lo que hay que mirar
// son las tarjetas, que es justo lo que se quiere comprobar.
document.getElementById("prueba").addEventListener("click", (ev) => {
@ -944,14 +980,5 @@
{ pid: 1201, nombre: "pipewire", cpu: 2.0, mem: 0.3 },
],
}});
window.jarvis.recibe({ tipo: "medidas", datos: {
n: 240,
lat_p50: 2.1, lat_p95: 4.8, lat_max: 7.2,
lat_cerebro: 2.7, lat_catalogo: 0.2,
pct_cerebro: 44, pct_catalogo: 53, pct_ruido: 3,
vol24: 87, porhora: [2, 0, 1, 4, 6, 3, 5, 8, 4, 2, 1, 3],
rag: { hit5: 95, hit1: 82 },
}});
}
})();

View file

@ -159,6 +159,13 @@
<button id="prueba" class="secundario" title="Lanza varias tareas reales a la vez para verlas trabajar">
<span class="rotulo">prueba</span>
</button>
<!-- Apaga JARVIS del todo: para la voz, suelta el microfono y la grafica, y
cierra el proceso. Dos clics para no apagarlo por un roce. -->
<button id="cerrar" class="secundario cerrar"
title="Apagar JARVIS: cierra el panel, para la voz y suelta la gráfica">
<span class="rotulo">cerrar</span>
</button>
</nav>
<!-- candado: tapa todo hasta que se teclea la contraseña -->

View file

@ -659,6 +659,13 @@ h2.separado { margin-top: 26px; }
border-color: color-mix(in srgb, var(--mal) 60%, transparent);
}
/* El boton de cerrar, armado tras el primer clic: rojo, para que se vea que el
segundo clic apaga de verdad. */
.controles button#cerrar.armado {
color: var(--mal, #ff7a6b);
border-color: var(--mal, #ff7a6b);
}
.controles button:hover {
color: var(--brillo);
border-color: var(--acento);