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:
parent
3a2a1bb111
commit
fde0fc1c72
6 changed files with 95 additions and 10 deletions
|
|
@ -42,10 +42,17 @@ FICHEROS = {
|
|||
class Cara:
|
||||
"""El panel: se le empujan eventos y devuelve lo que se pulsa."""
|
||||
|
||||
def __init__(self, al_pulsar=None, puerto=PUERTO):
|
||||
# Segundos que se espera tras cerrarse la ultima pestaña antes de apagar.
|
||||
# Da margen a una RECARGA (que cierra el socket y lo reabre enseguida) para
|
||||
# no confundirla con cerrar la ventana de verdad.
|
||||
GRACIA = 4
|
||||
|
||||
def __init__(self, al_pulsar=None, al_cerrar=None, puerto=PUERTO):
|
||||
self.al_pulsar = al_pulsar # (canal, dato) -> None
|
||||
self.al_cerrar = al_cerrar # se cerro la ultima pestaña -> apagar
|
||||
self.puerto = puerto
|
||||
self._clientes = set()
|
||||
self._hubo_cliente = False # para no apagar antes de abrir el panel
|
||||
self._bucle = None
|
||||
self._hilo = None
|
||||
self._ultimo = {} # el estado, para el que llegue tarde
|
||||
|
|
@ -124,6 +131,7 @@ class Cara:
|
|||
|
||||
async def _cliente(self, ws):
|
||||
self._clientes.add(ws)
|
||||
self._hubo_cliente = True
|
||||
try:
|
||||
# Al conectar se le manda el estado que ya habia. Sin esto, abrir el
|
||||
# panel a media sesion enseña un HUD vacio hasta que algo cambie.
|
||||
|
|
@ -146,6 +154,19 @@ class Cara:
|
|||
pass
|
||||
finally:
|
||||
self._clientes.discard(ws)
|
||||
# Se cerro una pestaña. Si no queda ninguna, se espera un poco (por
|
||||
# si es una recarga) y, si sigue sin haber panel abierto, se apaga
|
||||
# JARVIS: cerrar la ventana suelta el microfono y la grafica.
|
||||
if self._hubo_cliente and not self._clientes and self.al_cerrar:
|
||||
try:
|
||||
asyncio.get_running_loop().call_later(
|
||||
self.GRACIA, self._quiza_cerrar)
|
||||
except RuntimeError:
|
||||
pass
|
||||
|
||||
def _quiza_cerrar(self):
|
||||
if not self._clientes and self.al_cerrar:
|
||||
threading.Thread(target=self.al_cerrar, daemon=True).start()
|
||||
|
||||
# --------------------------------------------------------------- empujar
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue