home · contact · privacy
Extend TUI line testing grammar to easen handling of new bold highlight in status... master
authorChristian Heller <c.heller@plomlompom.de>
Tue, 2 Dec 2025 00:44:07 +0000 (01:44 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Tue, 2 Dec 2025 00:44:07 +0000 (01:44 +0100)
src/ircplom/testing.py
src/tests/tui_draw.test
src/tests/tui_line_formattings.test
src/tests/tui_status_line_scrolling.test

index a701699d1db36ac863c1fe383b038fc020dfbd06..2ec70801dc99d86ab6d90c567ad43244fccced35 100644 (file)
@@ -38,7 +38,7 @@ _SIGNATURE_FOR_CMD = {
     _MARK_INSERT: (4, 2),
     _MARK_LOG: (2, 0),
     _MARK_PROMPT: (1, None),
     _MARK_INSERT: (4, 2),
     _MARK_LOG: (2, 0),
     _MARK_PROMPT: (1, None),
-    _MARK_SCREENLINE: (3, 0),
+    _MARK_SCREENLINE: (4, 0),
     _MARK_SERVERMSG: (2, 0),
     _MARK_WAIT: (1, 0),
 }
     _MARK_SERVERMSG: (2, 0),
     _MARK_WAIT: (1, 0),
 }
@@ -95,15 +95,19 @@ class TestTerminal(QueueMixin, TerminalInterface):
             yield TuiEvent.affector('handle_keyboard_event'
                                     ).kw(typed_in=to_yield)
 
             yield TuiEvent.affector('handle_keyboard_event'
                                     ).kw(typed_in=to_yield)
 
-    def assert_screen_line(self, y: int, attrs_str: str, text: str) -> None:
+    def assert_screen_line(self, y: int, x: int, attrs_str: str, text: str
+                           ) -> None:
         'Assert test screen at line y shows text, attrs of attrs_str set.'
         assert 0 <= y < self.size.y
         'Assert test screen at line y shows text, attrs of attrs_str set.'
         assert 0 <= y < self.size.y
+        assert 0 <= x < self.size.x
+        text = _SCREENLINE_IGNORE_CHAR * x + text
         if text.endswith(_SCREENLINE_PADDING_SUFFIX):
             text = text[:-len(_SCREENLINE_PADDING_SUFFIX)]
             text += ' ' * (self.size.x - self.len_to_term(text))
         jumped_nones = 0
         for idx, cell_expected in enumerate(
                 (tuple(attrs_str.split(_SEP_1)), c) for c in text):
         if text.endswith(_SCREENLINE_PADDING_SUFFIX):
             text = text[:-len(_SCREENLINE_PADDING_SUFFIX)]
             text += ' ' * (self.size.x - self.len_to_term(text))
         jumped_nones = 0
         for idx, cell_expected in enumerate(
                 (tuple(attrs_str.split(_SEP_1)), c) for c in text):
+
             cell_found = self._screen[y][idx+jumped_nones]
             if cell_found is None:
                 jumped_nones += 1
             cell_found = self._screen[y][idx+jumped_nones]
             if cell_found is None:
                 jumped_nones += 1
@@ -440,7 +444,7 @@ class _Playbook:
                 assert self.assert_screen_line is not None
                 assert self.redraw_affected is not None
                 self.redraw_affected()
                 assert self.assert_screen_line is not None
                 assert self.redraw_affected is not None
                 self.redraw_affected()
-                self.assert_screen_line(int(args[0]), *args[1:])
+                self.assert_screen_line(int(args[0]), int(args[1]), *args[2:])
             elif cmd_name == _MARK_WAIT:
                 sleep(int(args[0]))
             self._idx += 1
             elif cmd_name == _MARK_WAIT:
                 sleep(int(args[0]))
             self._idx += 1
index 3daece1fba97729dd9a925931dcf75dce836e6b0..a3e80d41af3716d190cb8a2eb9c2ed9d25f945f0 100644 (file)
@@ -5,7 +5,7 @@ insert ./lib/enter_misc
 insert ./lib/pingpong
 
 × lines-empty-1
 insert ./lib/pingpong
 
 × lines-empty-1
-line 0 on_black,bright_white §§
+line 0 on_black,bright_white §§
 
 × lines-empty
 insert lines-empty-1 : +0
 
 × lines-empty
 insert lines-empty-1 : +0
@@ -32,17 +32,18 @@ insert lines-empty-1 : +20
 insert lines-empty-1 : +21
 
 × lines-prompt-empty
 insert lines-empty-1 : +21
 
 × lines-prompt-empty
-line 23 on_black,bright_white > § §§
-line 23 on_black,bright_white,reverse §§ §
+line 23 on_black,bright_white > § §§
+line 23 on_black,bright_white,reverse §§ §
 
 × line-bookmark
 
 × line-bookmark
-line 0 on_black,bright_white --------------------------------------------------------------------------------§§
+line 0 on_black,bright_white --------------------------------------------------------------------------------§§
 
 × line-scrolldown
 
 × line-scrolldown
-line 21 on_black,bright_white,reverse vvv XXXXXXvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv§§
+line 21 on_black,bright_white,reverse vvv XXXXXXvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv§§
 
 × lines-status-prompt
 
 × lines-status-prompt
-line 22 on_black,bright_white x123456789x1234567=========================================X123456789X123456789X§§
+line 22 0 on_black,bright_white x123456789x1234567=========================================X123456789X123456789X§§
+line 22 FOCUS_X on_black,bright_white,bold [FOCUS_STR]
 insert lines-prompt-empty
 
 × lines-status-prompt-start
 insert lines-prompt-empty
 
 × lines-status-prompt-start
@@ -52,41 +53,41 @@ insert lines-status-prompt : +22 x123456789x1234567 ::start)===========
 insert lines-status-prompt : +22 x123456789x1234567 :foo.bar.baz:debug)
 
 × line-invalid-prompt-command
 insert lines-status-prompt : +22 x123456789x1234567 :foo.bar.baz:debug)
 
 × line-invalid-prompt-command
-line 0 on_black,bright_red,bold # §§:§§:§§ invalid prompt command: MSG§§
+line 0 on_black,bright_red,bold # §§:§§:§§ invalid prompt command: MSG§§
 
 × line-invalid-prompt-command-unknown
 insert line-invalid-prompt-command : +0 MSG :/CMD unknown
 
 × line-ping
 
 × line-invalid-prompt-command-unknown
 insert line-invalid-prompt-command : +0 MSG :/CMD unknown
 
 × line-ping
-line 0 on_black,bright_white < §§:§§:§§ PING :?
+line 0 on_black,bright_white < §§:§§:§§ PING :?
 
 × line-pong
 
 × line-pong
-line 0 on_black,bright_green > §§:§§:§§ PONG :?
+line 0 on_black,bright_green > §§:§§:§§ PONG :?
 
 × lines-ping-pong
 insert line-ping : +0 ? :??
 insert line-pong : +1 ? :??
 
 × line-tui-log
 
 × lines-ping-pong
 insert line-ping : +0 ? :??
 insert line-pong : +1 ? :??
 
 × line-tui-log
-line 0 on_black,bright_cyan # §§:§§:§§ ?§§
+line 0 on_black,bright_cyan # §§:§§:§§ ?§§
 
 × line-bright-red-bold
 
 × line-bright-red-bold
-line 0 on_black,bright_red,bold ?§§
+line 0 on_black,bright_red,bold ?§§
 
 × line-bright-white
 
 × line-bright-white
-line 0 on_black,bright_white ?§§
+line 0 on_black,bright_white ?§§
 
 × line-bright-green
 
 × line-bright-green
-line 0 on_black,bright_green ?§§
+line 0 on_black,bright_green ?§§
 
 × line-server-log
 
 × line-server-log
-line 0 on_black,bright_yellow $ §§:§§:§§ ?§§§
+line 0 on_black,bright_yellow $ §§:§§:§§ ?§§§
 
 × line-client-msg
 
 × line-client-msg
-line 0 on_black,bright_green > §§:§§:§§ ?§§
+line 0 on_black,bright_green > §§:§§:§§ ?§§
 
 × line-cal
 
 × line-cal
-line 0 on_black,bright_white 20§§-§§-§§ §§
+line 0 on_black,bright_white 20§§-§§-§§ §§
 
 × history_0
 insert line-cal : +0
 
 × history_0
 insert line-cal : +0
@@ -176,93 +177,93 @@ insert lines-ping-pong : +78 ?? :30
 × ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
 
 insert lines-empty
 × ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
 
 insert lines-empty
-insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
+insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
 
 # nothing happening on empty command input
 > 
 insert lines-empty
 
 # nothing happening on empty command input
 > 
 insert lines-empty
-insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
+insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
 
 # check scrolling on empty history does nothing
 > /window.history.scroll up
 insert lines-empty
 
 # check scrolling on empty history does nothing
 > /window.history.scroll up
 insert lines-empty
-insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
+insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
 > /window.history.scroll down
 insert lines-empty
 > /window.history.scroll down
 insert lines-empty
-insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
+insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
 
 # non-empty command input starts log at bottom, with date above it
 insert enter-unprefixed : +0 ? :foo
 insert lines-empty :20
 insert history_0 :2 +20
 
 # non-empty command input starts log at bottom, with date above it
 insert enter-unprefixed : +0 ? :foo
 insert lines-empty :20
 insert history_0 :2 +20
-insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
+insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
 
 # check scrolling on history merely 2 lines long won't do anything either
 > /window.history.scroll up
 insert lines-empty :20
 insert history_0 :2 +20
 
 # check scrolling on history merely 2 lines long won't do anything either
 > /window.history.scroll up
 insert lines-empty :20
 insert history_0 :2 +20
-insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
+insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
 > /window.history.scroll down
 insert lines-empty :20
 insert history_0 :2 +20
 > /window.history.scroll down
 insert lines-empty :20
 insert history_0 :2 +20
-insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
+insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
 
 # further inputs grow log upwards
 > /foo
 log 0 # invalid prompt command: /foo unknown
 insert lines-empty :19
 insert history_0 :3 +19
 
 # further inputs grow log upwards
 > /foo
 log 0 # invalid prompt command: /foo unknown
 insert lines-empty :19
 insert history_0 :3 +19
-insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
+insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
 
 # check scrolling up does something on history 3 lines long
 > /window.history.scroll up
 insert lines-empty :20
 insert history_0 :1 +20
 insert line-scrolldown : +21 XXXXXX :[2] vv
 
 # check scrolling up does something on history 3 lines long
 > /window.history.scroll up
 insert lines-empty :20
 insert history_0 :1 +20
 insert line-scrolldown : +21 XXXXXX :[2] vv
-insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
+insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
 
 # check scrolling down on 3-lines history
 > /window.history.scroll down
 insert lines-empty :19
 insert history_0 :3 +19
 
 # check scrolling down on 3-lines history
 > /window.history.scroll down
 insert lines-empty :19
 insert history_0 :3 +19
-insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
+insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
 
 # check history growing below up-scroll
 > /window.history.scroll up
 insert lines-empty :20
 insert history_0 :1 +20
 insert line-scrolldown : +21 XXXXXX :[2] vv
 
 # check history growing below up-scroll
 > /window.history.scroll up
 insert lines-empty :20
 insert history_0 :1 +20
 insert line-scrolldown : +21 XXXXXX :[2] vv
-insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
+insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
 insert enter-help-win0
 insert lines-empty :20
 insert history_0 :1 +20
 insert line-scrolldown : +21 XXXXXX :[14] v
 insert enter-help-win0
 insert lines-empty :20
 insert history_0 :1 +20
 insert line-scrolldown : +21 XXXXXX :[14] v
-insert lines-status-prompt-start : +22 X123456789X123456789X :============([(0:12)]
+insert lines-status-prompt-start : +22 FOCUS_X=72 FOCUS_STR=(0:12) X123456789X123456789X :============(§§§§§§§§
 
 # check scroll-down on newer history longer than half a screen width does not fully land at bottom
 > /window.history.scroll down
 insert lines-empty :9
 insert history_0 :12 +9
 insert line-scrolldown : +21 XXXXXX :[3] vv
 
 # check scroll-down on newer history longer than half a screen width does not fully land at bottom
 > /window.history.scroll down
 insert lines-empty :9
 insert history_0 :12 +9
 insert line-scrolldown : +21 XXXXXX :[3] vv
-insert lines-status-prompt-start : +22 X123456789X123456789X :=============([(0:3)]
+insert lines-status-prompt-start : +22 FOCUS_X=73 FOCUS_STR=(0:3) X123456789X123456789X :=============(§§§§§§§
 
 # check previous scroll-down not hitting bottom be fully reversible
 > /window.history.scroll up
 insert lines-empty :20
 insert history_0 :1 +20
 insert line-scrolldown : +21 XXXXXX :[14] v
 
 # check previous scroll-down not hitting bottom be fully reversible
 > /window.history.scroll up
 insert lines-empty :20
 insert history_0 :1 +20
 insert line-scrolldown : +21 XXXXXX :[14] v
-insert lines-status-prompt-start : +22 X123456789X123456789X :=============([(0:3)]
+insert lines-status-prompt-start : +22 FOCUS_X=73 FOCUS_STR=(0:3) X123456789X123456789X :=============(§§§§§§§
 > /window.history.scroll down
 insert lines-empty :9
 insert history_0 :12 +9
 insert line-scrolldown : +21 XXXXXX :[3] vv
 > /window.history.scroll down
 insert lines-empty :9
 insert history_0 :12 +9
 insert line-scrolldown : +21 XXXXXX :[3] vv
-insert lines-status-prompt-start : +22 X123456789X123456789X :=============([(0:3)]
+insert lines-status-prompt-start : +22 FOCUS_X=73 FOCUS_STR=(0:3) X123456789X123456789X :=============(§§§§§§§
 
 # scroll to bottom, check history still growing up even beyond upper fold
 > /window.history.scroll down
 insert lines-empty :7
 insert history_0 :15 +7
 
 # scroll to bottom, check history still growing up even beyond upper fold
 > /window.history.scroll down
 insert lines-empty :7
 insert history_0 :15 +7
-insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
+insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
 insert enter-unknown : +0 ? :0
 insert enter-unknown : +0 ? :1
 insert enter-unknown : +0 ? :2
 insert enter-unknown : +0 ? :0
 insert enter-unknown : +0 ? :1
 insert enter-unknown : +0 ? :2
@@ -272,19 +273,19 @@ insert enter-unknown : +0 ? :5
 insert enter-unknown : +0 ? :6
 insert enter-unknown : +0 ? :7
 insert history_0 1:23 +0
 insert enter-unknown : +0 ? :6
 insert enter-unknown : +0 ? :7
 insert history_0 1:23 +0
-insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
+insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
 
 # check scroll-down even with long history does nothing
 > /window.history.scroll down
 insert history_0 1:23 +0
 
 # check scroll-down even with long history does nothing
 > /window.history.scroll down
 insert history_0 1:23 +0
-insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
+insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
 
 # quick look one scroll up to check single-scroll increase of below-scroll count (when up-scroll not limited, and all lines un-wrapped)
 > /window.history.scroll up
 insert lines-empty :9
 insert history_0 :12 +9
 insert line-scrolldown : +21 XXXXXX :[11] v
 
 # quick look one scroll up to check single-scroll increase of below-scroll count (when up-scroll not limited, and all lines un-wrapped)
 > /window.history.scroll up
 insert lines-empty :9
 insert history_0 :12 +9
 insert line-scrolldown : +21 XXXXXX :[11] v
-insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
+insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
 
 # check wrapping
 > /window.history.scroll down
 
 # check wrapping
 > /window.history.scroll down
@@ -293,24 +294,24 @@ log 0 # invalid prompt command: /foo_0123456789_0123456789_0123456789 unknown
 > /foo_0123456789_0123456789_0123456789_
 log 0 # invalid prompt command: /foo_0123456789_0123456789_0123456789_ unknown
 insert history_0 4:26 +0
 > /foo_0123456789_0123456789_0123456789_
 log 0 # invalid prompt command: /foo_0123456789_0123456789_0123456789_ unknown
 insert history_0 4:26 +0
-insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
+insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
 
 # check scroll-up over wrapped moves up less history lines than screen lines
 > /window.history.scroll up
 insert lines-empty :6
 insert history_0 :15 +6
 insert line-scrolldown : +21 XXXXXX :[10] v
 
 # check scroll-up over wrapped moves up less history lines than screen lines
 > /window.history.scroll up
 insert lines-empty :6
 insert history_0 :15 +6
 insert line-scrolldown : +21 XXXXXX :[10] v
-insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
+insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
 
 # check scroll-down fully reversible even if over wrapped
 > /window.history.scroll down
 insert history_0 4:26 +0
 
 # check scroll-down fully reversible even if over wrapped
 > /window.history.scroll down
 insert history_0 4:26 +0
-insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
+insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
 > /window.history.scroll up
 insert lines-empty :6
 insert history_0 :15 +6
 insert line-scrolldown : +21 XXXXXX :[10] v
 > /window.history.scroll up
 insert lines-empty :6
 insert history_0 :15 +6
 insert line-scrolldown : +21 XXXXXX :[10] v
-insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
+insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
 
 # check wrapped input only increases below-scroll count by one
 > /bar_0123456789_0123456789_0123456789_
 
 # check wrapped input only increases below-scroll count by one
 > /bar_0123456789_0123456789_0123456789_
@@ -318,98 +319,98 @@ log 0 # invalid prompt command: /bar_0123456789_0123456789_0123456789_ unknown
 insert lines-empty :6
 insert history_0 :15 +6
 insert line-scrolldown : +21 XXXXXX :[11] v
 insert lines-empty :6
 insert history_0 :15 +6
 insert line-scrolldown : +21 XXXXXX :[11] v
-insert lines-status-prompt-start : +22 X123456789X123456789X :=============([(0:1)]
+insert lines-status-prompt-start : +22 FOCUS_X=73 FOCUS_STR=(0:1) X123456789X123456789X :=============(§§§§§§§
 
 # check scroll-down over wrapped will snap down to bottom of wrapped
 > /window.history.scroll down
 insert history_0 5:26 +0
 insert line-scrolldown : +21 XXXXXX :[1] vv
 
 # check scroll-down over wrapped will snap down to bottom of wrapped
 > /window.history.scroll down
 insert history_0 5:26 +0
 insert line-scrolldown : +21 XXXXXX :[1] vv
-insert lines-status-prompt-start : +22 X123456789X123456789X :=============([(0:1)]
+insert lines-status-prompt-start : +22 FOCUS_X=73 FOCUS_STR=(0:1) X123456789X123456789X :=============(§§§§§§§
 
 # # check scrolls-up over longer history until top
 > /window.history.scroll up
 insert lines-empty :6
 insert history_0 :15 +6
 insert line-scrolldown : +21 XXXXXX :[11] v
 
 # # check scrolls-up over longer history until top
 > /window.history.scroll up
 insert lines-empty :6
 insert history_0 :15 +6
 insert line-scrolldown : +21 XXXXXX :[11] v
-insert lines-status-prompt-start : +22 X123456789X123456789X :=============([(0:1)]
+insert lines-status-prompt-start : +22 FOCUS_X=73 FOCUS_STR=(0:1) X123456789X123456789X :=============(§§§§§§§
 > /window.history.scroll up
 insert lines-empty :17
 insert history_0 :3 +17
 insert line-scrolldown : +21 XXXXXX :[22] v
 > /window.history.scroll up
 insert lines-empty :17
 insert history_0 :3 +17
 insert line-scrolldown : +21 XXXXXX :[22] v
-insert lines-status-prompt-start : +22 X123456789X123456789X :=============([(0:1)]
+insert lines-status-prompt-start : +22 FOCUS_X=73 FOCUS_STR=(0:1) X123456789X123456789X :=============(§§§§§§§
 > /window.history.scroll up
 insert lines-empty :20
 insert history_0 :1 +20
 insert line-scrolldown : +21 XXXXXX :[25] v
 > /window.history.scroll up
 insert lines-empty :20
 insert history_0 :1 +20
 insert line-scrolldown : +21 XXXXXX :[25] v
-insert lines-status-prompt-start : +22 X123456789X123456789X :=============([(0:1)]
+insert lines-status-prompt-start : +22 FOCUS_X=73 FOCUS_STR=(0:1) X123456789X123456789X :=============(§§§§§§§
 
 # check that triggering creation of new window with new lines adds it to status, with unread-lines count
 insert connect-to-connected
 insert lines-empty :20
 insert history_0 :1 +20
 insert line-scrolldown : +21 XXXXXX :[25] v
 
 # check that triggering creation of new window with new lines adds it to status, with unread-lines count
 insert connect-to-connected
 insert lines-empty :20
 insert history_0 :1 +20
 insert line-scrolldown : +21 XXXXXX :[25] v
-insert lines-status-prompt-start : +22 X123456789X123456789X :([(0:1)] (1:14) (2:7)
+insert lines-status-prompt-start : +22 FOCUS_X=60 FOCUS_STR=(0:1) X123456789X123456789X :(§§§§§§§ (1:14) (2:7)
 
 # check switch to other window, updates to status line (movement of brackets, clearing of own unread-lines count)
 > /window 1
 insert lines-empty :8
 insert history_1 :14 +8
 
 # check switch to other window, updates to status line (movement of brackets, clearing of own unread-lines count)
 > /window 1
 insert lines-empty :8
 insert history_1 :14 +8
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=====((0:1) [1] (2:7)
+insert lines-status-prompt-foobarbaz : +22 FOCUS_X=71 FOCUS_STR=1 X123456789X123456789X :=====((0:1) §§§ (2:7)
 
 # check switch-back to window 0, retaining clearing of window 1's unread-lines count
 > /window 0
 insert lines-empty :20
 insert history_0 :1 +20
 insert line-scrolldown : +21 XXXXXX :[25] v
 
 # check switch-back to window 0, retaining clearing of window 1's unread-lines count
 > /window 0
 insert lines-empty :20
 insert history_0 :1 +20
 insert line-scrolldown : +21 XXXXXX :[25] v
-insert lines-status-prompt-start : +22 X123456789X123456789X :=====([(0:1)] 1 (2:7)
+insert lines-status-prompt-start : +22 FOCUS_X=65 FOCUS_STR=(0:1) X123456789X123456789X :=====(§§§§§§§ 1 (2:7)
 
 # check that on full scroll-down, we now have a bookmark above the newest lines not previously scrolled into
 > /window.history.scroll down
 insert lines-empty :9
 insert history_0 :12 +9
 insert line-scrolldown : +21 XXXXXX :[14] v
 
 # check that on full scroll-down, we now have a bookmark above the newest lines not previously scrolled into
 > /window.history.scroll down
 insert lines-empty :9
 insert history_0 :12 +9
 insert line-scrolldown : +21 XXXXXX :[14] v
-insert lines-status-prompt-start : +22 X123456789X123456789X :=====([(0:1)] 1 (2:7)
+insert lines-status-prompt-start : +22 FOCUS_X=65 FOCUS_STR=(0:1) X123456789X123456789X :=====(§§§§§§§ 1 (2:7)
 > /window.history.scroll down
 insert history_0 2:23 +0
 insert line-scrolldown : +21 XXXXXX :[3] vv
 > /window.history.scroll down
 insert history_0 2:23 +0
 insert line-scrolldown : +21 XXXXXX :[3] vv
-insert lines-status-prompt-start : +22 X123456789X123456789X :=====([(0:1)] 1 (2:7)
+insert lines-status-prompt-start : +22 FOCUS_X=65 FOCUS_STR=(0:1) X123456789X123456789X :=====(§§§§§§§ 1 (2:7)
 > /window.history.scroll down
 insert history_0 7:26 +0
 insert line-bookmark : +19
 insert history_0 26:28 +20
 > /window.history.scroll down
 insert history_0 7:26 +0
 insert line-bookmark : +19
 insert history_0 26:28 +20
-insert lines-status-prompt-start : +22 X123456789X123456789X :=========([0] 1 (2:7)
+insert lines-status-prompt-start : +22 FOCUS_X=69 FOCUS_STR=0 X123456789X123456789X :=========(§§§ 1 (2:7)
 
 # check SIGWINCH does not re-set bookmark
 > raise_sigwinch
 insert history_0 7:26 +0
 insert line-bookmark : +19
 insert history_0 26:28 +20
 
 # check SIGWINCH does not re-set bookmark
 > raise_sigwinch
 insert history_0 7:26 +0
 insert line-bookmark : +19
 insert history_0 26:28 +20
-insert lines-status-prompt-start : +22 X123456789X123456789X :=========([0] 1 (2:7)
+insert lines-status-prompt-start : +22 FOCUS_X=69 FOCUS_STR=0 X123456789X123456789X :=========(§§§ 1 (2:7)
 
 # check that scrolling non-bottom bookmark out of sight, then scrolling it back into view again does not by itself move its position in the log history
 > /window.history.scroll up
 insert lines-empty :3
 insert history_0 :18 +3
 insert line-scrolldown : +21 XXXXXX :[8] vv
 
 # check that scrolling non-bottom bookmark out of sight, then scrolling it back into view again does not by itself move its position in the log history
 > /window.history.scroll up
 insert lines-empty :3
 insert history_0 :18 +3
 insert line-scrolldown : +21 XXXXXX :[8] vv
-insert lines-status-prompt-start : +22 X123456789X123456789X :=========([0] 1 (2:7)
+insert lines-status-prompt-start : +22 FOCUS_X=69 FOCUS_STR=0 X123456789X123456789X :=========(§§§ 1 (2:7)
 > /window.history.scroll down
 insert history_0 7:26 +0
 insert line-bookmark : +19
 insert history_0 26:28 +20
 > /window.history.scroll down
 insert history_0 7:26 +0
 insert line-bookmark : +19
 insert history_0 26:28 +20
-insert lines-status-prompt-start : +22 X123456789X123456789X :=========([0] 1 (2:7)
+insert lines-status-prompt-start : +22 FOCUS_X=69 FOCUS_STR=0 X123456789X123456789X :=========(§§§ 1 (2:7)
 
 # check that second switch to new window, previously left on bottom of history, establishes bookmark at bottom of log
 > /window 1
 insert lines-empty :7
 insert history_1 :14 +7
 insert line-bookmark : +21
 
 # check that second switch to new window, previously left on bottom of history, establishes bookmark at bottom of log
 > /window 1
 insert lines-empty :7
 insert history_1 :14 +7
 insert line-bookmark : +21
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=========(0 [1] (2:7)
+insert lines-status-prompt-foobarbaz : +22 FOCUS_X=71 FOCUS_STR=1 X123456789X123456789X :=========(0 §§§ (2:7)
 
 # check second switch-back places bookmark at bottom there too, since the newest lines previously succeeding it have now been read by us
 > /window 0
 insert history_0 7:28 +0
 insert line-bookmark : +21
 
 # check second switch-back places bookmark at bottom there too, since the newest lines previously succeeding it have now been read by us
 > /window 0
 insert history_0 7:28 +0
 insert line-bookmark : +21
-insert lines-status-prompt-start : +22 X123456789X123456789X :=========([0] 1 (2:7)
+insert lines-status-prompt-start : +22 FOCUS_X=69 FOCUS_STR=0 X123456789X123456789X :=========(§§§ 1 (2:7)
 
 # check new lines push bookmark up
 insert enter-list-start
 
 # check new lines push bookmark up
 insert enter-list-start
@@ -418,7 +419,7 @@ log 0 #   2) foo.bar.baz:server
 insert history_0 11:28 +0
 insert line-bookmark : +17
 insert history_0 28:32 +18
 insert history_0 11:28 +0
 insert line-bookmark : +17
 insert history_0 28:32 +18
-insert lines-status-prompt-start : +22 X123456789X123456789X :=========([0] 1 (2:7)
+insert lines-status-prompt-start : +22 FOCUS_X=69 FOCUS_STR=0 X123456789X123456789X :=========(§§§ 1 (2:7)
 
 # check new lines growing in other window, one of which long enough to wrap, to re-start count in status (with wrapped only as single) 
 insert ping-pong : +0 ? :0
 
 # check new lines growing in other window, one of which long enough to wrap, to re-start count in status (with wrapped only as single) 
 insert ping-pong : +0 ? :0
@@ -428,14 +429,14 @@ insert ping-pong : +0 ? :9 123456789 123456789 123456789 123456789 123456789 123
 insert history_0 11:28 +0
 insert line-bookmark : +17
 insert history_0 28:32 +18
 insert history_0 11:28 +0
 insert line-bookmark : +17
 insert history_0 28:32 +18
-insert lines-status-prompt-start : +22 X123456789X123456789X :=====([0] (1:8) (2:7)
+insert lines-status-prompt-start : +22 FOCUS_X=65 FOCUS_STR=0 X123456789X123456789X :=====(§§§ (1:8) (2:7)
 
 # check that switching to window with new lines, but left scroll-to-bottom, keeps the scroll-to-bottom, keeps bookmark after last line previously seen there
 > /window 1
 insert history_1 3:14 +0
 insert line-bookmark : +11
 insert history_1 14:24 +12
 
 # check that switching to window with new lines, but left scroll-to-bottom, keeps the scroll-to-bottom, keeps bookmark after last line previously seen there
 > /window 1
 insert history_1 3:14 +0
 insert line-bookmark : +11
 insert history_1 14:24 +12
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=========(0 [1] (2:7)
+insert lines-status-prompt-foobarbaz : +22 FOCUS_X=71 FOCUS_STR=1 X123456789X123456789X :=========(0 §§§ (2:7)
 
 # check that growth below scroll does not by itself re-position bookmark in history
 > /window.history.scroll up
 
 # check that growth below scroll does not by itself re-position bookmark in history
 > /window.history.scroll up
@@ -443,97 +444,97 @@ insert ping-pong : +0 ? :3
 insert lines-empty :7
 insert history_1 0:14 +7
 insert line-scrolldown : +21 XXXXXX :[10] v
 insert lines-empty :7
 insert history_1 0:14 +7
 insert line-scrolldown : +21 XXXXXX :[10] v
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=====(0 [(1:2)] (2:7)
+insert lines-status-prompt-foobarbaz : +22 FOCUS_X=67 FOCUS_STR=(1:2) X123456789X123456789X :=====(0 §§§§§§§ (2:7)
 > /window.history.scroll down
 insert history_1 4:14 +0
 insert line-bookmark : +10
 insert history_1 14:24 +11
 insert line-scrolldown : +21 XXXXXX :[2] vv
 > /window.history.scroll down
 insert history_1 4:14 +0
 insert line-bookmark : +10
 insert history_1 14:24 +11
 insert line-scrolldown : +21 XXXXXX :[2] vv
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=====(0 [(1:2)] (2:7)
+insert lines-status-prompt-foobarbaz : +22 FOCUS_X=67 FOCUS_STR=(1:2) X123456789X123456789X :=====(0 §§§§§§§ (2:7)
 
 # check that with new lines left unread, switch away and back into window moves bookmark below newest read line, counts unread lines in status
 > /window 0
 insert history_0 11:32 +0
 insert line-bookmark : +21
 
 # check that with new lines left unread, switch away and back into window moves bookmark below newest read line, counts unread lines in status
 > /window 0
 insert history_0 11:32 +0
 insert line-bookmark : +21
-insert lines-status-prompt-start : +22 X123456789X123456789X :=====([0] (1:2) (2:7)
+insert lines-status-prompt-start : +22 FOCUS_X=65 FOCUS_STR=0 X123456789X123456789X :=====(§§§ (1:2) (2:7)
 > /window 1
 insert history_1 4:24 +0
 insert line-bookmark : +20
 insert line-scrolldown : +21 XXXXXX :[2] vv
 > /window 1
 insert history_1 4:24 +0
 insert line-bookmark : +20
 insert line-scrolldown : +21 XXXXXX :[2] vv
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=====(0 [(1:2)] (2:7)
+insert lines-status-prompt-foobarbaz : +22 FOCUS_X=67 FOCUS_STR=(1:2) X123456789X123456789X :=====(0 §§§§§§§ (2:7)
 
 # check that growing lines below scroll in other preserves non-bottom bookmark (left in sight on previous window leave)
 > /window 0
 insert ping-pong : +0 ? :4
 insert history_0 11:32 +0
 insert line-bookmark : +21
 
 # check that growing lines below scroll in other preserves non-bottom bookmark (left in sight on previous window leave)
 > /window 0
 insert ping-pong : +0 ? :4
 insert history_0 11:32 +0
 insert line-bookmark : +21
-insert lines-status-prompt-start : +22 X123456789X123456789X :=====([0] (1:4) (2:7)
+insert lines-status-prompt-start : +22 FOCUS_X=65 FOCUS_STR=0 X123456789X123456789X :=====(§§§ (1:4) (2:7)
 > /window 1
 insert history_1 4:24 +0
 insert line-bookmark : +20
 insert line-scrolldown : +21 XXXXXX :[4] vv
 > /window 1
 insert history_1 4:24 +0
 insert line-bookmark : +20
 insert line-scrolldown : +21 XXXXXX :[4] vv
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=====(0 [(1:4)] (2:7)
+insert lines-status-prompt-foobarbaz : +22 FOCUS_X=67 FOCUS_STR=(1:4) X123456789X123456789X :=====(0 §§§§§§§ (2:7)
 
 # check same applies when leaving affected window with bookmark out-of-sight
 > /window.history.scroll up
 insert lines-empty :7
 insert history_1 :14 +7
 insert line-scrolldown : +21 XXXXXX :[12] v
 
 # check same applies when leaving affected window with bookmark out-of-sight
 > /window.history.scroll up
 insert lines-empty :7
 insert history_1 :14 +7
 insert line-scrolldown : +21 XXXXXX :[12] v
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=====(0 [(1:4)] (2:7)
+insert lines-status-prompt-foobarbaz : +22 FOCUS_X=67 FOCUS_STR=(1:4) X123456789X123456789X :=====(0 §§§§§§§ (2:7)
 > /window 0
 insert ping-pong : +0 ? :5
 insert history_0 11:32 +0
 insert line-bookmark : +21
 > /window 0
 insert ping-pong : +0 ? :5
 insert history_0 11:32 +0
 insert line-bookmark : +21
-insert lines-status-prompt-start : +22 X123456789X123456789X :=====([0] (1:6) (2:7)
+insert lines-status-prompt-start : +22 FOCUS_X=65 FOCUS_STR=0 X123456789X123456789X :=====(§§§ (1:6) (2:7)
 > /window 1
 insert lines-empty :7
 insert history_1 :14 +7
 insert line-scrolldown : +21 XXXXXX :[14] v
 > /window 1
 insert lines-empty :7
 insert history_1 :14 +7
 insert line-scrolldown : +21 XXXXXX :[14] v
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=====(0 [(1:6)] (2:7)
+insert lines-status-prompt-foobarbaz : +22 FOCUS_X=67 FOCUS_STR=(1:6) X123456789X123456789X :=====(0 §§§§§§§ (2:7)
 > /window.history.scroll down
 insert history_1 4:24 +0
 insert line-bookmark : +20
 insert line-scrolldown : +21 XXXXXX :[6] vv
 > /window.history.scroll down
 insert history_1 4:24 +0
 insert line-bookmark : +20
 insert line-scrolldown : +21 XXXXXX :[6] vv
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=====(0 [(1:6)] (2:7)
+insert lines-status-prompt-foobarbaz : +22 FOCUS_X=67 FOCUS_STR=(1:6) X123456789X123456789X :=====(0 §§§§§§§ (2:7)
 > /window.history.scroll down
 insert history_1 9:24 +0
 insert line-bookmark : +15
 insert history_1 24:30 +16
 > /window.history.scroll down
 insert history_1 9:24 +0
 insert line-bookmark : +15
 insert history_1 24:30 +16
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=========(0 [1] (2:7)
+insert lines-status-prompt-foobarbaz : +22 FOCUS_X=71 FOCUS_STR=1 X123456789X123456789X :=========(0 §§§ (2:7)
 
 # check log growth beyond max depth only remarkable after scrolling up to limit
 insert ping-pong : +0 ? :6
 insert history_1 11:24 +0
 insert line-bookmark : +13
 insert history_1 24:32 +14
 
 # check log growth beyond max depth only remarkable after scrolling up to limit
 insert ping-pong : +0 ? :6
 insert history_1 11:24 +0
 insert line-bookmark : +13
 insert history_1 24:32 +14
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=========(0 [1] (2:7)
+insert lines-status-prompt-foobarbaz : +22 FOCUS_X=71 FOCUS_STR=1 X123456789X123456789X :=========(0 §§§ (2:7)
 > /window.history.scroll up
 insert history_1 1:22 +0
 insert line-scrolldown : +21 XXXXXX :[9] vv
 > /window.history.scroll up
 insert history_1 1:22 +0
 insert line-scrolldown : +21 XXXXXX :[9] vv
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=========(0 [1] (2:7)
+insert lines-status-prompt-foobarbaz : +22 FOCUS_X=71 FOCUS_STR=1 X123456789X123456789X :=========(0 §§§ (2:7)
 > /window.history.scroll up
 insert lines-empty :10
 insert history_1 :11 +10
 insert line-scrolldown : +21 XXXXXX :[19] v
 > /window.history.scroll up
 insert lines-empty :10
 insert history_1 :11 +10
 insert line-scrolldown : +21 XXXXXX :[19] v
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=========(0 [1] (2:7)
+insert lines-status-prompt-foobarbaz : +22 FOCUS_X=71 FOCUS_STR=1 X123456789X123456789X :=========(0 §§§ (2:7)
 > /window.history.scroll up
 insert lines-empty :20
 insert history_1 :1 +20
 insert line-scrolldown : +21 XXXXXX :[29] v
 > /window.history.scroll up
 insert lines-empty :20
 insert history_1 :1 +20
 insert line-scrolldown : +21 XXXXXX :[29] v
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=========(0 [1] (2:7)
+insert lines-status-prompt-foobarbaz : +22 FOCUS_X=71 FOCUS_STR=1 X123456789X123456789X :=========(0 §§§ (2:7)
 
 # check cut-off log growth seen from topmost scroll not affecting scrolldown count, but unread-lines status
 insert ping-pong : +0 ? :7
 insert lines-empty :20
 insert history_1 2:3 +20
 insert line-scrolldown : +21 XXXXXX :[29] v
 
 # check cut-off log growth seen from topmost scroll not affecting scrolldown count, but unread-lines status
 insert ping-pong : +0 ? :7
 insert lines-empty :20
 insert history_1 2:3 +20
 insert line-scrolldown : +21 XXXXXX :[29] v
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=====(0 [(1:2)] (2:7)
+insert lines-status-prompt-foobarbaz : +22 FOCUS_X=67 FOCUS_STR=(1:2) X123456789X123456789X :=====(0 §§§§§§§ (2:7)
 
 # check unread-lines count potentially growing above max log depth if in other window
 > /window 0
 insert history_0 11:32 +0
 insert line-bookmark : +21
 
 # check unread-lines count potentially growing above max log depth if in other window
 > /window 0
 insert history_0 11:32 +0
 insert line-bookmark : +21
-insert lines-status-prompt-start : +22 X123456789X123456789X :=====([0] (1:2) (2:7)
+insert lines-status-prompt-start : +22 FOCUS_X=65 FOCUS_STR=0 X123456789X123456789X :=====(§§§ (1:2) (2:7)
 insert ping-pong : +0 ? :8
 insert ping-pong : +0 ? :9
 insert ping-pong : +0 ? :10
 insert ping-pong : +0 ? :8
 insert ping-pong : +0 ? :9
 insert ping-pong : +0 ? :10
@@ -551,57 +552,57 @@ insert ping-pong : +0 ? :21
 insert ping-pong : +0 ? :22
 insert history_0 11:32 +0
 insert line-bookmark : +21
 insert ping-pong : +0 ? :22
 insert history_0 11:32 +0
 insert line-bookmark : +21
-insert lines-status-prompt-start : +22 X123456789X123456789X :====([0] (1:32) (2:7)
+insert lines-status-prompt-start : +22 FOCUS_X=64 FOCUS_STR=0 X123456789X123456789X :====(§§§ (1:32) (2:7)
 
 # check switching into window scrolled-top with more unread lines than max log depth shrinks former to latter, and scrolling down no bookmark is to be found
 > /window 1
 insert lines-empty :20
 insert history_1 34:35 +20
 insert line-scrolldown : +21 XXXXXX :[29] v
 
 # check switching into window scrolled-top with more unread lines than max log depth shrinks former to latter, and scrolling down no bookmark is to be found
 > /window 1
 insert lines-empty :20
 insert history_1 34:35 +20
 insert line-scrolldown : +21 XXXXXX :[29] v
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :====(0 [(1:29)] (2:7)
+insert lines-status-prompt-foobarbaz : +22 FOCUS_X=66 FOCUS_STR=(1:29) X123456789X123456789X :====(0 §§§§§§§§ (2:7)
 > /window.history.scroll down
 insert lines-empty :9
 insert history_1 34:46 +9
 insert line-scrolldown : +21 XXXXXX :[18] v
 > /window.history.scroll down
 insert lines-empty :9
 insert history_1 34:46 +9
 insert line-scrolldown : +21 XXXXXX :[18] v
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :====(0 [(1:18)] (2:7)
+insert lines-status-prompt-foobarbaz : +22 FOCUS_X=66 FOCUS_STR=(1:18) X123456789X123456789X :====(0 §§§§§§§§ (2:7)
 > /window.history.scroll down
 insert history_1 36:57 +0
 insert line-scrolldown : +21 XXXXXX :[7] vv
 > /window.history.scroll down
 insert history_1 36:57 +0
 insert line-scrolldown : +21 XXXXXX :[7] vv
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=====(0 [(1:7)] (2:7)
+insert lines-status-prompt-foobarbaz : +22 FOCUS_X=67 FOCUS_STR=(1:7) X123456789X123456789X :=====(0 §§§§§§§ (2:7)
 > /window.history.scroll down
 insert history_1 42:62 +0
 > /window.history.scroll down
 insert history_1 42:62 +0
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=========(0 [1] (2:7)
+insert lines-status-prompt-foobarbaz : +22 FOCUS_X=71 FOCUS_STR=1 X123456789X123456789X :=========(0 §§§ (2:7)
 
 # check bookmark remains absent with log growing while scrolled to bottom, …
 insert ping-pong : +0 ? :23
 insert history_1 44:64 +0
 
 # check bookmark remains absent with log growing while scrolled to bottom, …
 insert ping-pong : +0 ? :23
 insert history_1 44:64 +0
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=========(0 [1] (2:7)
+insert lines-status-prompt-foobarbaz : +22 FOCUS_X=71 FOCUS_STR=1 X123456789X123456789X :=========(0 §§§ (2:7)
 
 # … as well as if further growth happens below scroll 
 > /window.history.scroll up
 insert lines-empty :2
 insert history_1 36:55 +2
 insert line-scrolldown : +21 XXXXXX :[11] v
 
 # … as well as if further growth happens below scroll 
 > /window.history.scroll up
 insert lines-empty :2
 insert history_1 36:55 +2
 insert line-scrolldown : +21 XXXXXX :[11] v
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=========(0 [1] (2:7)
+insert lines-status-prompt-foobarbaz : +22 FOCUS_X=71 FOCUS_STR=1 X123456789X123456789X :=========(0 §§§ (2:7)
 insert ping-pong : +0 ? :24
 insert lines-empty :4
 insert history_1 38:55 +4
 insert line-scrolldown : +21 XXXXXX :[13] v
 insert ping-pong : +0 ? :24
 insert lines-empty :4
 insert history_1 38:55 +4
 insert line-scrolldown : +21 XXXXXX :[13] v
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=====(0 [(1:2)] (2:7)
+insert lines-status-prompt-foobarbaz : +22 FOCUS_X=67 FOCUS_STR=(1:2) X123456789X123456789X :=====(0 §§§§§§§ (2:7)
 > /window.history.scroll down 
 insert history_1 45:66 +0
 insert line-scrolldown : +21 XXXXXX :[2] vv
 > /window.history.scroll down 
 insert history_1 45:66 +0
 insert line-scrolldown : +21 XXXXXX :[2] vv
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=====(0 [(1:2)] (2:7)
+insert lines-status-prompt-foobarbaz : +22 FOCUS_X=67 FOCUS_STR=(1:2) X123456789X123456789X :=====(0 §§§§§§§ (2:7)
 > /window.history.scroll down 
 insert history_1 46:68 +0
 > /window.history.scroll down 
 insert history_1 46:68 +0
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=========(0 [1] (2:7)
+insert lines-status-prompt-foobarbaz : +22 FOCUS_X=71 FOCUS_STR=1 X123456789X123456789X :=========(0 §§§ (2:7)
 
 # check unread-lines status not growing beyond max log if within active window, and …
 > /window.history.scroll up
 insert lines-empty :2
 insert history_1 38:55 +2
 insert line-scrolldown : +21 XXXXXX :[11] v
 
 # check unread-lines status not growing beyond max log if within active window, and …
 > /window.history.scroll up
 insert lines-empty :2
 insert history_1 38:55 +2
 insert line-scrolldown : +21 XXXXXX :[11] v
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=========(0 [1] (2:7)
+insert lines-status-prompt-foobarbaz : +22 FOCUS_X=71 FOCUS_STR=1 X123456789X123456789X :=========(0 §§§ (2:7)
 insert ping-pong : +0 ? :25
 insert ping-pong : +0 ? :26
 insert ping-pong : +0 ? :27
 insert ping-pong : +0 ? :25
 insert ping-pong : +0 ? :26
 insert ping-pong : +0 ? :27
@@ -620,23 +621,23 @@ insert ping-pong : +0 ? :39
 insert lines-empty :20
 insert history_1 68:69 +20
 insert line-scrolldown : +21 XXXXXX :[29] v
 insert lines-empty :20
 insert history_1 68:69 +20
 insert line-scrolldown : +21 XXXXXX :[29] v
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :====(0 [(1:29)] (2:7)
+insert lines-status-prompt-foobarbaz : +22 FOCUS_X=66 FOCUS_STR=(1:29) X123456789X123456789X :====(0 §§§§§§§§ (2:7)
 
 # … setting bookmark visible after switching back-and-forth
 > /window 0
 insert history_0 11:32 +0
 insert line-bookmark : +21
 
 # … setting bookmark visible after switching back-and-forth
 > /window 0
 insert history_0 11:32 +0
 insert line-bookmark : +21
-insert lines-status-prompt-start : +22 X123456789X123456789X :====([0] (1:29) (2:7)
+insert lines-status-prompt-start : +22 FOCUS_X=64 FOCUS_STR=0 X123456789X123456789X :====(§§§ (1:29) (2:7)
 > /window 1
 insert lines-empty :19
 insert history_1 68:69 +19
 insert line-bookmark : +20
 insert line-scrolldown : +21 XXXXXX :[29] v
 > /window 1
 insert lines-empty :19
 insert history_1 68:69 +19
 insert line-bookmark : +20
 insert line-scrolldown : +21 XXXXXX :[29] v
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :====(0 [(1:29)] (2:7)
+insert lines-status-prompt-foobarbaz : +22 FOCUS_X=66 FOCUS_STR=(1:29) X123456789X123456789X :====(0 §§§§§§§§ (2:7)
 > /window.history.scroll down
 insert lines-empty :8
 insert history_1 68:69 +8
 insert line-bookmark : +9
 insert history_1 69:80 +10
 insert line-scrolldown : +21 XXXXXX :[18] v
 > /window.history.scroll down
 insert lines-empty :8
 insert history_1 68:69 +8
 insert line-bookmark : +9
 insert history_1 69:80 +10
 insert line-scrolldown : +21 XXXXXX :[18] v
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :====(0 [(1:18)] (2:7)
+insert lines-status-prompt-foobarbaz : +22 FOCUS_X=66 FOCUS_STR=(1:18) X123456789X123456789X :====(0 §§§§§§§§ (2:7)
index 43240d15c21ed09ac610403e14f84c831b3f2b08..80dd83c62338a217adca7d964217fed3b67a5cab 100644 (file)
@@ -5,7 +5,7 @@ insert ./lib/servernotice
 
 × servermsglogged-and-line-unwrapped
 insert servermsglogged : +0 MSG :XXX
 
 × servermsglogged-and-line-unwrapped
 insert servermsglogged : +0 MSG :XXX
-line 21 on_black,bright_white < §§:§§:§§ XXX§§
+line 21 on_black,bright_white < §§:§§:§§ XXX§§
 
 × ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
 
 
 × ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
 
@@ -18,44 +18,44 @@ insert servermsglogged-and-line-unwrapped : +0 XXX ::foo.bar.baz 001 foo :6789 1
 
 # check wrap if last space-separated item one char too long 
 insert servermsglogged : +0 MSG ::foo.bar.baz 002 foo :456789 123456789 123456789 123456789 12345678 01
 
 # check wrap if last space-separated item one char too long 
 insert servermsglogged : +0 MSG ::foo.bar.baz 002 foo :456789 123456789 123456789 123456789 12345678 01
-line 20 on_black,bright_white < §§:§§:§§ :foo.bar.baz 002 foo :456789 123456789 123456789 123456789 12345678§§
-line 21 on_black,bright_white    01§§
+line 20 on_black,bright_white < §§:§§:§§ :foo.bar.baz 002 foo :456789 123456789 123456789 123456789 12345678§§
+line 21 on_black,bright_white    01§§
 
 # check wrap if item starts right after width-final space
 insert servermsglogged : +0 MSG ::foo.bar.baz 002 foo :456789 123456789 123456789 123456789 123456789 1
 
 # check wrap if item starts right after width-final space
 insert servermsglogged : +0 MSG ::foo.bar.baz 002 foo :456789 123456789 123456789 123456789 123456789 1
-line 20 on_black,bright_white < §§:§§:§§ :foo.bar.baz 002 foo :456789 123456789 123456789 123456789 123456789§§
-line 21 on_black,bright_white    1§§
+line 20 on_black,bright_white < §§:§§:§§ :foo.bar.baz 002 foo :456789 123456789 123456789 123456789 123456789§§
+line 21 on_black,bright_white    1§§
 
 # check wrap if item starts right after space after item extending to end of width
 insert servermsglogged : +0 MSG ::foo.bar.baz 002 foo :456789 123456789 123456789 123456789 1234567890 2
 
 # check wrap if item starts right after space after item extending to end of width
 insert servermsglogged : +0 MSG ::foo.bar.baz 002 foo :456789 123456789 123456789 123456789 1234567890 2
-line 20 on_black,bright_white < §§:§§:§§ :foo.bar.baz 002 foo :456789 123456789 123456789 123456789 1234567890§§
-line 21 on_black,bright_white    2§§
+line 20 on_black,bright_white < §§:§§:§§ :foo.bar.baz 002 foo :456789 123456789 123456789 123456789 1234567890§§
+line 21 on_black,bright_white    2§§
 
 # check wrap if item starts right after double-space after item extending to end of width
 insert servermsglogged : +0 MSG ::foo.bar.baz 002 foo :456789 123456789 123456789 123456789 1234567890  3
 
 # check wrap if item starts right after double-space after item extending to end of width
 insert servermsglogged : +0 MSG ::foo.bar.baz 002 foo :456789 123456789 123456789 123456789 1234567890  3
-line 20 on_black,bright_white < §§:§§:§§ :foo.bar.baz 002 foo :456789 123456789 123456789 123456789 1234567890§§
-line 21 on_black,bright_white     3§§
+line 20 on_black,bright_white < §§:§§:§§ :foo.bar.baz 002 foo :456789 123456789 123456789 123456789 1234567890§§
+line 21 on_black,bright_white     3§§
 
 # check wrap on item too large to fit into screen width minus indent
 insert servermsglogged : +0 MSG ::foo.bar.baz 002 foo :2345678_1_2345678_2_2345678_3_2345678_4_2345678_5_2345678_6_2345678_7_2345678
 
 # check wrap on item too large to fit into screen width minus indent
 insert servermsglogged : +0 MSG ::foo.bar.baz 002 foo :2345678_1_2345678_2_2345678_3_2345678_4_2345678_5_2345678_6_2345678_7_2345678
-line 19 on_black,bright_white < §§:§§:§§ :foo.bar.baz 002 foo§§
-line 20 on_black,bright_white    :2345678_1_2345678_2_2345678_3_2345678_4_2345678_5_2345678_6_2345678_7_234567§§
-line 21 on_black,bright_white   8
+line 19 on_black,bright_white < §§:§§:§§ :foo.bar.baz 002 foo§§
+line 20 on_black,bright_white    :2345678_1_2345678_2_2345678_3_2345678_4_2345678_5_2345678_6_2345678_7_234567§§
+line 21 on_black,bright_white   8
 
 # check wrapping calculation on double-width character (tbh not much of a test since the tester itself counts specifically this char as two, so it's pretty much the same as above testing with a sequence of two ASCII chars; mostly just ensures that the wrapping code relies on Terminal.length_to_term)
 insert servermsglogged-and-line-unwrapped : +0 XXX ::foo.bar.baz 002 foo :456789 123456789 123456789 123456789 1234567 💓
 insert servermsglogged : +0 MSG ::foo.bar.baz 002 foo :456789 123456789 123456789 123456789 12345678 💓
 
 # check wrapping calculation on double-width character (tbh not much of a test since the tester itself counts specifically this char as two, so it's pretty much the same as above testing with a sequence of two ASCII chars; mostly just ensures that the wrapping code relies on Terminal.length_to_term)
 insert servermsglogged-and-line-unwrapped : +0 XXX ::foo.bar.baz 002 foo :456789 123456789 123456789 123456789 1234567 💓
 insert servermsglogged : +0 MSG ::foo.bar.baz 002 foo :456789 123456789 123456789 123456789 12345678 💓
-line 20 on_black,bright_white < §§:§§:§§ :foo.bar.baz 002 foo :456789 123456789 123456789 123456789 12345678§§
-line 21 on_black,bright_white    💓§§
+line 20 on_black,bright_white < §§:§§:§§ :foo.bar.baz 002 foo :456789 123456789 123456789 123456789 12345678§§
+line 21 on_black,bright_white    💓§§
 insert servermsglogged : +0 MSG ::foo.bar.baz 002 foo :2345678_1_2345678_2_2345678_3_2345678_4_2345678_5_2345678_6_2345678_7_23456💓
 insert servermsglogged : +0 MSG ::foo.bar.baz 002 foo :2345678_1_2345678_2_2345678_3_2345678_4_2345678_5_2345678_6_2345678_7_23456💓
-line 19 on_black,bright_white < §§:§§:§§ :foo.bar.baz 002 foo§§
-line 20 on_black,bright_white    :2345678_1_2345678_2_2345678_3_2345678_4_2345678_5_2345678_6_2345678_7_23456§§
-line 21 on_black,bright_white   💓§§
+line 19 on_black,bright_white < §§:§§:§§ :foo.bar.baz 002 foo§§
+line 20 on_black,bright_white    :2345678_1_2345678_2_2345678_3_2345678_4_2345678_5_2345678_6_2345678_7_23456§§
+line 21 on_black,bright_white   💓§§
 
 # check interpretation and escape of formatting characters
 insert servernotice : +0 XXX :*** check that {esc|ape}s, formatting not counting into wrap
 
 # check interpretation and escape of formatting characters
 insert servernotice : +0 XXX :*** check that {esc|ape}s, formatting not counting into wrap
-line 20 on_black,bright_white < §§:§§:§§ :*.?.net NOTICE * :*** check that {esc|ape}s, formatting not counting§§
-line 21 on_black,bright_white    into wrap§§
+line 20 on_black,bright_white < §§:§§:§§ :*.?.net NOTICE * :*** check that {esc|ape}s, formatting not counting§§
+line 21 on_black,bright_white    into wrap§§
 > /window 2
 > /window 2
-line 21 on_black,bright_white < §§:§§:§§ (§§§§§§) *** check that {esc|ape}s, formatting not counting into wrap§§
-line 21 on_black,bright_white,bold §§§§§§§§§§§§server§
+line 21 on_black,bright_white < §§:§§:§§ (§§§§§§) *** check that {esc|ape}s, formatting not counting into wrap§§
+line 21 on_black,bright_white,bold §§§§§§§§§§§§server§
index 96064e69b623706f85d02bd2fb056a830d668c3c..3402d58be7573ab5550303db969b8b4609b5301f 100644 (file)
@@ -6,6 +6,10 @@ insert ./lib/001-to-usermode
 insert servermsglogged : +0 MSG ::winWIN_ID!~winWIN_ID@bar.bar PRIVMSG foo :hi there
 log WIN_ID < [winWIN_ID] hi there
 
 insert servermsglogged : +0 MSG ::winWIN_ID!~winWIN_ID@bar.bar PRIVMSG foo :hi there
 log WIN_ID < [winWIN_ID] hi there
 
+× status-line
+line 22 0 on_black,bright_white LINE
+line 22 FOCUS_X on_black,bright_white,bold [FOCUS_STR]
+
 × ×---------------------------------
 
 insert connect-to-connected
 × ×---------------------------------
 
 insert connect-to-connected
@@ -19,44 +23,44 @@ insert new-hi : + WIN_ID :7
 insert new-hi : + WIN_ID :8
 insert new-hi : + WIN_ID :9
 insert new-hi : + WIN_ID :10
 insert new-hi : + WIN_ID :8
 insert new-hi : + WIN_ID :9
 insert new-hi : + WIN_ID :10
-line 22 on_black,bright_white :start)=======([0] (1:32) (2:7) (3:2) (4:2) (5:2) (6:2) (7:2) (8:2) (9:2) (10:2)§§
+insert status-line : + FOCUS_X=15 FOCUS_STR=0 LINE ::start)=======(§§§ (1:32) (2:7) (3:2) (4:2) (5:2) (6:2) (7:2) (8:2) (9:2) (10:2)§§
 
 # grow windows list to maximum before ellipsis necessary
 insert new-hi : + WIN_ID :11
 
 # grow windows list to maximum before ellipsis necessary
 insert new-hi : + WIN_ID :11
-line 22 on_black,bright_white :start)([0] (1:33) (2:7) (3:2) (4:2) (5:2) (6:2) (7:2) (8:2) (9:2) (10:2) (11:2)§§
+insert status-line : + FOCUS_X=8 FOCUS_STR=0 LINE ::start)(§§§ (1:33) (2:7) (3:2) (4:2) (5:2) (6:2) (7:2) (8:2) (9:2) (10:2) (11:2)§§
 
 # grow list beyond, with focus on left force ellipsis to the right
 insert new-hi : + WIN_ID :12
 
 # grow list beyond, with focus on left force ellipsis to the right
 insert new-hi : + WIN_ID :12
-line 22 on_black,bright_white :start)([0] (1:34) (2:7) (3:2) (4:2) (5:2) (6:2) (7:2) (8:2) (9:2) (10:2) (11:…>§§
+insert status-line : + FOCUS_X=8 FOCUS_STR=0 LINE ::start)(§§§ (1:34) (2:7) (3:2) (4:2) (5:2) (6:2) (7:2) (8:2) (9:2) (10:2) (11:…>§§
 
 # shrink (uncut) listing but grow title to the left more, forcing ellipsis still to cut earlier
 > /window 1
 
 # shrink (uncut) listing but grow title to the left more, forcing ellipsis still to cut earlier
 > /window 1
-line 22 on_black,bright_white foo.bar.baz:debug)(0 [1] (2:7) (3:2) (4:2) (5:2) (6:2) (7:2) (8:2) (9:2) (10:2…>§§
+insert status-line : + FOCUS_X=21 FOCUS_STR=1 LINE :foo.bar.baz:debug)(0 §§§ (2:7) (3:2) (4:2) (5:2) (6:2) (7:2) (8:2) (9:2) (10:2…>§§
 
 # further shrink uncut listing until ellipsis gone again; with focus not moving beyond left half, don't scroll yet
 > /window 3
 
 # further shrink uncut listing until ellipsis gone again; with focus not moving beyond left half, don't scroll yet
 > /window 3
-line 22 on_black,bright_white foo.bar.baz/win3)(0 1 (2:7) [3] (4:2) (5:2) (6:2) (7:2) (8:2) (9:2) (10:2) (11…>§§
+insert status-line : + FOCUS_X=28 FOCUS_STR=3 LINE :foo.bar.baz/win3)(0 1 (2:7) §§§ (4:2) (5:2) (6:2) (7:2) (8:2) (9:2) (10:2) (11…>§§
 > /window 4
 > /window 4
-line 22 on_black,bright_white foo.bar.baz/win4)(0 1 (2:7) 3 [4] (5:2) (6:2) (7:2) (8:2) (9:2) (10:2) (11:2) …>§§
+insert status-line : + FOCUS_X=30 FOCUS_STR=4 LINE :foo.bar.baz/win4)(0 1 (2:7) 3 §§§ (5:2) (6:2) (7:2) (8:2) (9:2) (10:2) (11:2) …>§§
 > /window 5
 > /window 5
-line 22 on_black,bright_white foo.bar.baz/win5)(0 1 (2:7) 3 4 [5] (6:2) (7:2) (8:2) (9:2) (10:2) (11:2) (12:2)§§
+insert status-line : + FOCUS_X=32 FOCUS_STR=5 LINE :foo.bar.baz/win5)(0 1 (2:7) 3 4 §§§ (6:2) (7:2) (8:2) (9:2) (10:2) (11:2) (12:2)§§
 
 # grow uncut listing again, re-establishing ellipsis to the right
 insert new-hi : + WIN_ID :13
 
 # grow uncut listing again, re-establishing ellipsis to the right
 insert new-hi : + WIN_ID :13
-line 22 on_black,bright_white foo.bar.baz/win5)(0 (1:1) (2:7) 3 4 [5] (6:2) (7:2) (8:2) (9:2) (10:2) (11:2) …>§§
+insert status-line : + FOCUS_X=36 FOCUS_STR=5 LINE :foo.bar.baz/win5)(0 (1:1) (2:7) 3 4 §§§ (6:2) (7:2) (8:2) (9:2) (10:2) (11:2) …>§§
 
 # move focus into middle of listing, scrolling so that ellipsis on both side
 > /window 8
 
 # move focus into middle of listing, scrolling so that ellipsis on both side
 > /window 8
-line 22 on_black,bright_white foo.bar.baz/win8)<…:1) (2:7) 3 4 5 (6:2) (7:2) [8] (9:2) (10:2) (11:2) (12:2) …>§§
+insert status-line : + FOCUS_X=47 FOCUS_STR=8 LINE :foo.bar.baz/win8)<…:1) (2:7) 3 4 5 (6:2) (7:2) §§§ (9:2) (10:2) (11:2) (12:2) …>§§
 
 # move focus further to the right, so that only ellipsis on the left
 > /window 9
 
 # move focus further to the right, so that only ellipsis on the left
 > /window 9
-line 22 on_black,bright_white foo.bar.baz/win9)<…:1) (2:7) 3 4 5 (6:2) (7:2) 8 [9] (10:2) (11:2) (12:2) (13:2)§§
+insert status-line : + FOCUS_X=49 FOCUS_STR=9 LINE :foo.bar.baz/win9)<…:1) (2:7) 3 4 5 (6:2) (7:2) 8 §§§ (10:2) (11:2) (12:2) (13:2)§§
 
 # shrink uncut listing to return to full view again (no ellipses) 
 > /window 13
 
 # shrink uncut listing to return to full view again (no ellipses) 
 > /window 13
-line 22 on_black,bright_white foo.bar.baz/win13)(0 (1:1) (2:7) 3 4 5 (6:2) (7:2) 8 9 (10:2) (11:2) (12:2) [13]§§
+insert status-line : + FOCUS_X=76 FOCUS_STR=13 LINE :foo.bar.baz/win13)(0 (1:1) (2:7) 3 4 5 (6:2) (7:2) 8 9 (10:2) (11:2) (12:2) §§§§§§
 
 # add new window, re-establishing ellipsis to the left, with focus remaining quite to the right
 insert new-hi : + WIN_ID :14
 
 # add new window, re-establishing ellipsis to the left, with focus remaining quite to the right
 insert new-hi : + WIN_ID :14
-line 22 on_black,bright_white foo.bar.baz/win13)<…(2:7) 3 4 5 (6:2) (7:2) 8 9 (10:2) (11:2) (12:2) [13] (14:2)§§
+insert status-line : + FOCUS_X=69 FOCUS_STR=13 LINE :foo.bar.baz/win13)<…(2:7) 3 4 5 (6:2) (7:2) 8 9 (10:2) (11:2) (12:2) §§§§ (14:2)§§