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

@ -18,6 +18,7 @@ mirando: sin panel abierto son quince mensajes por segundo a nadie.
"""
import os
import shutil
import signal
import subprocess
import threading
import time
@ -360,6 +361,20 @@ class Panel:
except Exception:
pass
def cerrar(self):
"""Apaga JARVIS entero: la escucha, la voz, whisper-server y el proceso.
Cerrar la pestaña o pulsar «cerrar» tiene que soltar de verdad el
microfono y la grafica, no dejar el proceso escuchando en segundo plano.
Se manda SIGINT al propio proceso: eso dispara el mismo apagado que
Ctrl+C el finally del bucle de escucha para whisper, y atexit lo remata
asi que se reutiliza la limpieza que ya estaba probada, sin duplicarla.
Corre desde un hilo del servidor; la señal la atiende el hilo principal.
"""
self.parado = True # que la escucha no atienda nada mas ya
self.para() # corta los hilos y las tareas del panel
os.kill(os.getpid(), signal.SIGINT)
# --------------------------------------------------------------- pulsar
def pulsado(self, canal: str, dato: str):
@ -417,6 +432,13 @@ class Panel:
self.manda_controles()
self.estado("escuchando" if not self.centinela.activo else "dormido")
elif dato == "cerrar":
# Apagar JARVIS del todo. Se responde primero al HUD para que la
# ventana sepa cerrarse, y luego se mata el proceso.
self.cara.manda("cerrando", True)
self.cerrar()
return
elif dato.startswith("parar"):
# El boton alterna PAUSA. No es solo "cortar lo de ahora": el titulo
# promete "cierra el microfono y corta la voz; pulsa otra vez para