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"
16#include "ttx/terminal/screen.h"
17
18namespace ttx {
20 di::Vector<byte> data;
21};
22
23using TerminalEvent = di::Variant<APC, terminal::OSC7, terminal::OSC52>;
24
25class Terminal {
26 struct ScreenState {
27 explicit ScreenState(Size const& size, terminal::Screen::ScrollBackEnabled scroll_back_enabled)
28 : screen(size, scroll_back_enabled) {}
29
30 terminal::Screen screen;
31 di::Optional<terminal::SavedCursor> saved_cursor;
33
34 // Per https://sw.kovidgoyal.net/kitty/keyboard-protocol/#detection-of-support-for-this-protocol,
35 // the keyboard mode stack and flags are per-screen.
36 KeyReportingFlags m_key_reporting_flags { KeyReportingFlags::None };
37 di::Ring<KeyReportingFlags> m_key_reporting_flags_stack;
38 };
39
40public:
41 explicit Terminal(u64 id, dius::SyncFile& psuedo_terminal, Size const& size);
42
43 // Return a string which when replayed will result in the terminal
44 // having state identical to the current state.
45 auto state_as_escape_sequences() const -> di::String;
46
47 void on_parser_results(di::Span<ParserResult> results);
48
49 auto active_screen() const -> ScreenState const&;
50 auto active_screen() -> ScreenState& {
51 return const_cast<ScreenState&>(const_cast<Terminal const&>(*this).active_screen());
52 }
53
54 auto cursor_row() const -> u32 { return active_screen().screen.cursor().row; }
55 auto cursor_col() const -> u32 { return active_screen().screen.cursor().col; }
56 auto cursor_hidden() const -> bool { return m_cursor_hidden; }
57 auto cursor_style() const -> CursorStyle { return active_screen().cursor_style; }
58 auto reverse_video() const -> bool { return m_reverse_video; }
59
60 auto allowed_to_draw() const -> bool { return !m_disable_drawing; }
61
62 // TODO: scroll back
63 auto total_rows() const -> u32 { return row_count(); }
64 auto visual_scroll_offset() const -> u64 { return active_screen().screen.visual_scroll_offset(); }
65
66 auto row_count() const -> u32 { return active_screen().screen.max_height(); }
67 auto col_count() const -> u32 { return active_screen().screen.max_width(); }
68 auto size() const -> Size { return active_screen().screen.size(); }
69
70 void set_visible_size(Size const& size);
71 auto visible_size() const -> Size { return m_available_size; }
72
73 auto application_cursor_keys_mode() const -> ApplicationCursorKeysMode { return m_application_cursor_keys_mode; }
74 auto key_reporting_flags() const -> KeyReportingFlags { return active_screen().m_key_reporting_flags; }
75
76 auto alternate_scroll_mode() const -> AlternateScrollMode { return m_alternate_scroll_mode; }
77 auto mouse_protocol() const -> MouseProtocol { return m_mouse_protocol; }
78 auto mouse_encoding() const -> MouseEncoding { return m_mouse_encoding; }
79 auto in_alternate_screen_buffer() const -> bool { return !!m_alternate_screen; }
80 auto focus_event_mode() const -> FocusEventMode { return m_focus_event_mode; }
81 auto shift_escape_options() const -> ShiftEscapeOptions { return m_shift_escape_options; }
82
83 void reset_mouse_reporting() { m_mouse_protocol = MouseProtocol::None; }
84
85 auto bracked_paste_mode() const -> BracketedPasteMode { return m_bracketed_paste_mode; }
86
87 void soft_reset();
88
89 void invalidate_all();
90
91 auto outgoing_events() -> di::Vector<TerminalEvent> { return di::move(m_outgoing_events); }
92
93 void set_allow_force_terminal_size(bool b = true) { m_allow_force_terminal_size = b; }
94
95private:
96 void on_parser_result(PrintableCharacter&& printable_character);
97 void on_parser_result(DCS&& dcs);
98 void on_parser_result(OSC&& osc);
99 void on_parser_result(APC&& apc);
100 void on_parser_result(CSI&& csi);
101 void on_parser_result(Escape&& escape);
102 void on_parser_result(ControlCharacter&& control);
103
104 void resize(Size const& size);
105
106 void put_char(c32 c);
107
108 // TODO: vertical and horizontal scrolling regions.
109 auto min_row_inclusive() const -> u32 { return 0; }
110 auto min_col_inclusive() const -> u32 { return 0; }
111
112 auto max_row_inclusive() const -> u32 { return row_count() - 1; }
113 auto max_col_inclusive() const -> u32 { return col_count() - 1; }
114
115 void clear();
116
117 void set_use_alternate_screen_buffer(bool b);
118
119 void esc_decaln();
120 void esc_decsc();
121 void esc_decrc();
122
123 void c0_bs();
124 void c0_ht();
125 void c0_lf();
126 void c0_vt();
127 void c0_ff();
128 void c0_cr();
129
130 void c1_ind();
131 void c1_nel();
132 void c1_hts();
133 void c1_ri();
134
135 void dcs_decrqss(Params const& params, di::StringView data);
136 void dcs_xtgettcap(Params const& params, di::StringView data);
137
138 void osc_7(di::StringView data);
139 void osc_8(di::StringView data);
140 void osc_52(di::StringView data);
141 void osc_66(di::StringView data);
142
143 void csi_ich(Params const& params);
144 void csi_cuu(Params const& params);
145 void csi_cud(Params const& params);
146 void csi_cuf(Params const& params);
147 void csi_cub(Params const& params);
148 void csi_cpl(Params const& params);
149 void csi_cnl(Params const& params);
150 void csi_cup(Params const& params);
151 void csi_cha(Params const& params);
152 void csi_ed(Params const& params);
153 void csi_el(Params const& params);
154 void csi_il(Params const& params);
155 void csi_dl(Params const& params);
156 void csi_dch(Params const& params);
157 void csi_su(Params const& params);
158 void csi_sd(Params const& params);
159 void csi_ech(Params const& params);
160 void csi_rep(Params const& params);
161 void csi_da1(Params const& params);
162 void csi_da2(Params const& params);
163 void csi_da3(Params const& params);
164 void csi_vpa(Params const& params);
165 void csi_hvp(Params const& params);
166 void csi_tbc(Params const& params);
167 void csi_decset(Params const& params);
168 void csi_decrst(Params const& params);
169 void csi_decrqm(Params const& params);
170 void csi_decscusr(Params const& params);
171 void csi_sgr(Params const& params);
172 void csi_dsr(Params const& params);
173 void csi_decstbm(Params const& params);
174 void csi_scosc(Params const& params);
175 void csi_scorc(Params const& params);
176 void csi_decstr(Params const& params);
177 void csi_xshiftescape(Params const& params);
178 void csi_xtwinops(Params const& params);
179
180 void csi_set_key_reporting_flags(Params const& params);
181 void csi_get_key_reporting_flags(Params const& params);
182 void csi_push_key_reporting_flags(Params const& params);
183 void csi_pop_key_reporting_flags(Params const& params);
184
185 // Hyperlink state
186 u64 m_id { 0 }; // Base id
187 u64 m_next_hyperlink_id { 1 };
188
189 ScreenState m_primary_screen;
190 di::Box<ScreenState> m_alternate_screen;
191
192 Size m_available_size;
193 bool m_80_col_mode { false };
194 bool m_132_col_mode { false };
195 bool m_allow_80_132_col_mode { false };
196 bool m_force_terminal_size { false };
197 bool m_allow_force_terminal_size { false };
198
199 di::Vector<u32> m_tab_stops;
200 bool m_cursor_hidden { false };
201 bool m_disable_drawing { false };
203 bool m_reverse_video { false };
204 di::Optional<c32> m_last_graphics_charcter { 0 };
205
206 ApplicationCursorKeysMode m_application_cursor_keys_mode { ApplicationCursorKeysMode::Disabled };
207
208 AlternateScrollMode m_alternate_scroll_mode { AlternateScrollMode::Enabled };
209 MouseProtocol m_mouse_protocol { MouseProtocol::None };
210 MouseEncoding m_mouse_encoding { MouseEncoding::X10 };
211 FocusEventMode m_focus_event_mode { FocusEventMode::Disabled };
213
214 BracketedPasteMode m_bracketed_paste_mode { false };
215 di::Optional<terminal::OSC7> m_cwd;
216
217 di::Vector<TerminalEvent> m_outgoing_events;
218
219 dius::SyncFile& m_psuedo_terminal;
220};
221}
auto key_reporting_flags() const -> KeyReportingFlags
Definition terminal.h:74
void invalidate_all()
Definition terminal.cpp:1218
auto cursor_style() const -> CursorStyle
Definition terminal.h:57
auto mouse_encoding() const -> MouseEncoding
Definition terminal.h:78
void soft_reset()
Definition terminal.cpp:1255
auto cursor_col() const -> u32
Definition terminal.h:55
auto bracked_paste_mode() const -> BracketedPasteMode
Definition terminal.h:85
void reset_mouse_reporting()
Definition terminal.h:83
auto outgoing_events() -> di::Vector< TerminalEvent >
Definition terminal.h:91
auto active_screen() const -> ScreenState const &
Definition terminal.cpp:1248
void set_allow_force_terminal_size(bool b=true)
Definition terminal.h:93
auto shift_escape_options() const -> ShiftEscapeOptions
Definition terminal.h:81
auto col_count() const -> u32
Definition terminal.h:67
auto focus_event_mode() const -> FocusEventMode
Definition terminal.h:80
void set_visible_size(Size const &size)
Definition terminal.cpp:1196
auto mouse_protocol() const -> MouseProtocol
Definition terminal.h:77
auto total_rows() const -> u32
Definition terminal.h:63
auto visual_scroll_offset() const -> u64
Definition terminal.h:64
auto row_count() const -> u32
Definition terminal.h:66
auto cursor_row() const -> u32
Definition terminal.h:54
auto visible_size() const -> Size
Definition terminal.h:71
auto size() const -> Size
Definition terminal.h:68
auto cursor_hidden() const -> bool
Definition terminal.h:56
auto alternate_scroll_mode() const -> AlternateScrollMode
Definition terminal.h:76
void on_parser_results(di::Span< ParserResult > results)
Definition terminal.cpp:33
Terminal(u64 id, dius::SyncFile &psuedo_terminal, Size const &size)
Definition terminal.cpp:27
auto active_screen() -> ScreenState &
Definition terminal.h:50
auto application_cursor_keys_mode() const -> ApplicationCursorKeysMode
Definition terminal.h:73
auto state_as_escape_sequences() const -> di::String
Definition terminal.cpp:1289
auto in_alternate_screen_buffer() const -> bool
Definition terminal.h:79
auto allowed_to_draw() const -> bool
Definition terminal.h:60
auto reverse_video() const -> bool
Definition terminal.h:58
Represents the visible contents of the terminal (with no scroll back)
Definition screen.h:66
ScrollBackEnabled
Definition screen.h:68
AutoWrapMode
Whether or not auto-wrap (DEC mode 7) is enabled.
Definition screen.h:20
@ Enabled
Definition screen.h:22
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
AlternateScrollMode
Definition mouse_event_io.h:14
@ Enabled
Definition mouse_event_io.h:16
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
di::Variant< APC, terminal::OSC7, terminal::OSC52 > TerminalEvent
Definition terminal.h:23
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 escape_sequence_parser.h:35
Definition escape_sequence_parser.h:12
Definition terminal.h:19
di::Vector< byte > data
Definition terminal.h:20
Definition size.h:7