ttx 0.1.0
Loading...
Searching...
No Matches
screen.h
Go to the documentation of this file.
1#pragma once
2#include "di/bit/bitset/prelude.h"
3#include "di/container/string/string_view.h"
4#include "di/container/view/cache_last.h"
5#include "di/reflect/prelude.h"
6#include "scroll_region.h"
8#include "ttx/size.h"
9#include "ttx/terminal/cell.h"
10#include "ttx/terminal/cursor.h"
16#include "ttx/terminal/row.h"
20
21namespace ttx::terminal {
27
34enum class OriginMode {
37};
38
44 u32 row { 0 };
45 u32 col { 0 };
46 bool overflow_pending { false };
49
50 auto operator==(SavedCursor const&) const -> bool = default;
51 auto operator<=>(SavedCursor const&) const = default;
52
53 constexpr friend auto tag_invoke(di::Tag<di::reflect>, di::InPlaceType<SavedCursor>) {
54 return di::make_fields<"SavedCursor">(di::field<"row", &SavedCursor::row>, di::field<"col", &SavedCursor::col>,
55 di::field<"overflow_pending", &SavedCursor::overflow_pending>,
56 di::field<"graphics_rendition", &SavedCursor::graphics_rendition>,
57 di::field<"origin_mode", &SavedCursor::origin_mode>);
58 }
59};
60
69class Screen {
70public:
71 enum class ScrollBackEnabled { No, Yes };
72
73 explicit Screen(Size const& size, ScrollBackEnabled scroll_back_enabled);
74
75 auto resize(Size const& size) -> ReflowResult;
76 void set_scroll_region(ScrollRegion const& region);
77
78 auto max_height() const -> u32 { return m_size.rows; }
79 auto max_width() const -> u32 { return m_size.cols; }
80 auto size() const -> Size const& { return m_size; }
81 auto scroll_region() const -> ScrollRegion const& { return m_scroll_region; }
82
83 auto current_graphics_rendition() const -> GraphicsRendition const&;
84 auto current_hyperlink() const -> di::Optional<Hyperlink const&>;
85
87 void set_current_hyperlink(di::Optional<Hyperlink const&> hyperlink);
88
89 auto cursor() const -> Cursor { return m_cursor; }
90 auto origin_mode() const -> OriginMode { return m_origin_mode; }
91
92 auto save_cursor() const -> SavedCursor;
94
95 void set_origin_mode(OriginMode mode);
96 void set_cursor_relative(u32 row, u32 col);
97 void set_cursor(u32 row, u32 col);
98 void set_cursor(u32 row, u32 col, bool overflow_pending);
99 void set_cursor_row_relative(u32 row);
100 void set_cursor_row(u32 row);
101 void set_cursor_col_relative(u32 col);
102 void set_cursor_col(u32 col);
103
104 void insert_blank_characters(u32 count);
105 void insert_blank_lines(u32 count);
106
107 void delete_characters(u32 count);
108 void delete_lines(u32 count);
109
110 void clear();
111 void clear_after_cursor();
112 void clear_before_cursor();
113
114 void clear_row();
117 void erase_characters(u32 n);
118
119 void scroll_down();
120 void put_code_point(c32 code_point, AutoWrapMode auto_wrap_mode);
121 void put_osc66(OSC66 const& sized_text, AutoWrapMode auto_wrap_mode);
122
123 void put_semantic_prompt(OSC133&& osc133);
124 void put_semantic_prompt(BeginPrompt&& begin_prompt);
125 void put_semantic_prompt(EndPrompt&& end_prompt);
126 void put_semantic_prompt(EndInput&& end_input);
127 void put_semantic_prompt(EndCommand&& end_command);
129
130 void invalidate_all() { m_whole_screen_dirty = true; }
131 auto whole_screen_dirty() const -> bool { return m_whole_screen_dirty; }
132 void clear_whole_screen_dirty_flag() { m_whole_screen_dirty = false; }
134
135 auto absolute_row_start() const -> u64 { return m_scroll_back.absolute_row_start(); }
136 auto absolute_row_screen_start() const -> u64 { return m_scroll_back.absolute_row_end(); }
137 auto absolute_row_end() const -> u64 { return absolute_row_screen_start() + max_height(); }
138 auto total_rows() const -> usize { return m_scroll_back.total_rows() + m_active_rows.total_rows(); }
139
140 void clear_scroll_back();
141
142 auto visual_scroll_offset() const -> u64 {
143 ASSERT_GT_EQ(m_visual_scroll_offset, absolute_row_start());
144 ASSERT_LT_EQ(m_visual_scroll_offset, absolute_row_screen_start());
145 return m_visual_scroll_offset;
146 }
148 void visual_scroll_up();
149 void visual_scroll_down();
153
154 void visual_reflow_rows_if_needed(u64 visible_rows);
155
161
162 auto selection() const -> di::Optional<Selection> { return m_selection; }
163 void clear_selection();
164 void begin_selection(AbsolutePosition const& point, BeginSelectionMode mode);
165 void update_selection(AbsolutePosition const& point);
166 auto in_selection(AbsolutePosition const& point) const -> bool;
167 auto selected_text() const -> di::String;
168 auto selected_text(Selection selection) const -> di::String;
169
170 auto text_in_last_command(bool include_command) const -> di::String;
171
172 auto find_row(u64 row) const -> di::Tuple<u32, RowGroup const&>;
173 auto iterate_row(u64 row) const {
174 auto [r, group] = find_row(row);
175 return group.iterate_row(r);
176 }
177
185 auto state_as_escape_sequences() const -> di::String;
186
187 void put_cell(di::StringView text, MultiCellInfo const& multi_cell_info, AutoWrapMode auto_wrap_mode,
188 bool explicitly_sized, bool complex_grapheme_cluster);
189
190private:
191 void put_single_cell(di::StringView text, MultiCellInfo const& multi_cell_info, AutoWrapMode auto_wrap_mode,
192 bool explicitly_sized, bool complex_grapheme_cluster);
193 void put_wide_cell(di::StringView text, MultiCellInfo const& multi_cell_info, AutoWrapMode auto_wrap_mode,
194 bool explicitly_sized, bool complex_grapheme_cluster);
195
196 // Row/column helper functions for dealing with origin mode.
197 auto translate_row(u32 row) const -> u32;
198 auto translate_col(u32 col) const -> u32;
199 auto min_row() const -> u32;
200 auto max_row_inclusive() const -> u32;
201 auto min_col() const -> u32;
202 auto max_col_inclusive() const -> u32;
203
204 auto cursor_in_scroll_region() const -> bool;
205
206 // Clamp the selection to be within bounds, after adding/removing rows from scrollback.
207 void clamp_selection();
208
209 // Clamp a selection point to only refer to actual cells (and the top-left of any multi cell).
210 // Also return the corresponding row information, for efficiency.
211 auto clamp_selection_point(AbsolutePosition const& point) const
212 -> di::Tuple<AbsolutePosition, RowGroup const&, u32>;
213
214 // Apply reflow result to all stored coordinates (does not affect the cursor).
215 void apply_reflow_result(ReflowResult const& reflow_result);
216
217 // Invalidate a region of rows and cells, as specified by the selection region.
218 void invalidate_region(Selection const& region);
219
220 auto begin_row_iterator() { return rows().begin() + m_scroll_region.start_row; }
221 auto end_row_iterator() { return rows().begin() + m_scroll_region.end_row; }
222
223 auto rows() -> di::Ring<Row>& { return m_active_rows.rows(); }
224 auto rows() const -> di::Ring<Row> const& { return m_active_rows.rows(); }
225
226 // Get a blank cell which respects to current background color, to support the
227 // bce (background character erase) capability.
228 auto blank_cell() -> Cell;
229
230 // Clear a cell respecting the correct background color. This is equivalent to
231 // dropping the cell followed by assigning the background color.
232 void clear_cell(Cell& cell);
233
234 // Screen state.
235 RowGroup m_active_rows;
236 bool m_whole_screen_dirty { true };
237
238 // Scroll back
239 ScrollBack m_scroll_back;
240 ScrollBackEnabled m_scroll_back_enabled { ScrollBackEnabled::No };
241 u64 m_visual_scroll_offset { 0 };
242 Commands m_commands;
243
244 // Visual selection
245 di::Optional<Selection> m_selection;
246
247 // Mutable state for writing cells.
248 Cursor m_cursor;
249 OriginMode m_origin_mode { OriginMode::Disabled };
250 u16 m_graphics_id { 0 };
251 Color m_current_background_color;
252 u16 m_hyperlink_id { 0 };
253
254 // Terminal size information.
255 Size m_size {};
256 ScrollRegion m_scroll_region;
257};
258}
Represents the result of reflowing a RowGroup.
Definition reflow_result.h:22
Represents a group of terminal rows.
Definition row_group.h:24
auto rows() -> di::Ring< Row > &
Definition row_group.h:32
auto max_width() const -> u32
Definition screen.h:79
void visual_scroll_next_command()
Definition screen.cpp:1421
BeginSelectionMode
Definition screen.h:156
void put_semantic_prompt(OSC133 &&osc133)
Definition screen.cpp:1317
void clear_row()
Definition screen.cpp:633
void visual_reflow_rows_if_needed(u64 visible_rows)
Definition screen.cpp:1432
void clear_scroll_back()
Definition screen.cpp:1385
void delete_characters(u32 count)
Definition screen.cpp:491
void set_origin_mode(OriginMode mode)
Definition screen.cpp:304
void clear_row_before_cursor()
Definition screen.cpp:682
auto visual_scroll_offset() const -> u64
Definition screen.h:142
auto total_rows() const -> usize
Definition screen.h:138
auto find_row(u64 row) const -> di::Tuple< u32, RowGroup const & >
Definition screen.cpp:1682
void put_code_point(c32 code_point, AutoWrapMode auto_wrap_mode)
Definition screen.cpp:788
Screen(Size const &size, ScrollBackEnabled scroll_back_enabled)
Definition screen.cpp:25
void update_selection(AbsolutePosition const &point)
Definition screen.cpp:1529
auto max_height() const -> u32
Definition screen.h:78
auto absolute_row_start() const -> u64
Definition screen.h:135
void clear_damage_tracking()
Definition screen.cpp:1439
void put_cell(di::StringView text, MultiCellInfo const &multi_cell_info, AutoWrapMode auto_wrap_mode, bool explicitly_sized, bool complex_grapheme_cluster)
Definition screen.cpp:1031
void set_cursor(u32 row, u32 col)
Definition screen.cpp:324
void clamp_semantic_prompts()
Definition screen.cpp:1344
void insert_blank_lines(u32 count)
Definition screen.cpp:454
auto resize(Size const &size) -> ReflowResult
Definition screen.cpp:30
void set_cursor_row(u32 row)
Definition screen.cpp:352
void clear()
Definition screen.cpp:579
void set_scroll_region(ScrollRegion const &region)
Definition screen.cpp:212
void erase_characters(u32 n)
Definition screen.cpp:706
auto scroll_region() const -> ScrollRegion const &
Definition screen.h:81
void set_cursor_col_relative(u32 col)
Definition screen.cpp:356
auto whole_screen_dirty() const -> bool
Definition screen.h:131
void set_cursor_col(u32 col)
Definition screen.cpp:360
void scroll_down()
Definition screen.cpp:749
void clear_after_cursor()
Definition screen.cpp:595
void set_current_graphics_rendition(GraphicsRendition const &rendition)
Definition screen.cpp:226
auto in_selection(AbsolutePosition const &point) const -> bool
Definition screen.cpp:1543
auto size() const -> Size const &
Definition screen.h:80
auto state_as_escape_sequences() const -> di::String
Serialize screen contents to terminal escape sequences.
Definition screen.cpp:1693
ScrollBackEnabled
Definition screen.h:71
auto current_graphics_rendition() const -> GraphicsRendition const &
Definition screen.cpp:218
void put_osc66(OSC66 const &sized_text, AutoWrapMode auto_wrap_mode)
Definition screen.cpp:964
void restore_cursor(SavedCursor const &cursor)
Definition screen.cpp:293
auto selected_text() const -> di::String
Definition screen.cpp:1620
auto text_in_last_command(bool include_command) const -> di::String
Definition screen.cpp:1551
void set_cursor_relative(u32 row, u32 col)
Definition screen.cpp:315
void begin_selection(AbsolutePosition const &point, BeginSelectionMode mode)
Definition screen.cpp:1472
void delete_lines(u32 count)
Definition screen.cpp:541
auto absolute_row_screen_start() const -> u64
Definition screen.h:136
auto absolute_row_end() const -> u64
Definition screen.h:137
void visual_scroll_up()
Definition screen.cpp:1390
void visual_scroll_down()
Definition screen.cpp:1397
auto selection() const -> di::Optional< Selection >
Definition screen.h:162
auto origin_mode() const -> OriginMode
Definition screen.h:90
void set_cursor_row_relative(u32 row)
Definition screen.cpp:348
void set_current_hyperlink(di::Optional< Hyperlink const & > hyperlink)
Definition screen.cpp:255
void visual_scroll_to_bottom()
Definition screen.cpp:1404
void clear_selection()
Definition screen.cpp:1448
auto current_hyperlink() const -> di::Optional< Hyperlink const & >
Definition screen.cpp:222
void visual_scroll_prev_command()
Definition screen.cpp:1411
void insert_blank_characters(u32 count)
Definition screen.cpp:392
auto visual_scroll_at_bottom() const -> bool
Definition screen.h:147
void clear_whole_screen_dirty_flag()
Definition screen.h:132
void clear_row_after_cursor()
Definition screen.cpp:648
void invalidate_all()
Definition screen.h:130
void clear_before_cursor()
Definition screen.cpp:611
auto iterate_row(u64 row) const
Definition screen.h:173
auto save_cursor() const -> SavedCursor
Definition screen.cpp:283
auto cursor() const -> Cursor
Definition screen.h:89
Definition absolute_position.h:6
OriginMode
Whether or not origin mode (DEC mode 6) is enabled.
Definition screen.h:34
@ Disabled
Definition screen.h:35
AutoWrapMode
Whether or not auto-wrap (DEC mode 7) is enabled.
Definition screen.h:23
@ Enabled
Definition screen.h:25
@ Disabled
Definition screen.h:24
Definition graphics_rendition.h:114
Definition size.h:7
Represents a coordinate anywhere in a screen, including scroll back.
Definition absolute_position.h:11
Represents the marker beginning a shell prompt.
Definition osc_133.h:11
Represents the current cursor position of the terminal.
Definition cursor.h:8
Represents the end of a command, including exit status.
Definition osc_133.h:51
Represents the marker ending user input (and beginning of a command)
Definition osc_133.h:40
Represents the marker ending a shell prompt.
Definition osc_133.h:28
Shared information for cells linked via text sizing protocol (OSC 66) or double width characters.
Definition multi_cell_info.h:8
Represents the explicit ending of a prompt.
Definition osc_133.h:84
Represents text annotated using the text sizing protocol.
Definition osc_66.h:12
Represents the saved cursor state, which is used for save/restore cursor operations.
Definition screen.h:43
u32 col
Column (x coordinate)
Definition screen.h:45
bool overflow_pending
Signals that the previous text outputted reached the end of a row.
Definition screen.h:46
constexpr friend auto tag_invoke(di::Tag< di::reflect >, di::InPlaceType< SavedCursor >)
Definition screen.h:53
u32 row
Row (y coordinate)
Definition screen.h:44
auto operator<=>(SavedCursor const &) const =default
GraphicsRendition graphics_rendition
Active graphics rendition.
Definition screen.h:47
auto operator==(SavedCursor const &) const -> bool=default
OriginMode origin_mode
Origin mode.
Definition screen.h:48
Represents the scrolling region for a terminal.
Definition scroll_region.h:18
u32 end_row
Represents the last row in the scroll region (exclusive!).
Definition scroll_region.h:20
u32 start_row
Represents the first row in the scroll region.
Definition scroll_region.h:19
Represents the visual selection of a terminal.
Definition selection.h:9