from uuid import UUID
 # ourselves
 from ircplom.events import PayloadMixin
-from ircplom.tui_base import (BaseTui, Window, TuiEvent, CMD_SHORTCUTS,
-                              PROMPT_TEMPLATE)
+from ircplom.tui_base import (BaseTui, PromptWidget, TuiEvent, Window,
+                              CMD_SHORTCUTS)
 from ircplom.irc_conn import IrcMessage
 from ircplom.client import (CHAT_GLOB, IrcConnSetup, Client,
                             ClientIdMixin, ClientQueueMixin,
 CMD_SHORTCUTS['reconnect'] = 'window.reconnect'
 
 
+class _ClientPromptWidget(PromptWidget):
+    _prefix: str = ''
+
+    @property
+    def prefix(self) -> str:
+        return self._prefix + super().prefix
+
+    @prefix.setter
+    def prefix(self, to_set: str) -> None:
+        self._prefix = to_set
+        self.tainted = True
+
+    def prefix_copy_to(self, other: '_ClientPromptWidget') -> None:
+        'Copy over .prefix to other.'
+        other.prefix = self._prefix
+
+
 class _ClientWindow(Window, ClientQueueMixin):
     client_id_name = 'client_id'
+    prompt: _ClientPromptWidget
 
     def __init__(self, client_id: UUID, chat: str = '', **kwargs) -> None:
         self.client_id = client_id
             return candidates[0]
         win = self._new_client_window(client_id=client_id, chat=chat)
         if client_wins:
-            win.prompt.prefix = client_wins[0].prompt.prefix
+            client_wins[0].prompt.prefix_copy_to(win.prompt)
         return win
 
     def cmd__connect(self, hostname: str, nickname: str, realname: str
     payload: tuple[str, str]
 
     def affect(self, target: ClientTui) -> None:
-        new_prefix = ((' ' if self.payload[0] else '?')
-                      + f'{self.payload[1]}{PROMPT_TEMPLATE}')
+        new_prefix = (' ' if self.payload[0] else '?') + self.payload[1]
         for win in target.client_wins(self.client_id):
-            prompt = win.prompt
-            prompt.prefix = new_prefix
-            prompt.tainted = True
+            win.prompt.prefix = new_prefix
         target.redraw_affected()
 
 
 
             self._history_idx = history_idx_to_wrapped_idx - len(self._history)
 
 
-class _PromptWidget(_ScrollableWidget):
+class PromptWidget(_ScrollableWidget):
+    'Manages/displays keyboard input field.'
     _y: int
     _width: int
     _history_idx: int = 0
 
     def __init__(self, **kwargs) -> None:
         super().__init__(**kwargs)
-        self.prefix = PROMPT_TEMPLATE
         self._reset_buffer('')
 
+    @property
+    def prefix(self) -> str:
+        'Main input prefix.'
+        return PROMPT_TEMPLATE[:]
+
     @property
     def _input_buffer(self) -> str:
         return self._input_buffer_unsafe[:]
 class Window(_Widget):
     'Widget filling entire screen with sub-widgets like .prompt, .log.'
     _y_status: int
-    prompt: _PromptWidget
+    prompt: PromptWidget
 
     def __init__(self, idx: int, term: 'Terminal', **kwargs) -> None:
         super().__init__(**kwargs)