ttx 0.1.0
Loading...
Searching...
No Matches
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 "ttx/cursor_style.h"
9#include "ttx/key_event_io.h"
10#include "ttx/mouse_event_io.h"
11#include "ttx/params.h"
12#include "ttx/paste_event_io.h"
13#include "ttx/size.h"
20#include "ttx/terminal/screen.h"
21
22namespace ttx {
23class Terminal;
24
26 di::Vector<byte> data;
27};
28
30 di::String string;
31};
32
34 di::Variant<APC, terminal::OSC2, terminal::OSC7, terminal::OSC52, terminal::OSC8671, Size, WritePtyString>;
35
37 u32 mode { 0 };
38 bool is_private { true };
40 void (*set_mode)(Terminal&, bool);
41};
42
43template<auto>
45
46class Terminal {
47 struct ScreenState {
48 explicit ScreenState(Size const& size, terminal::Screen::ScrollBackEnabled scroll_back_enabled)
49 : screen(size, scroll_back_enabled) {}
50
51 terminal::Screen screen;
52 di::Optional<terminal::SavedCursor> saved_cursor;
54
55 // Per https://sw.kovidgoyal.net/kitty/keyboard-protocol/#detection-of-support-for-this-protocol,
56 // the keyboard mode stack and flags are per-screen.
57 KeyReportingFlags m_key_reporting_flags { KeyReportingFlags::None };
58 di::Ring<KeyReportingFlags> m_key_reporting_flags_stack;
59
60 // Seamless navigation protocl registration state is per-screen.
61 bool m_seamless_navigate_protocol_active { false };
62 bool m_seamless_navigate_protocol_hide_cursor_on_enter { false };
63 };
64
65public:
66 explicit Terminal(u64 id, Size const& size, terminal::Palette const& global_palette,
68
69 // Return a string which when replayed will result in the terminal
70 // having state identical to the current state.
71 auto state_as_escape_sequences() const -> di::String;
72
73 void on_parser_results(di::Span<ParserResult> results);
74
75 auto active_screen() const -> ScreenState const&;
76 auto active_screen() -> ScreenState& {
77 return const_cast<ScreenState&>(const_cast<Terminal const&>(*this).active_screen());
78 }
79
80 auto cursor_row() const -> u32 { return active_screen().screen.cursor().row; }
81 auto cursor_col() const -> u32 { return active_screen().screen.cursor().col; }
82 auto cursor_hidden() const -> bool { return m_cursor_hidden; }
83 auto cursor_style() const -> CursorStyle { return active_screen().cursor_style; }
84 auto reverse_video() const -> bool { return m_reverse_video; }
85
86 auto allowed_to_draw() const -> bool { return !m_disable_drawing; }
87
88 // TODO: scroll back
89 auto total_rows() const -> u32 { return row_count(); }
90 auto visual_scroll_offset() const -> u64 { return active_screen().screen.visual_scroll_offset(); }
91
92 auto row_count() const -> u32 { return active_screen().screen.max_height(); }
93 auto col_count() const -> u32 { return active_screen().screen.max_width(); }
94 auto size() const -> Size { return active_screen().screen.size(); }
95
96 void set_visible_size(Size const& size);
97 auto visible_size() const -> Size { return m_available_size; }
98
99 auto application_cursor_keys_mode() const -> ApplicationCursorKeysMode { return m_application_cursor_keys_mode; }
100 auto key_reporting_flags() const -> KeyReportingFlags { return active_screen().m_key_reporting_flags; }
101
102 auto alternate_scroll_mode() const -> AlternateScrollMode { return m_alternate_scroll_mode; }
103 auto mouse_protocol() const -> MouseProtocol { return m_mouse_protocol; }
104 auto mouse_encoding() const -> MouseEncoding { return m_mouse_encoding; }
105 auto in_alternate_screen_buffer() const -> bool { return !!m_alternate_screen; }
106 auto focus_event_mode() const -> FocusEventMode { return m_focus_event_mode; }
107 auto shift_escape_options() const -> ShiftEscapeOptions { return m_shift_escape_options; }
108
109 void reset_mouse_reporting() { m_mouse_protocol = MouseProtocol::None; }
110
111 auto bracked_paste_mode() const -> BracketedPasteMode { return m_bracketed_paste_mode; }
112
113 void soft_reset();
114
115 void invalidate_all();
116
117 auto outgoing_events() -> di::Vector<TerminalEvent> { return di::move(m_outgoing_events); }
118
119 void set_allow_force_terminal_size(bool b = true) { m_allow_force_terminal_size = b; }
120
121 void hide_cursor() { m_cursor_hidden = true; }
122
124 return active_screen().m_seamless_navigate_protocol_active;
125 }
126
128 return active_screen().m_seamless_navigate_protocol_active &&
129 active_screen().m_seamless_navigate_protocol_hide_cursor_on_enter;
130 }
131
132 auto local_palette() const -> terminal::Palette const& { return m_local_palette; }
133 void set_local_palette(terminal::Palette const& palette);
134
135 auto global_palette() const -> terminal::Palette const& { return m_global_palette; }
136 void set_global_palette(terminal::Palette const& palette);
137
139 void send_theme_change();
140
141private:
142 template<auto>
144
145 void on_parser_result(PrintableCharacter&& printable_character);
146 void on_parser_result(DCS&& dcs);
147 void on_parser_result(OSC&& osc);
148 void on_parser_result(APC&& apc);
149 void on_parser_result(CSI&& csi);
150 void on_parser_result(Escape&& escape);
151 void on_parser_result(ControlCharacter&& control);
152
153 void resize(Size const& size);
154
155 void put_char(c32 c);
156
157 // TODO: vertical and horizontal scrolling regions.
158 auto min_row_inclusive() const -> u32 { return 0; }
159 auto min_col_inclusive() const -> u32 { return 0; }
160
161 auto max_row_inclusive() const -> u32 { return row_count() - 1; }
162 auto max_col_inclusive() const -> u32 { return col_count() - 1; }
163
164 void clear();
165
166 void set_use_alternate_screen_buffer(bool b);
167
168 void esc_decaln();
169 void esc_decsc();
170 void esc_decrc();
171
172 void c0_bs();
173 void c0_ht();
174 void c0_lf();
175 void c0_vt();
176 void c0_ff();
177 void c0_cr();
178
179 void c1_ind();
180 void c1_nel();
181 void c1_hts();
182 void c1_ri();
183
184 void dcs_decrqss(Params const& params, di::StringView data);
185 void dcs_xtgettcap(Params const& params, di::StringView data);
186
187 void osc_2(di::StringView data);
188 void osc_7(di::StringView data);
189 void osc_8(di::StringView data);
190 void osc_21(di::StringView data);
191 void osc_52(di::StringView data);
192 void osc_66(di::StringView data);
193 void osc_133(di::StringView data);
194 void osc_8671(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_cpl(Params const& params);
202 void csi_cnl(Params const& params);
203 void csi_cup(Params const& params);
204 void csi_cha(Params const& params);
205 void csi_ed(Params const& params);
206 void csi_el(Params const& params);
207 void csi_il(Params const& params);
208 void csi_dl(Params const& params);
209 void csi_dch(Params const& params);
210 void csi_su(Params const& params);
211 void csi_sd(Params const& params);
212 void csi_ech(Params const& params);
213 void csi_rep(Params const& params);
214 void csi_da1(Params const& params);
215 void csi_da2(Params const& params);
216 void csi_da3(Params const& params);
217 void csi_vpa(Params const& params);
218 void csi_hvp(Params const& params);
219 void csi_hpa(Params const& params);
220 void csi_hpr(Params const& params);
221 void csi_vpr(Params const& params);
222 void csi_tbc(Params const& params);
223 void csi_cht(Params const& params);
224 void csi_decset(Params const& params);
225 void csi_decrst(Params const& params);
226 void csi_decrqm(Params const& params);
227 void csi_decscusr(Params const& params);
228 void csi_sgr(Params const& params);
229 void csi_dsr(Params const& params);
230 void csi_dsr_dec(Params const& params);
231 void csi_decstbm(Params const& params);
232 void csi_scosc(Params const& params);
233 void csi_scorc(Params const& params);
234 void csi_decstr(Params const& params);
235 void csi_xshiftescape(Params const& params);
236 void csi_xtwinops(Params const& params);
237
238 void csi_set_key_reporting_flags(Params const& params);
239 void csi_get_key_reporting_flags(Params const& params);
240 void csi_push_key_reporting_flags(Params const& params);
241 void csi_pop_key_reporting_flags(Params const& params);
242
243 // Hyperlink state
244 u64 m_id { 0 }; // Base id
245 u64 m_next_hyperlink_id { 1 };
246
247 ScreenState m_primary_screen;
248 di::Box<ScreenState> m_alternate_screen;
249
250 Size m_available_size;
251 bool m_80_col_mode { false };
252 bool m_132_col_mode { false };
253 bool m_allow_80_132_col_mode { false };
254 bool m_force_terminal_size { false };
255 bool m_allow_force_terminal_size { false };
256
258 bool m_send_theme_changes { false };
259
260 di::Vector<u32> m_tab_stops;
261 bool m_cursor_hidden { false };
262 bool m_disable_drawing { false };
264 bool m_reverse_video { false };
265 di::Optional<c32> m_last_graphics_charcter { 0 };
266 terminal::Palette m_local_palette {};
267 terminal::Palette m_global_palette {};
268
269 ApplicationCursorKeysMode m_application_cursor_keys_mode { ApplicationCursorKeysMode::Disabled };
270
271 AlternateScrollMode m_alternate_scroll_mode { AlternateScrollMode::Enabled };
272 MouseProtocol m_mouse_protocol { MouseProtocol::None };
273 MouseEncoding m_mouse_encoding { MouseEncoding::X10 };
274 FocusEventMode m_focus_event_mode { FocusEventMode::Disabled };
276
277 BracketedPasteMode m_bracketed_paste_mode { false };
278 di::Optional<terminal::OSC2> m_window_title;
279 di::Optional<terminal::OSC7> m_cwd;
280 bool m_in_band_size_reports { false };
281
282 di::Vector<TerminalEvent> m_outgoing_events;
283};
284}
Definition terminal.h:46
auto key_reporting_flags() const -> KeyReportingFlags
Definition terminal.h:100
void invalidate_all()
Definition terminal.cpp:1299
auto cursor_style() const -> CursorStyle
Definition terminal.h:83
auto mouse_encoding() const -> MouseEncoding
Definition terminal.h:104
void soft_reset()
Definition terminal.cpp:1369
friend auto make_mode_handler() -> ModeHandler
auto cursor_col() const -> u32
Definition terminal.h:81
void set_local_palette(terminal::Palette const &palette)
Definition terminal.cpp:1303
Terminal(u64 id, Size const &size, terminal::Palette const &global_palette, terminal::Palette const &local_palette, terminal::ThemeMode theme_mode)
Definition terminal.cpp:33
void set_global_palette(terminal::Palette const &palette)
Definition terminal.cpp:1312
auto bracked_paste_mode() const -> BracketedPasteMode
Definition terminal.h:111
auto seamless_navigation_protocol_active() const -> bool
Definition terminal.h:123
void reset_mouse_reporting()
Definition terminal.h:109
auto outgoing_events() -> di::Vector< TerminalEvent >
Definition terminal.h:117
auto active_screen() const -> ScreenState const &
Definition terminal.cpp:1362
void set_allow_force_terminal_size(bool b=true)
Definition terminal.h:119
auto shift_escape_options() const -> ShiftEscapeOptions
Definition terminal.h:107
void send_theme_change()
Definition terminal.cpp:1329
auto col_count() const -> u32
Definition terminal.h:93
void hide_cursor()
Definition terminal.h:121
auto focus_event_mode() const -> FocusEventMode
Definition terminal.h:106
void set_visible_size(Size const &size)
Definition terminal.cpp:1272
auto mouse_protocol() const -> MouseProtocol
Definition terminal.h:103
auto total_rows() const -> u32
Definition terminal.h:89
auto visual_scroll_offset() const -> u64
Definition terminal.h:90
auto row_count() const -> u32
Definition terminal.h:92
auto cursor_row() const -> u32
Definition terminal.h:80
auto visible_size() const -> Size
Definition terminal.h:97
auto global_palette() const -> terminal::Palette const &
Definition terminal.h:135
auto size() const -> Size
Definition terminal.h:94
auto cursor_hidden() const -> bool
Definition terminal.h:82
auto alternate_scroll_mode() const -> AlternateScrollMode
Definition terminal.h:102
void set_theme_mode(terminal::ThemeMode mode)
Definition terminal.cpp:1321
auto local_palette() const -> terminal::Palette const &
Definition terminal.h:132
void on_parser_results(di::Span< ParserResult > results)
Definition terminal.cpp:42
auto active_screen() -> ScreenState &
Definition terminal.h:76
auto seamless_navigate_protocol_hide_cursor_on_enter() const -> bool
Definition terminal.h:127
auto application_cursor_keys_mode() const -> ApplicationCursorKeysMode
Definition terminal.h:99
auto state_as_escape_sequences() const -> di::String
Definition terminal.cpp:1407
auto in_alternate_screen_buffer() const -> bool
Definition terminal.h:105
auto allowed_to_draw() const -> bool
Definition terminal.h:86
auto reverse_video() const -> bool
Definition terminal.h:84
Definition palette.h:69
Represents the visible contents of the terminal (with no scroll back).
Definition screen.h:69
ScrollBackEnabled
Definition screen.h:71
Definition absolute_position.h:6
AutoWrapMode
Whether or not auto-wrap (DEC mode 7) is enabled.
Definition screen.h:23
@ Enabled
Definition screen.h:25
ModeSupport
Definition mode.h:183
ThemeMode
Theme mode (light or dark).
Definition palette.h:10
@ Dark
Definition palette.h:12
Definition clipboard.h:10
ShiftEscapeOptions
Definition mouse_event_io.h:27
@ OverrideApplication
Definition mouse_event_io.h:28
MouseEncoding
Definition mouse_event_io.h:61
@ X10
Definition mouse_event_io.h:62
KeyReportingFlags
Definition key_event_io.h:27
@ None
Definition key_event_io.h:28
di::Variant< APC, terminal::OSC2, terminal::OSC7, terminal::OSC52, terminal::OSC8671, Size, WritePtyString > TerminalEvent
Definition terminal.h:33
AlternateScrollMode
Definition mouse_event_io.h:14
@ Enabled
Definition mouse_event_io.h:16
auto make_mode_handler() -> ModeHandler
CursorStyle
Definition cursor_style.h:6
@ SteadyBar
Definition cursor_style.h:12
MouseProtocol
Definition mouse_event_io.h:44
@ None
Definition mouse_event_io.h:45
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:46
Definition escape_sequence_parser.h:56
Definition escape_sequence_parser.h:81
Definition escape_sequence_parser.h:22
Definition escape_sequence_parser.h:69
Definition terminal.h:36
terminal::ModeSupport(* query_mode)(Terminal &)
Definition terminal.h:39
void(* set_mode)(Terminal &, bool)
Definition terminal.h:40
bool is_private
Definition terminal.h:38
u32 mode
Definition terminal.h:37
Definition escape_sequence_parser.h:35
Definition escape_sequence_parser.h:12
Definition terminal.h:25
di::Vector< byte > data
Definition terminal.h:26
Definition size.h:7
Definition terminal.h:29
di::String string
Definition terminal.h:30