else:
             target.client_win(self.client_id, self.chat
                               ).log.append(self.payload)
-        super().affect(target)
+        target.redraw_affected()
 
 
 @dataclass
             prompt = win.prompt
             prompt.prefix = new_prefix
             prompt.tainted = True
-        super().affect(target)
+        target.redraw_affected()
 
 
 class _ClientKnowingTui(Client):
 
 CMD_SHORTCUTS: dict[str, str] = {}
 
 
-@dataclass
-class TuiEvent(AffectiveEvent):
-    'To affect TUI, and trigger flushed .draw_tainted on it.'
-
-    def affect(self, target) -> None:
-        target.window.draw_tainted()
-        target.term.flush()
-
-
 class _YX(NamedTuple):
     y: int
     x: int
             widget.draw()
 
 
+@dataclass
+class TuiEvent(AffectiveEvent):
+    'To affect TUI.'
+
+
 @dataclass
 class _KeyboardEvent(TuiEvent, PayloadMixin):
     payload: str
             target.window.prompt.insert(self.payload)
         else:
             target.log.alert(f'unknown keyboard input: {self.payload}')
-        super().affect(target)
+        target.redraw_affected()
 
 
 class BaseTui(QueueMixin):
         self.set_screen()
         signal(SIGWINCH, lambda *_: self.set_screen())
 
+    def redraw_affected(self) -> None:
+        'On focused window call .draw_tainted, then flush screen.'
+        self.window.draw_tainted()
+        self.term.flush()
+
     def set_screen(self) -> None:
-        'Calc screen geometry into .windows, fully draw front one and flush.'
+        'Calc screen geometry into .windows, then call .redraw_affected.'
         self.term.calc_geometry()
         for window in self.windows:
             window.set_geometry()
-        self.window.draw()
-        self.term.flush()
+        self.redraw_affected()
 
     def cmd_name_to_cmd(self, cmd_name: str) -> Optional[Callable]:
         'Map cmd_name to executable TUI element method.'