home · contact · privacy
Refactor out _SetScreenEvent.
authorChristian Heller <c.heller@plomlompom.de>
Mon, 4 Aug 2025 13:42:58 +0000 (15:42 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Mon, 4 Aug 2025 13:42:58 +0000 (15:42 +0200)
ircplom/tui_base.py

index ef7da24384d906a661c8ce22b203206d769b7ccb..124b026fa5d71bf2ed642fdd37986fc92617adf0 100644 (file)
@@ -52,16 +52,6 @@ class TuiEvent(AffectiveEvent):
         target.term.flush()
 
 
-@dataclass
-class _SetScreenEvent(TuiEvent):
-
-    def affect(self, target: 'BaseTui') -> None:
-        target.term.calc_geometry()
-        for window in target.windows:
-            window.set_geometry()
-        super().affect(target)
-
-
 class _YX(NamedTuple):
     y: int
     x: int
@@ -369,7 +359,7 @@ class _KeyboardEvent(TuiEvent, PayloadMixin):
 
     def affect(self, target: 'BaseTui') -> None:
         if self.payload[0] == _CHAR_RESIZE:
-            _SetScreenEvent().affect(target)
+            target.set_screen()
             return
         if self.payload in _KEYBINDINGS:
             cmd_data = _KEYBINDINGS[self.payload]
@@ -407,7 +397,16 @@ class BaseTui(QueueMixin):
         self.log = Logger(
             lambda msg:  # pylint: disable=unnecessary-lambda  # to keep …
             self.window.log.append(msg))  # … up-to-date _what_ window's .log
-        self._put(_SetScreenEvent())
+        self.set_screen()
+        signal(SIGWINCH, lambda *_: self.set_screen())
+
+    def set_screen(self) -> None:
+        'Calc screen geometry into .windows, fully draw front one and flush.'
+        self.term.calc_geometry()
+        for window in self.windows:
+            window.set_geometry()
+        self.window.draw()
+        self.term.flush()
 
     def cmd_name_to_cmd(self, cmd_name: str) -> Optional[Callable]:
         'Map cmd_name to executable TUI element method.'
@@ -504,7 +503,6 @@ class Terminal(QueueMixin):
     @contextmanager
     def setup(self) -> Generator:
         'Combine multiple contexts into one and run keypress loop.'
-        signal(SIGWINCH, lambda *_: self._put(_SetScreenEvent()))
         self.clear()
         with (self._blessed.raw(),
               self._blessed.fullscreen(),