1
1
import Base. print
2
2
import Dates
3
3
4
+ abstract type TerminalBackend end
5
+
4
6
"""
5
- Terminal
7
+ CrosstermTerminal
6
8
"""
7
- struct Terminal
9
+ struct CrosstermTerminal <: TerminalBackend
8
10
buffers:: Vector{Buffer}
9
11
current:: Ref{UInt8}
10
12
previous:: Ref{UInt8}
@@ -13,27 +15,26 @@ struct Terminal
13
15
keyboard_buffer:: Vector{Char}
14
16
kind:: String
15
17
wait:: Float64
16
- ispaused:: Ref{Bool}
17
- isclosed:: Ref{Bool}
18
- function Terminal ()
18
+ function CrosstermTerminal ()
19
19
(; w, h) = Crossterm. size ()
20
20
rect = Rect (1 , 1 , w, h)
21
21
buffers = [Buffer (rect), Buffer (rect)]
22
22
current = 1
23
23
previous = 2
24
24
cursor_hidden = false
25
- ispaused = Ref {Bool} (false )
26
- isclosed = Ref {Bool} (false )
27
- t = new (buffers, current, previous, cursor_hidden, rect, Char[], get (ENV , " TERM" , " " ), 1 / 1000 , ispaused, isclosed)
25
+ t = new (buffers, current, previous, cursor_hidden, rect, Char[], get (ENV , " TERM" , " " ), 1 / 1000 )
28
26
TERMINAL[] = t
29
27
return t
30
28
end
31
29
end
32
30
33
- function close (t:: Terminal )
34
- t. isclosed[] = true
35
- t. ispaused[] = true
36
- end
31
+ # TODO : come up with better way to expose terminal
32
+ const TERMINAL = Ref {CrosstermTerminal} ()
33
+
34
+ # TODO : make terminal function return any backend. Right now there's only one backend - `CrosstermTerminal`
35
+ Terminal () = CrosstermTerminal ()
36
+
37
+ function close (:: CrosstermTerminal ) end
37
38
38
39
"""
39
40
Get event (nonblocking)
@@ -42,7 +43,7 @@ Get event (nonblocking)
42
43
43
44
- wait (seconds)
44
45
"""
45
- function try_get_event (t:: Terminal ; wait = t. wait)
46
+ function try_get_event (t:: CrosstermTerminal ; wait = t. wait)
46
47
if Crossterm. poll (Dates. Nanosecond (round (wait * 1e9 )))
47
48
Crossterm. read ()
48
49
else
53
54
"""
54
55
Get event (blocking)
55
56
"""
56
- function get_event (:: Terminal )
57
+ function get_event (:: CrosstermTerminal )
57
58
Crossterm. read ()
58
59
end
59
60
60
- function update! (t:: Terminal , evt) end
61
- function update! (t:: Terminal , evt:: Crossterm.Event{Crossterm.MouseEvent} ) end
62
- function update! (t:: Terminal , evt:: Crossterm.Event{Crossterm.KeyEvent} ) end
63
- function update! (t:: Terminal , evt:: Crossterm.Event{Crossterm.ResizeEvent} )
61
+ """
62
+ Flush terminal
63
+ """
64
+ flush (:: CrosstermTerminal ) = Crossterm. flush ()
65
+
66
+ function update! (t:: CrosstermTerminal , evt) end
67
+ function update! (t:: CrosstermTerminal , evt:: Crossterm.Event{Crossterm.MouseEvent} ) end
68
+ function update! (t:: CrosstermTerminal , evt:: Crossterm.Event{Crossterm.KeyEvent} ) end
69
+ function update! (t:: CrosstermTerminal , evt:: Crossterm.Event{Crossterm.ResizeEvent} )
64
70
(; w, h) = evt. data
65
71
resize (t, w, h)
66
72
clear_screen (t)
67
73
move_cursor_home (t)
68
- Crossterm . flush ()
74
+ flush (t )
69
75
end
70
76
71
- const TERMINAL = Ref {Terminal} ()
72
-
73
77
const END = 2 + 1
74
78
75
79
"""
76
80
Draw terminal contents
77
81
"""
78
- function draw (t:: Terminal )
82
+ function draw (t:: CrosstermTerminal )
79
83
pb = previous_buffer (t)
80
84
cb = current_buffer (t)
81
85
save_cursor (t)
@@ -104,122 +108,122 @@ end
104
108
"""
105
109
Move cursor
106
110
"""
107
- move_cursor (t :: Terminal , row, col) = Crossterm. to (; x = col - 1 , y = row - 1 )
111
+ move_cursor (:: CrosstermTerminal , row, col) = Crossterm. to (; x = col - 1 , y = row - 1 )
108
112
"""
109
113
Move cursor up
110
114
"""
111
- move_cursor_up (t :: Terminal , row = 1 ) = Crossterm. up (row)
115
+ move_cursor_up (:: CrosstermTerminal , row = 1 ) = Crossterm. up (row)
112
116
"""
113
117
Move cursor down
114
118
"""
115
- move_cursor_down (t :: Terminal , row = 1 ) = Crossterm. down (row)
119
+ move_cursor_down (:: CrosstermTerminal , row = 1 ) = Crossterm. down (row)
116
120
"""
117
121
Move cursor right
118
122
"""
119
- move_cursor_right (t :: Terminal , col = 1 ) = Crossterm. right (col)
123
+ move_cursor_right (:: CrosstermTerminal , col = 1 ) = Crossterm. right (col)
120
124
"""
121
125
Move cursor left
122
126
"""
123
- move_cursor_left (t :: Terminal , col = 1 ) = Crossterm. left (col)
127
+ move_cursor_left (:: CrosstermTerminal , col = 1 ) = Crossterm. left (col)
124
128
"""
125
129
Move cursor home
126
130
"""
127
- move_cursor_home (t :: Terminal ) = Crossterm. to (; x = 0 , y = 0 )
131
+ move_cursor_home (:: CrosstermTerminal ) = Crossterm. to (; x = 0 , y = 0 )
128
132
129
133
"""
130
134
Clear screen
131
135
"""
132
- clear_screen (t :: Terminal ) = Crossterm. clear ()
136
+ clear_screen (:: CrosstermTerminal ) = Crossterm. clear ()
133
137
"""
134
138
Clear screen from cursor up onwards
135
139
"""
136
- clear_screen_from_cursor_up (t :: Terminal ) = Crossterm. clear (Crossterm. ClearType. FROM_CURSOR_UP)
140
+ clear_screen_from_cursor_up (:: CrosstermTerminal ) = Crossterm. clear (Crossterm. ClearType. FROM_CURSOR_UP)
137
141
"""
138
142
Clear screen from cursor down onwards
139
143
"""
140
- clear_screen_from_cursor_down (t :: Terminal ) = Crossterm. clear (Crossterm. ClearType. FROM_CURSOR_DOWN)
144
+ clear_screen_from_cursor_down (:: CrosstermTerminal ) = Crossterm. clear (Crossterm. ClearType. FROM_CURSOR_DOWN)
141
145
142
146
"""
143
147
Clear line
144
148
"""
145
- clear_line (t :: Terminal ) = Crossterm. clear (Crossterm. ClearType. CURRENT_LINE)
149
+ clear_line (:: CrosstermTerminal ) = Crossterm. clear (Crossterm. ClearType. CURRENT_LINE)
146
150
"""
147
151
Clear line from cursor right onwards
148
152
"""
149
- clear_line_from_cursor_right (t :: Terminal ) = Crossterm. clear (Crossterm. ClearType. UNTIL_NEW_LINE)
153
+ clear_line_from_cursor_right (:: CrosstermTerminal ) = Crossterm. clear (Crossterm. ClearType. UNTIL_NEW_LINE)
150
154
"""
151
155
Clear line from cursor left onwards
152
156
"""
153
- clear_line_from_cursor_left (t :: Terminal ) = Crossterm. clear (Crossterm. ClearType. CURRENT_LINE)
157
+ clear_line_from_cursor_left (:: CrosstermTerminal ) = Crossterm. clear (Crossterm. ClearType. CURRENT_LINE)
154
158
155
159
"""
156
160
Hide cursor
157
161
"""
158
- hide_cursor (t :: Terminal ) = Crossterm. hide ()
162
+ hide_cursor (:: CrosstermTerminal ) = Crossterm. hide ()
159
163
"""
160
164
Show cursor
161
165
"""
162
- show_cursor (t :: Terminal ) = Crossterm. show ()
166
+ show_cursor (:: CrosstermTerminal ) = Crossterm. show ()
163
167
164
168
"""
165
169
Save cursor
166
170
"""
167
- save_cursor (t :: Terminal ) = Crossterm. save ()
171
+ save_cursor (:: CrosstermTerminal ) = Crossterm. save ()
168
172
"""
169
173
Restore cursor
170
174
"""
171
- restore_cursor (t :: Terminal ) = Crossterm. restore ()
175
+ restore_cursor (:: CrosstermTerminal ) = Crossterm. restore ()
172
176
173
177
"""
174
178
Change cursor to default
175
179
"""
176
- change_cursor_to_default (t :: Terminal ) = Crossterm. style (Crossterm. Style. DEFAULT_USER_SHAPE)
180
+ change_cursor_to_default (:: CrosstermTerminal ) = Crossterm. style (Crossterm. Style. DEFAULT_USER_SHAPE)
177
181
178
182
"""
179
183
Change cursor to blinking block
180
184
"""
181
- change_cursor_to_blinking_block (t :: Terminal ) = Crossterm. style (Crossterm. Style. BLINKING_BLOCK)
185
+ change_cursor_to_blinking_block (:: CrosstermTerminal ) = Crossterm. style (Crossterm. Style. BLINKING_BLOCK)
182
186
183
187
"""
184
188
Change cursor to steady block
185
189
"""
186
- change_cursor_to_steady_block (t :: Terminal ) = Crossterm. style (Crossterm. Style. STEADY_BLOCK)
190
+ change_cursor_to_steady_block (:: CrosstermTerminal ) = Crossterm. style (Crossterm. Style. STEADY_BLOCK)
187
191
"""
188
192
Change cursor to blinking underline
189
193
"""
190
- change_cursor_to_blinking_underline (t :: Terminal ) = Crossterm. style (Crossterm. Style. BLINKING_UNDER_SCORE)
194
+ change_cursor_to_blinking_underline (:: CrosstermTerminal ) = Crossterm. style (Crossterm. Style. BLINKING_UNDER_SCORE)
191
195
"""
192
196
Change cursor to steady underline
193
197
"""
194
- change_cursor_to_steady_underline (t :: Terminal ) = Crossterm. style (Crossterm. Style. STEADY_UNDER_SCORE)
198
+ change_cursor_to_steady_underline (:: CrosstermTerminal ) = Crossterm. style (Crossterm. Style. STEADY_UNDER_SCORE)
195
199
"""
196
200
Change cursor to blinking ibeam
197
201
"""
198
- change_cursor_to_blinking_ibeam (t :: Terminal ) = Crossterm. style (Crossterm. Style. BLINKING_BAR)
202
+ change_cursor_to_blinking_ibeam (:: CrosstermTerminal ) = Crossterm. style (Crossterm. Style. BLINKING_BAR)
199
203
"""
200
204
Change cursor to steady ibeam
201
205
"""
202
- change_cursor_to_steady_ibeam (t :: Terminal ) = Crossterm. style (Crossterm. Style. STEADY_BAR)
206
+ change_cursor_to_steady_ibeam (:: CrosstermTerminal ) = Crossterm. style (Crossterm. Style. STEADY_BAR)
203
207
204
208
"""
205
209
Alternate screen TUI mode
206
210
"""
207
- tui_mode (t :: Terminal ) = Crossterm. alternate_screen (true )
211
+ tui_mode (:: CrosstermTerminal ) = Crossterm. alternate_screen (true )
208
212
"""
209
213
Default mode
210
214
"""
211
- default_mode (t :: Terminal ) = Crossterm. alternate_screen (false )
215
+ default_mode (:: CrosstermTerminal ) = Crossterm. alternate_screen (false )
212
216
213
217
"""
214
218
Get current buffer
215
219
"""
216
- current_buffer (t:: Terminal ):: Buffer = t. buffers[t. current[]]
220
+ current_buffer (t:: CrosstermTerminal ):: Buffer = t. buffers[t. current[]]
217
221
current_buffer ():: Buffer = current_buffer (TERMINAL[])
218
222
219
223
"""
220
224
Get previous buffer
221
225
"""
222
- previous_buffer (t:: Terminal ):: Buffer = t. buffers[t. previous[]]
226
+ previous_buffer (t:: CrosstermTerminal ):: Buffer = t. buffers[t. previous[]]
223
227
previous_buffer ():: Buffer = previous_buffer (TERMINAL[])
224
228
225
229
put (c:: SubString{String} ) = Crossterm. print (string (c))
@@ -231,13 +235,13 @@ function put(cell::Cell)
231
235
put (string (inv (cell. style)))
232
236
end
233
237
234
- render (t:: Terminal , widget) = render (t, widget, area (t))
235
- render (t:: Terminal , widget, r:: Rect ) = render (widget, r, current_buffer (t))
238
+ render (t:: CrosstermTerminal , widget) = render (t, widget, area (t))
239
+ render (t:: CrosstermTerminal , widget, r:: Rect ) = render (widget, r, current_buffer (t))
236
240
237
241
"""
238
242
Resize terminal
239
243
"""
240
- function resize (t:: Terminal , w:: Int , h:: Int )
244
+ function resize (t:: CrosstermTerminal , w:: Int , h:: Int )
241
245
rect = Rect (1 , 1 , w, h)
242
246
t. terminal_size[] = rect
243
247
t. buffers[t. current[]] = Buffer (rect)
247
251
"""
248
252
Area of terminal as Rect (width, height)
249
253
"""
250
- area (t:: Terminal ) = t. terminal_size[]
254
+ function area (t:: CrosstermTerminal )
255
+ t. terminal_size[]
256
+ end
251
257
252
258
function tui (f:: Function ; flags... )
253
259
r = nothing
0 commit comments