Loading [MathJax]/extensions/tex2jax.js
ttx 0.1.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
terminal.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/container/ring/ring.h"
4#include "di/io/vector_writer.h"
5#include "dius/sync_file.h"
6#include "dius/tty.h"
7#include "ttx/cursor_style.h"
11#include "ttx/key_event_io.h"
12#include "ttx/mouse_event_io.h"
13#include "ttx/params.h"
14#include "ttx/paste_event_io.h"
15
16namespace ttx {
18 di::Vector<byte> data;
19};
20
21using TerminalEvent = di::Variant<SetClipboard>;
22
23class Terminal {
24public:
25 struct Cell {
26 c32 ch { ' ' };
28 mutable bool dirty : 1 { true };
29 };
30
31 using Row = di::Vector<Cell>;
32
33 explicit Terminal(dius::SyncFile& psuedo_terminal) : m_psuedo_terminal(psuedo_terminal) {}
34
35 auto clone() const -> Terminal {
36 auto result = Terminal(m_psuedo_terminal);
37 result.m_rows = di::clone(m_rows);
38 result.m_row_count = m_row_count;
39 result.m_col_count = m_col_count;
40 result.m_xpixels = m_xpixels;
41 result.m_ypixels = m_ypixels;
42 result.m_col_count = m_col_count;
43 result.m_available_rows_in_display = m_available_rows_in_display;
44 result.m_available_cols_in_display = m_available_cols_in_display;
45 result.m_available_xpixels_in_display = m_available_xpixels_in_display;
46 result.m_available_ypixels_in_display = m_available_ypixels_in_display;
47 result.m_80_col_mode = m_80_col_mode;
48 result.m_132_col_mode = m_132_col_mode;
49 result.m_allow_80_132_col_mode = m_allow_80_132_col_mode;
50 result.m_force_terminal_size = m_force_terminal_size;
51 result.m_allow_force_terminal_size = m_allow_force_terminal_size;
52
53 result.m_tab_stops = di::clone(m_tab_stops);
54 result.m_cursor_row = m_cursor_row;
55 result.m_cursor_col = m_cursor_col;
56 result.m_cursor_style = m_cursor_style;
57 result.m_saved_cursor_row = m_saved_cursor_row;
58 result.m_saved_cursor_col = m_saved_cursor_col;
59 result.m_cursor_hidden = m_cursor_hidden;
60 result.m_disable_drawing = m_disable_drawing;
61 result.m_autowrap_mode = m_autowrap_mode;
62 result.m_x_overflow = m_x_overflow;
63 result.m_origin_mode = m_origin_mode;
64
65 result.m_application_cursor_keys_mode = m_application_cursor_keys_mode;
66 result.m_key_reporting_flags = m_key_reporting_flags;
67 result.m_key_reporting_flags_stack = di::clone(m_key_reporting_flags_stack);
68
69 result.m_alternate_scroll_mode = m_alternate_scroll_mode;
70 result.m_mouse_protocol = m_mouse_protocol;
71 result.m_mouse_encoding = m_mouse_encoding;
72 result.m_focus_event_mode = m_focus_event_mode;
73
74 result.m_bracketed_paste_mode = m_bracketed_paste_mode;
75
76 result.m_current_graphics_rendition = m_current_graphics_rendition;
77
78 result.m_rows_below = di::clone(m_rows_below);
79 result.m_rows_above = di::clone(m_rows_above);
80 result.m_scroll_start = m_scroll_start;
81 result.m_scroll_end = m_scroll_end;
82 return result;
83 }
84
85 // Return a string which when replayed will result in the terminal
86 // having state identical to the current state.
87 auto state_as_escape_sequences() const -> di::String;
88
89 void on_parser_results(di::Span<ParserResult const> results);
90
91 auto cursor_row() const -> u32 { return m_cursor_row; }
92 auto cursor_col() const -> u32 { return m_cursor_col; }
93 auto cursor_hidden() const -> bool { return m_cursor_hidden; }
94 auto should_display_cursor_at_position(u32 r, u32 c) const -> bool;
95 auto cursor_style() const -> CursorStyle { return m_cursor_style; }
96 auto scroll_relative_offset(u32 display_row) const -> u32;
97
98 auto allowed_to_draw() const -> bool { return !m_disable_drawing; }
99
100 void scroll_to_bottom();
101 void scroll_up();
102 void scroll_down();
103
104 auto total_rows() const -> u32 { return m_rows_above.size() + m_rows.size() + m_rows_below.size(); }
105 auto row_offset() const -> u32 { return m_rows_above.size(); }
106 auto row_count() const -> u32 { return m_row_count; }
107 auto col_count() const -> u32 { return m_col_count; }
108 auto size() const -> dius::tty::WindowSize { return { m_row_count, m_col_count, m_xpixels, m_ypixels }; }
109
110 void set_visible_size(dius::tty::WindowSize const& window_size);
111 auto visible_size() const -> dius::tty::WindowSize {
112 return { m_available_rows_in_display, m_available_cols_in_display, m_available_xpixels_in_display,
113 m_available_ypixels_in_display };
114 }
115
117 void scroll_up_if_needed();
118
119 auto application_cursor_keys_mode() const -> ApplicationCursorKeysMode { return m_application_cursor_keys_mode; }
120 auto key_reporting_flags() const -> KeyReportingFlags { return m_key_reporting_flags; }
121
122 auto alternate_scroll_mode() const -> AlternateScrollMode { return m_alternate_scroll_mode; }
123 auto mouse_protocol() const -> MouseProtocol { return m_mouse_protocol; }
124 auto mouse_encoding() const -> MouseEncoding { return m_mouse_encoding; }
125 auto in_alternate_screen_buffer() const -> bool { return !!m_save_state; }
126 auto focus_event_mode() const -> FocusEventMode { return m_focus_event_mode; }
127
128 void reset_mouse_reporting() { m_mouse_protocol = MouseProtocol::None; }
129
130 auto bracked_paste_mode() const -> BracketedPasteMode { return m_bracketed_paste_mode; }
131
132 auto rows() const -> di::Vector<Row> const& { return m_rows; }
133 auto row_at_scroll_relative_offset(u32 offset) const -> Row const&;
134
135 void invalidate_all();
136
137 auto outgoing_events() -> di::Vector<TerminalEvent> { return di::move(m_outgoing_events); }
138
139 void set_allow_force_terminal_size(bool b = true) { m_allow_force_terminal_size = b; }
140
141private:
142 void on_parser_result(PrintableCharacter const& printable_character);
143 void on_parser_result(DCS const& dcs);
144 void on_parser_result(OSC const& osc);
145 void on_parser_result(APC const& apc);
146 void on_parser_result(CSI const& csi);
147 void on_parser_result(Escape const& escape);
148 void on_parser_result(ControlCharacter const& control);
149
150 void resize(dius::tty::WindowSize const& window_size);
151
152 void put_char(u32 row, u32 col, c32 c);
153 void put_char(c32 c);
154
155 void save_pos() {
156 m_saved_cursor_row = m_cursor_row;
157 m_saved_cursor_col = m_cursor_col;
158 }
159 void restore_pos() {
160 m_cursor_row = m_saved_cursor_row;
161 m_cursor_col = m_saved_cursor_col;
162 }
163
164 void set_cursor(u32 row, u32 col);
165
166 auto min_row_inclusive() const -> u32 {
167 if (m_origin_mode) {
168 return m_scroll_start;
169 }
170 return 0;
171 }
172 auto min_col_inclusive() const -> u32 { return 0; }
173
174 auto max_row_inclusive() const -> u32 {
175 if (m_origin_mode) {
176 return m_scroll_end;
177 }
178 return m_row_count - 1;
179 }
180 auto max_col_inclusive() const -> u32 { return m_col_count - 1; }
181
182 auto translate_row(u32 row) const -> u32 {
183 if (m_origin_mode) {
184 return row + m_scroll_start - 1;
185 }
186 return row - 1;
187 }
188 auto translate_col(u32 col) const -> u32 { return col - 1; }
189
190 void clear_below_cursor(char ch = ' ');
191 void clear_above_cursor(char ch = ' ');
192 void clear(char ch = ' ');
193 void clear_row(u32 row, char ch = ' ');
194 void clear_row_until(u32 row, u32 end_col, char ch = ' ');
195 void clear_row_to_end(u32 row, u32 start_col, char ch = ' ');
196
197 auto state_as_escape_sequences_internal(di::VectorWriter<>& writer) const;
198
199 void set_use_alternate_screen_buffer(bool b);
200
201 void esc_decaln();
202 void esc_decsc();
203 void esc_decrc();
204
205 void c0_bs();
206 void c0_ht();
207 void c0_lf();
208 void c0_vt();
209 void c0_ff();
210 void c0_cr();
211
212 void c1_ind();
213 void c1_nel();
214 void c1_hts();
215 void c1_ri();
216
217 void dcs_decrqss(Params const& params, di::StringView data);
218
219 void osc_52(di::StringView data);
220
221 void csi_ich(Params const& params);
222 void csi_cuu(Params const& params);
223 void csi_cud(Params const& params);
224 void csi_cuf(Params const& params);
225 void csi_cub(Params const& params);
226 void csi_cup(Params const& params);
227 void csi_cha(Params const& params);
228 void csi_ed(Params const& params);
229 void csi_el(Params const& params);
230 void csi_il(Params const& params);
231 void csi_dl(Params const& params);
232 void csi_dch(Params const& params);
233 void csi_su(Params const& params);
234 void csi_sd(Params const& params);
235 void csi_ech(Params const& params);
236 void csi_rep(Params const& params);
237 void csi_da1(Params const& params);
238 void csi_da2(Params const& params);
239 void csi_da3(Params const& params);
240 void csi_vpa(Params const& params);
241 void csi_hvp(Params const& params);
242 void csi_tbc(Params const& params);
243 void csi_decset(Params const& params);
244 void csi_decrst(Params const& params);
245 void csi_decrqm(Params const& params);
246 void csi_decscusr(Params const& params);
247 void csi_sgr(Params const& params);
248 void csi_dsr(Params const& params);
249 void csi_decstbm(Params const& params);
250 void csi_scosc(Params const& params);
251 void csi_scorc(Params const& params);
252 void csi_xtwinops(Params const& params);
253
254 void csi_set_key_reporting_flags(Params const& params);
255 void csi_get_key_reporting_flags(Params const& params);
256 void csi_push_key_reporting_flags(Params const& params);
257 void csi_pop_key_reporting_flags(Params const& params);
258
259 di::Vector<Row> m_rows;
260 u32 m_row_count { 0 };
261 u32 m_col_count { 0 };
262 u32 m_xpixels { 0 };
263 u32 m_ypixels { 0 };
264 u32 m_available_rows_in_display { 0 };
265 u32 m_available_cols_in_display { 0 };
266 u32 m_available_xpixels_in_display { 0 };
267 u32 m_available_ypixels_in_display { 0 };
268 bool m_80_col_mode { false };
269 bool m_132_col_mode { false };
270 bool m_allow_80_132_col_mode { false };
271 bool m_force_terminal_size { false };
272 bool m_allow_force_terminal_size { false };
273
274 di::Vector<u32> m_tab_stops;
275 u32 m_cursor_row { 0 };
276 u32 m_cursor_col { 0 };
277 u32 m_saved_cursor_row { 0 };
278 u32 m_saved_cursor_col { 0 };
279 CursorStyle m_cursor_style { CursorStyle::SteadyBlock };
280 bool m_cursor_hidden { false };
281 bool m_disable_drawing { false };
282 bool m_autowrap_mode { true };
283 bool m_x_overflow { false };
284 bool m_origin_mode { false };
285
286 ApplicationCursorKeysMode m_application_cursor_keys_mode { ApplicationCursorKeysMode::Disabled };
287 KeyReportingFlags m_key_reporting_flags { KeyReportingFlags::None };
288 di::Ring<KeyReportingFlags> m_key_reporting_flags_stack;
289
290 AlternateScrollMode m_alternate_scroll_mode { AlternateScrollMode::Disabled };
291 MouseProtocol m_mouse_protocol { MouseProtocol::None };
292 MouseEncoding m_mouse_encoding { MouseEncoding::X10 };
293 FocusEventMode m_focus_event_mode { FocusEventMode::Disabled };
294
295 BracketedPasteMode m_bracketed_paste_mode { false };
296
297 GraphicsRendition m_current_graphics_rendition;
298
299 di::Vector<Row> m_rows_below;
300 di::Vector<Row> m_rows_above;
301 u32 m_scroll_start { 0 };
302 u32 m_scroll_end { 0 };
303
304 di::Vector<TerminalEvent> m_outgoing_events;
305
306 di::Box<Terminal> m_save_state;
307
308 dius::SyncFile& m_psuedo_terminal;
309};
310}
void scroll_to_bottom()
Definition terminal.cpp:1303
auto key_reporting_flags() const -> KeyReportingFlags
Definition terminal.h:120
void invalidate_all()
Definition terminal.cpp:1083
auto cursor_style() const -> CursorStyle
Definition terminal.h:95
void set_visible_size(dius::tty::WindowSize const &window_size)
Definition terminal.cpp:1033
auto mouse_encoding() const -> MouseEncoding
Definition terminal.h:124
auto cursor_col() const -> u32
Definition terminal.h:92
auto row_at_scroll_relative_offset(u32 offset) const -> Row const &
Definition terminal.cpp:1183
auto bracked_paste_mode() const -> BracketedPasteMode
Definition terminal.h:130
void reset_mouse_reporting()
Definition terminal.h:128
auto scroll_relative_offset(u32 display_row) const -> u32
Definition terminal.cpp:1173
auto outgoing_events() -> di::Vector< TerminalEvent >
Definition terminal.h:137
void set_allow_force_terminal_size(bool b=true)
Definition terminal.h:139
void on_parser_results(di::Span< ParserResult const > results)
Definition terminal.cpp:21
auto should_display_cursor_at_position(u32 r, u32 c) const -> bool
Definition terminal.cpp:1157
auto col_count() const -> u32
Definition terminal.h:107
auto visible_size() const -> dius::tty::WindowSize
Definition terminal.h:111
auto focus_event_mode() const -> FocusEventMode
Definition terminal.h:126
auto mouse_protocol() const -> MouseProtocol
Definition terminal.h:123
void scroll_up()
Definition terminal.cpp:1238
auto total_rows() const -> u32
Definition terminal.h:104
auto row_count() const -> u32
Definition terminal.h:106
void scroll_down_if_needed()
Definition terminal.cpp:1281
void scroll_down()
Definition terminal.cpp:1249
auto cursor_row() const -> u32
Definition terminal.h:91
Terminal(dius::SyncFile &psuedo_terminal)
Definition terminal.h:33
auto rows() const -> di::Vector< Row > const &
Definition terminal.h:132
auto cursor_hidden() const -> bool
Definition terminal.h:93
auto alternate_scroll_mode() const -> AlternateScrollMode
Definition terminal.h:122
auto row_offset() const -> u32
Definition terminal.h:105
di::Vector< Cell > Row
Definition terminal.h:31
auto clone() const -> Terminal
Definition terminal.h:35
auto application_cursor_keys_mode() const -> ApplicationCursorKeysMode
Definition terminal.h:119
auto state_as_escape_sequences() const -> di::String
Definition terminal.cpp:1505
auto in_alternate_screen_buffer() const -> bool
Definition terminal.h:125
void scroll_up_if_needed()
Definition terminal.cpp:1260
auto size() const -> dius::tty::WindowSize
Definition terminal.h:108
auto allowed_to_draw() const -> bool
Definition terminal.h:98
Definition test_graphics_rendition.cpp:7
Definition cursor_style.h:5
MouseEncoding
Definition mouse_event_io.h:44
@ X10
Definition mouse_event_io.h:45
KeyReportingFlags
Definition key_event_io.h:27
@ None
Definition key_event_io.h:28
di::Variant< PrintableCharacter, DCS, OSC, APC, CSI, Escape, ControlCharacter > ParserResult
Definition escape_sequence_parser.h:92
AlternateScrollMode
Definition mouse_event_io.h:14
@ Disabled
Definition mouse_event_io.h:15
auto resize(ResizeDirection direction, i32 amount_in_cells) -> Action
Definition actions.cpp:41
CursorStyle
Definition cursor_style.h:6
@ SteadyBlock
Definition cursor_style.h:8
di::Variant< SetClipboard > TerminalEvent
Definition terminal.h:21
MouseProtocol
Definition mouse_event_io.h:27
@ None
Definition mouse_event_io.h:28
BracketedPasteMode
Definition paste_event_io.h:11
ApplicationCursorKeysMode
Definition key_event_io.h:14
@ Disabled
Definition key_event_io.h:15
FocusEventMode
Definition focus_event_io.h:10
@ Disabled
Definition focus_event_io.h:11
Definition escape_sequence_parser.h:45
Definition escape_sequence_parser.h:55
Definition escape_sequence_parser.h:80
Definition escape_sequence_parser.h:21
Definition escape_sequence_parser.h:68
Definition graphics_rendition.h:103
Definition escape_sequence_parser.h:34
Definition escape_sequence_parser.h:11
Definition terminal.h:17
di::Vector< byte > data
Definition terminal.h:18
Definition terminal.h:25
c32 ch
Definition terminal.h:26
bool dirty
Definition terminal.h:28