1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
|
# Tagbottom: every pane's tagline on its LAST row instead of its first, and the
# transient message row (prompts, messages, the SPC indicator) stepping up to
# the row just above it. One global bool, so the whole screen flips at once.
#
# The two things worth pinning here are not pixels. The first is that a click
# still lands where it looks like it lands: the Sel coordinate space is
# UNCHANGED (row 0 is the tag, the body starts at BOX_H) and the mouse maps a
# screen row into it, so a look or an execute on a bottom tagline acts on the
# word under the pointer instead of silently sweeping whatever body row shares
# that number. Every mouse assertion below is therefore a CONSEQUENCE — a pane
# appearing, a pane going away, a view scrolling by a counted number of rows —
# and not a picture of a highlight. The tagline-execute pair is what caught the
# bug this script exists for: before the tag row got its own arm in the
# execute/look press, both ran a blank body row and a golden recorded the
# no-op as if it had passed.
# The second is that turning it back off restores the top-tagline layout
# exactly: `off` is byte-for-byte `boot`, cursor included.
file top.txt aaa\nbbb\nccc\nddd\neee\nfff\nggg\nhhh\niii\njjj\nkkk\nlll\nmmm\nnnn\nooo\nppp\nqqq\nrrr\nsss\nttt\nuuu\nvvv\nwww\nxxx\nyyy\nzzz
file bottom.txt ZZONE\nZZTWO
# Builtins announce themselves by default, and an announcement is a band at
# the top of the body -- which moves every row this script clicks. What the
# verbs do is what is under test, not the announcement.
config Verbose off
start 31 100 top.txt
wait 8000 Newcol Joincol
wait 8000 top.txt
stable 700 20000
snap boot
# SPC t b. The tag leaves row 1 for row 29, the body slides up one row, and
# the cursor goes with it (7,2 -> 7,1) because it is on the same file line.
key space t b
stable 700 15000
snap on
# ...and straight back. This grid must equal `boot`'s, to the cell.
key space t b
stable 700 15000
snap off
key space t b
stable 700 15000
# CLICK the bottom tagline (col 50 of row 30, the pane's last row) and type
# into it. A clicked tag is insert mode, so the text lands as text, and the
# cursor is down on the tagline with it. Col 50 is past the end of the path,
# which is read-only — a click inside it parks the cursor there and the typing
# goes nowhere.
# Past the last word rather than at a counted column: the tagline's words
# have moved since (Del is last now), and a column that lands INSIDE one
# types the filename into the middle of a builtin's name.
press left 90 31
release left 90 31
stable 400 5000
send \x20bottom.txt
stable 600 8000
stable 400 5000
snap tag-typed
# ...and LOOK the word just typed, from that same bottom tagline: bottom.txt
# opens as a second pane below. It only can if the press was mapped to the tag
# — mapped as a body row it lands on blank line 29 and looks nothing at all.
press right @bottom.txt 31
release right @bottom.txt 31
wait 10000 ZZONE
stable 700 15000
snap look-bottom-tag
# a body click in the UPPER pane: the cursor lands on the row under the
# pointer, counted from the pane's first row rather than from a tag that is no
# longer there. Row 6 is grid row 5, the fifth body row, file line 5.
press left 10 7
release left 10 7
stable 400 8000
snap body-cursor
# No row of text is a resize handle: a click on the lower pane's FIRST row
# (grid 16, click row 17), where the seam used to be, is a click in its text,
# and both sizes stay.
press left 40 17
release left 40 17
motion 40 25
stable 500 8000
snap seam-noop
# A terminal has no rule between panes, so the grip resizes them, as acme's
# button moves a window: the lower pane's, on its tag at the bottom, dragged up
# to row 13. The upper pane keeps 10 rows, the lower grows to 19. Both
# taglines follow their own pane's bottom.
press left 1 31
drag left 1 13
release left 1 13
motion 40 25
stable 500 8000
snap seam-dragged
# Scroll the upper pane's body down four rows and back up one, so the gutter
# click below has a scrolled view to count from. Not captured: the wheel arm of
# handleMouse is `hovered` plus scrollBy and contains no tag_bottom at all, and
# the body rendering under it is already pinned by `boot`, `on` and
# `body-cursor`. View ends at line 4.
wheel down 40 4
wheel down 40 4
wheel down 40 4
wheel down 40 4
wheel up 1 4
stable 400 8000
# a left click in the gutter scrolls UP to the clicked row, and the row it
# counts from is the BODY's first, not r.y + BOX_H. Row 4 is grid row 3, the
# third body row: two rows up, to line 2. Counted from the wrong end it would
# be one row up, to line 3.
press left 1 5
release left 1 5
stable 400 8000
snap gutter-click
# `/` in the lower pane's body arms the search input. The prompt is CUT off the
# tagline and drawn on the message row with the cursor — and with Tagbottom the
# two are adjacent: the tail keeps its builtins on row 29 while `/ZZ` and the
# cursor sit on row 28, the last body row. The tagline under it stays whole —
# the prompt must not have eaten the row it was cut from.
press left 10 15
release left 10 15
stable 400 5000
key /
send ZZ
stable 600 8000
stable 400 5000
snap search-prompt
key esc
settle 100
stable 400 5000
# the SPC leader indicator lives on that same message row, right-aligned
key space
stable 400 5000
snap leader
key esc
settle 100
stable 400 5000
# THE INVERSION. Sweeping DOWN past the last body row is the ordinary "select
# to the end" gesture, and with the tag drawn BELOW the body it lands on the
# tagline — Sel row 0. Unclamped that drives the selection's far end to the TOP
# of Sel space: the highlight jumps ABOVE the anchor and a 1-2 Cut deletes lines
# nobody swept. Anchored on grid row 3 (file line 4) and dragged onto the upper
# pane's tag row, the sweep must cover lines 4..10 downward, not 2..4 upward.
press left 8 5
drag left 8 12
stable 400 5000
# ...and the proof is the BUFFER, not the highlight: 1-2 Cut the sweep, save,
# and read the file back. aaa/bbb/ccc survive and kkk..zzz survive; unclamped
# this file lost bbb/ccc/ddd instead and kept eee onward.
press middle 8 12
release middle 8 12
release left 8 12
stable 400 5000
snap cut-down
key space f s
stable 700 15000
snapfile cut-buffer /tmp/pardes-snap/tagbottom/cwd/top.txt
# EXECUTE `Del` on the lower pane's bottom tagline: the pane goes away and the
# upper one takes the whole column back. The middle button's half of the same
# tag mapping the look used above.
press middle @Del 31
release middle @Del 31
stable 700 15000
snap del-bottom-tag
# and off again, one pane, its tagline back on row 1 with the body under it
key space t b
stable 700 15000
snap off-again
|