Iros
 
Loading...
Searching...
No Matches
terminal.h
Go to the documentation of this file.
1#pragma once
2
4#include "dius/sync_file.h"
5#include "dius/tty.h"
6#include "ttx/cursor_style.h"
10#include "ttx/key_event_io.h"
11#include "ttx/mouse_event_io.h"
12#include "ttx/params.h"
13#include "ttx/paste_event_io.h"
14
15namespace ttx {
16class Terminal {
17public:
18 struct Cell {
19 c32 ch { ' ' };
21 mutable bool dirty : 1 { true };
22 };
23
25
26 explicit Terminal(dius::SyncFile& psuedo_terminal) : m_psuedo_terminal(psuedo_terminal) {}
27
28 auto clone() const -> Terminal {
29 auto result = Terminal(m_psuedo_terminal);
30 result.m_rows = di::clone(m_rows);
31 result.m_row_count = m_row_count;
32 result.m_col_count = m_col_count;
33 result.m_xpixels = m_xpixels;
34 result.m_ypixels = m_ypixels;
35 result.m_col_count = m_col_count;
36 result.m_available_rows_in_display = m_available_rows_in_display;
37 result.m_available_cols_in_display = m_available_cols_in_display;
38 result.m_available_xpixels_in_display = m_available_xpixels_in_display;
39 result.m_available_ypixels_in_display = m_available_ypixels_in_display;
40 result.m_80_col_mode = m_80_col_mode;
41 result.m_132_col_mode = m_132_col_mode;
42 result.m_allow_80_132_col_mode = m_allow_80_132_col_mode;
43
44 result.m_tab_stops = di::clone(m_tab_stops);
45 result.m_cursor_row = m_cursor_row;
46 result.m_cursor_col = m_cursor_col;
47 result.m_cursor_style = m_cursor_style;
48 result.m_saved_cursor_row = m_saved_cursor_row;
49 result.m_saved_cursor_col = m_saved_cursor_col;
50 result.m_cursor_hidden = m_cursor_hidden;
51 result.m_disable_drawing = m_disable_drawing;
52 result.m_autowrap_mode = m_autowrap_mode;
53 result.m_x_overflow = m_x_overflow;
54 result.m_origin_mode = m_origin_mode;
55
56 result.m_application_cursor_keys_mode = m_application_cursor_keys_mode;
57 result.m_key_reporting_flags = m_key_reporting_flags;
58 result.m_key_reporting_flags_stack = di::clone(m_key_reporting_flags_stack);
59
60 result.m_alternate_scroll_mode = m_alternate_scroll_mode;
61 result.m_mouse_protocol = m_mouse_protocol;
62 result.m_mouse_encoding = m_mouse_encoding;
63 result.m_focus_event_mode = m_focus_event_mode;
64
65 result.m_bracketed_paste_mode = m_bracketed_paste_mode;
66
67 result.m_current_graphics_rendition = m_current_graphics_rendition;
68
69 result.m_rows_below = di::clone(m_rows_below);
70 result.m_rows_above = di::clone(m_rows_above);
71 result.m_scroll_start = m_scroll_start;
72 result.m_scroll_end = m_scroll_end;
73 return result;
74 }
75
77
78 auto cursor_row() const -> u32 { return m_cursor_row; }
79 auto cursor_col() const -> u32 { return m_cursor_col; }
80 auto cursor_hidden() const -> bool { return m_cursor_hidden; }
81 auto should_display_cursor_at_position(u32 r, u32 c) const -> bool;
82 auto cursor_style() const -> CursorStyle { return m_cursor_style; }
83 auto scroll_relative_offset(u32 display_row) const -> u32;
84
85 auto allowed_to_draw() const -> bool { return !m_disable_drawing; }
86
87 void scroll_to_bottom();
88 void scroll_up();
89 void scroll_down();
90
91 auto total_rows() const -> u32 { return m_rows_above.size() + m_rows.size() + m_rows_below.size(); }
92 auto row_offset() const -> u32 { return m_rows_above.size(); }
93 auto row_count() const -> u32 { return m_row_count; }
94 auto col_count() const -> u32 { return m_col_count; }
95 auto size() const -> dius::tty::WindowSize { return { m_row_count, m_col_count, m_xpixels, m_ypixels }; }
96
97 void set_visible_size(dius::tty::WindowSize const& window_size);
98 auto visible_size() const -> dius::tty::WindowSize {
99 return { m_available_rows_in_display, m_available_cols_in_display, m_available_xpixels_in_display,
100 m_available_ypixels_in_display };
101 }
102
104 void scroll_up_if_needed();
105
106 auto application_cursor_keys_mode() const -> ApplicationCursorKeysMode { return m_application_cursor_keys_mode; }
107 auto key_reporting_flags() const -> KeyReportingFlags { return m_key_reporting_flags; }
108
109 auto alternate_scroll_mode() const -> AlternateScrollMode { return m_alternate_scroll_mode; }
110 auto mouse_protocol() const -> MouseProtocol { return m_mouse_protocol; }
111 auto mouse_encoding() const -> MouseEncoding { return m_mouse_encoding; }
112 auto in_alternate_screen_buffer() const -> bool { return !!m_save_state; }
113 auto focus_event_mode() const -> FocusEventMode { return m_focus_event_mode; }
114
115 auto bracked_paste_mode() const -> BracketedPasteMode { return m_bracketed_paste_mode; }
116
117 auto rows() const -> di::Vector<Row> const& { return m_rows; }
118 auto row_at_scroll_relative_offset(u32 offset) const -> Row const&;
119
120 void invalidate_all();
121
122private:
123 void on_parser_result(PrintableCharacter const& printable_character);
124 void on_parser_result(DCS const& dcs);
125 void on_parser_result(CSI const& csi);
126 void on_parser_result(Escape const& escape);
127 void on_parser_result(ControlCharacter const& control);
128
129 void resize(dius::tty::WindowSize const& window_size);
130
131 void put_char(u32 row, u32 col, c32 c);
132 void put_char(c32 c);
133
134 void save_pos() {
135 m_saved_cursor_row = m_cursor_row;
136 m_saved_cursor_col = m_cursor_col;
137 }
138 void restore_pos() {
139 m_cursor_row = m_saved_cursor_row;
140 m_cursor_col = m_saved_cursor_col;
141 }
142
143 void set_cursor(u32 row, u32 col);
144
145 auto min_row_inclusive() const -> u32 {
146 if (m_origin_mode) {
147 return m_scroll_start;
148 }
149 return 0;
150 }
151 auto min_col_inclusive() const -> u32 { return 0; }
152
153 auto max_row_inclusive() const -> u32 {
154 if (m_origin_mode) {
155 return m_scroll_end;
156 }
157 return m_row_count - 1;
158 }
159 auto max_col_inclusive() const -> u32 { return m_col_count - 1; }
160
161 auto translate_row(u32 row) const -> u32 {
162 if (m_origin_mode) {
163 return row + m_scroll_start - 1;
164 }
165 return row - 1;
166 }
167 auto translate_col(u32 col) const -> u32 { return col - 1; }
168
169 void clear_below_cursor(char ch = ' ');
170 void clear_above_cursor(char ch = ' ');
171 void clear(char ch = ' ');
172 void clear_row(u32 row, char ch = ' ');
173 void clear_row_until(u32 row, u32 end_col, char ch = ' ');
174 void clear_row_to_end(u32 row, u32 start_col, char ch = ' ');
175
176 void set_use_alternate_screen_buffer(bool b);
177
178 void esc_decaln();
179 void esc_decsc();
180 void esc_decrc();
181
182 void c0_bs();
183 void c0_ht();
184 void c0_lf();
185 void c0_vt();
186 void c0_ff();
187 void c0_cr();
188
189 void c1_ind();
190 void c1_nel();
191 void c1_hts();
192 void c1_ri();
193
194 void dcs_decrqss(Params const& params, di::StringView data);
195
196 void csi_ich(Params const& params);
197 void csi_cuu(Params const& params);
198 void csi_cud(Params const& params);
199 void csi_cuf(Params const& params);
200 void csi_cub(Params const& params);
201 void csi_cup(Params const& params);
202 void csi_cha(Params const& params);
203 void csi_ed(Params const& params);
204 void csi_el(Params const& params);
205 void csi_il(Params const& params);
206 void csi_dl(Params const& params);
207 void csi_dch(Params const& params);
208 void csi_su(Params const& params);
209 void csi_sd(Params const& params);
210 void csi_ech(Params const& params);
211 void csi_rep(Params const& params);
212 void csi_da1(Params const& params);
213 void csi_da2(Params const& params);
214 void csi_da3(Params const& params);
215 void csi_vpa(Params const& params);
216 void csi_hvp(Params const& params);
217 void csi_tbc(Params const& params);
218 void csi_decset(Params const& params);
219 void csi_decrst(Params const& params);
220 void csi_decrqm(Params const& params);
221 void csi_decscusr(Params const& params);
222 void csi_sgr(Params const& params);
223 void csi_dsr(Params const& params);
224 void csi_decstbm(Params const& params);
225 void csi_scosc(Params const& params);
226 void csi_scorc(Params const& params);
227
228 void csi_set_key_reporting_flags(Params const& params);
229 void csi_get_key_reporting_flags(Params const& params);
230 void csi_push_key_reporting_flags(Params const& params);
231 void csi_pop_key_reporting_flags(Params const& params);
232
233 di::Vector<Row> m_rows;
234 u32 m_row_count { 0 };
235 u32 m_col_count { 0 };
236 u32 m_xpixels { 0 };
237 u32 m_ypixels { 0 };
238 u32 m_available_rows_in_display { 0 };
239 u32 m_available_cols_in_display { 0 };
240 u32 m_available_xpixels_in_display { 0 };
241 u32 m_available_ypixels_in_display { 0 };
242 bool m_80_col_mode { false };
243 bool m_132_col_mode { false };
244 bool m_allow_80_132_col_mode { false };
245
246 di::Vector<u32> m_tab_stops;
247 u32 m_cursor_row { 0 };
248 u32 m_cursor_col { 0 };
249 u32 m_saved_cursor_row { 0 };
250 u32 m_saved_cursor_col { 0 };
251 CursorStyle m_cursor_style { CursorStyle::SteadyBlock };
252 bool m_cursor_hidden { false };
253 bool m_disable_drawing { false };
254 bool m_autowrap_mode { true };
255 bool m_x_overflow { false };
256 bool m_origin_mode { false };
257
258 ApplicationCursorKeysMode m_application_cursor_keys_mode { ApplicationCursorKeysMode::Disabled };
259 KeyReportingFlags m_key_reporting_flags { KeyReportingFlags::None };
260 di::Ring<KeyReportingFlags> m_key_reporting_flags_stack;
261
262 AlternateScrollMode m_alternate_scroll_mode { AlternateScrollMode::Disabled };
263 MouseProtocol m_mouse_protocol { MouseProtocol::None };
264 MouseEncoding m_mouse_encoding { MouseEncoding::X10 };
265 FocusEventMode m_focus_event_mode { FocusEventMode::Disabled };
266
267 BracketedPasteMode m_bracketed_paste_mode { false };
268
269 GraphicsRendition m_current_graphics_rendition;
270
271 di::Vector<Row> m_rows_below;
272 di::Vector<Row> m_rows_above;
273 u32 m_scroll_start { 0 };
274 u32 m_scroll_end { 0 };
275
276 di::Box<Terminal> m_save_state;
277
278 dius::SyncFile& m_psuedo_terminal;
279};
280}
Definition vector_forward_declaration.h:8
Definition span_forward_declaration.h:10
Definition sync_file.h:40
void scroll_to_bottom()
Definition terminal.cpp:1204
auto key_reporting_flags() const -> KeyReportingFlags
Definition terminal.h:107
void invalidate_all()
Definition terminal.cpp:984
auto cursor_style() const -> CursorStyle
Definition terminal.h:82
void set_visible_size(dius::tty::WindowSize const &window_size)
Definition terminal.cpp:937
auto mouse_encoding() const -> MouseEncoding
Definition terminal.h:111
auto cursor_col() const -> u32
Definition terminal.h:79
auto row_at_scroll_relative_offset(u32 offset) const -> Row const &
Definition terminal.cpp:1084
auto bracked_paste_mode() const -> BracketedPasteMode
Definition terminal.h:115
auto scroll_relative_offset(u32 display_row) const -> u32
Definition terminal.cpp:1074
void on_parser_results(di::Span< ParserResult const > results)
Definition terminal.cpp:16
auto should_display_cursor_at_position(u32 r, u32 c) const -> bool
Definition terminal.cpp:1058
auto col_count() const -> u32
Definition terminal.h:94
auto visible_size() const -> dius::tty::WindowSize
Definition terminal.h:98
auto focus_event_mode() const -> FocusEventMode
Definition terminal.h:113
auto mouse_protocol() const -> MouseProtocol
Definition terminal.h:110
void scroll_up()
Definition terminal.cpp:1139
auto total_rows() const -> u32
Definition terminal.h:91
auto row_count() const -> u32
Definition terminal.h:93
void scroll_down_if_needed()
Definition terminal.cpp:1182
void scroll_down()
Definition terminal.cpp:1150
auto cursor_row() const -> u32
Definition terminal.h:78
Terminal(dius::SyncFile &psuedo_terminal)
Definition terminal.h:26
auto rows() const -> di::Vector< Row > const &
Definition terminal.h:117
auto cursor_hidden() const -> bool
Definition terminal.h:80
auto alternate_scroll_mode() const -> AlternateScrollMode
Definition terminal.h:109
auto row_offset() const -> u32
Definition terminal.h:92
di::Vector< Cell > Row
Definition terminal.h:24
auto clone() const -> Terminal
Definition terminal.h:28
auto application_cursor_keys_mode() const -> ApplicationCursorKeysMode
Definition terminal.h:106
auto in_alternate_screen_buffer() const -> bool
Definition terminal.h:112
void scroll_up_if_needed()
Definition terminal.cpp:1161
auto size() const -> dius::tty::WindowSize
Definition terminal.h:95
auto allowed_to_draw() const -> bool
Definition terminal.h:85
string::StringViewImpl< string::Utf8Encoding > StringView
Definition string_view.h:12
char32_t c32
Definition char.h:6
__UINT32_TYPE__ u32
Definition integers.h:11
Definition zstring_parser.h:9
constexpr auto clone
Definition clone.h:39
Definition directory_entry.h:11
Definition escape_sequence_parser.cpp:18
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
AlternateScrollMode
Definition mouse_event_io.h:14
@ Disabled
Definition mouse_event_io.h:15
CursorStyle
Definition cursor_style.h:6
@ SteadyBlock
Definition cursor_style.h:8
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 tty.h:6
Definition escape_sequence_parser.h:34
Definition escape_sequence_parser.h:59
Definition escape_sequence_parser.h:21
Definition escape_sequence_parser.h:47
Definition graphics_rendition.h:103
Definition escape_sequence_parser.h:11
Definition terminal.h:18
GraphicsRendition graphics_rendition
Definition terminal.h:20
c32 ch
Definition terminal.h:19
bool dirty
Definition terminal.h:21