home · contact · privacy
Ensure Terminal context manager actually gets to finish (i.e. turn cursor visible... master
authorChristian Heller <c.heller@plomlompom.de>
Mon, 6 Oct 2025 22:12:31 +0000 (00:12 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Mon, 6 Oct 2025 22:12:31 +0000 (00:12 +0200)
src/run.py

index 90c03cd34bca15ef2d2f7159ec5542ed95c82680..0c54b38a5c5f15421fff89947a8ce8a4d3077e8c 100755 (executable)
@@ -5,10 +5,11 @@
 from pathlib import Path
 from queue import SimpleQueue
 from sys import argv, exit as sys_exit
+from typing import Optional
 # non-standard libs
 from plomlib.setup import dependency_hint
 try:
-    from ircplom.events import ExceptionEvent, QuitEvent
+    from ircplom.events import CrashingException, ExceptionEvent, QuitEvent
     from ircplom.client import ClientsDb, ClientEvent, NewClientEvent
     from ircplom.tui_base import BaseTui, Terminal, TerminalInterface, TuiEvent
     from ircplom.client_tui import ClientTui
@@ -23,6 +24,7 @@ def main_loop(cls_term: type[TerminalInterface], cls_tui: type[BaseTui]
     q_events: SimpleQueue = SimpleQueue()
     clients_db: ClientsDb = {}
     try:
+        to_raise: Optional[CrashingException] = None
         with cls_term(_q_out=q_events).setup() as term:
             tui = cls_tui(_q_out=q_events, term=term)
             while True:
@@ -30,13 +32,16 @@ def main_loop(cls_term: type[TerminalInterface], cls_tui: type[BaseTui]
                 if isinstance(event, QuitEvent):
                     break
                 if isinstance(event, ExceptionEvent):
-                    raise event.exception
+                    to_raise = event.exception
+                    break
                 if isinstance(event, TuiEvent):
                     event.affect(tui)
                 elif isinstance(event, NewClientEvent):
                     event.affect(clients_db)
                 elif isinstance(event, ClientEvent):
                     event.affect(clients_db[event.client_id])
+        if to_raise:
+            raise to_raise
     finally:
         for client in clients_db.values():
             client.close()