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"
13#include "ttx/terminal/row.h"
17
18namespace ttx::terminal {
24
31enum class OriginMode {
34};
35
41 u32 row { 0 };
42 u32 col { 0 };
43 bool overflow_pending { false };
46
47 auto operator==(SavedCursor const&) const -> bool = default;
48 auto operator<=>(SavedCursor const&) const = default;
49
50 constexpr friend auto tag_invoke(di::Tag<di::reflect>, di::InPlaceType<SavedCursor>) {
51 return di::make_fields<"SavedCursor">(di::field<"row", &SavedCursor::row>, di::field<"col", &SavedCursor::col>,
52 di::field<"overflow_pending", &SavedCursor::overflow_pending>,
53 di::field<"graphics_rendition", &SavedCursor::graphics_rendition>,
54 di::field<"origin_mode", &SavedCursor::origin_mode>);
55 }
56};
57
66class Screen {
67public:
68 enum class ScrollBackEnabled { No, Yes };
69
70 explicit Screen(Size const& size, ScrollBackEnabled scroll_back_enabled);
71
72 void resize(Size const& size);
73 void set_scroll_region(ScrollRegion const& region);
74
75 auto max_height() const -> u32 { return m_size.rows; }
76 auto max_width() const -> u32 { return m_size.cols; }
77 auto size() const -> Size const& { return m_size; }
78 auto scroll_region() const -> ScrollRegion const& { return m_scroll_region; }
79
80 auto current_graphics_rendition() const -> GraphicsRendition const&;
81 auto current_hyperlink() const -> di::Optional<Hyperlink const&>;
82
84 void set_current_hyperlink(di::Optional<Hyperlink const&> hyperlink);
85
86 auto cursor() const -> Cursor { return m_cursor; }
87 auto origin_mode() const -> OriginMode { return m_origin_mode; }
88
89 auto save_cursor() const -> SavedCursor;
91
92 void set_origin_mode(OriginMode mode);
93 void set_cursor_relative(u32 row, u32 col);
94 void set_cursor(u32 row, u32 col);
95 void set_cursor(u32 row, u32 col, bool overflow_pending);
96 void set_cursor_row_relative(u32 row);
97 void set_cursor_row(u32 row);
98 void set_cursor_col_relative(u32 col);
99 void set_cursor_col(u32 col);
100
101 void insert_blank_characters(u32 count);
102 void insert_blank_lines(u32 count);
103
104 void delete_characters(u32 count);
105 void delete_lines(u32 count);
106
107 void clear();
108 void clear_after_cursor();
109 void clear_before_cursor();
110
111 void clear_row();
114 void erase_characters(u32 n);
115
116 void scroll_down();
117 void put_code_point(c32 code_point, AutoWrapMode auto_wrap_mode);
118 void put_osc66(OSC66 const& sized_text, AutoWrapMode auto_wrap_mode);
119
120 void invalidate_all() { m_whole_screen_dirty = true; }
121 auto whole_screen_dirty() const -> bool { return m_whole_screen_dirty; }
122 void clear_whole_screen_dirty_flag() { m_whole_screen_dirty = false; }
124
125 auto absolute_row_start() const -> u64 { return m_scroll_back.absolute_row_start(); }
126 auto absolute_row_screen_start() const -> u64 { return m_scroll_back.absolute_row_end(); }
127 auto absolute_row_end() const -> u64 { return absolute_row_screen_start() + max_height(); }
128 auto total_rows() const -> usize { return m_scroll_back.total_rows() + m_active_rows.total_rows(); }
129
130 void clear_scroll_back();
131
132 auto visual_scroll_offset() const -> u64 {
133 ASSERT_GT_EQ(m_visual_scroll_offset, absolute_row_start());
134 ASSERT_LT_EQ(m_visual_scroll_offset, absolute_row_screen_start());
135 return m_visual_scroll_offset;
136 }
138 void visual_scroll_up();
139 void visual_scroll_down();
141
147
148 auto selection() const -> di::Optional<Selection> { return m_selection; }
149 void clear_selection();
150 void begin_selection(SelectionPoint const& point, BeginSelectionMode mode);
151 void update_selection(SelectionPoint const& point);
152 auto in_selection(SelectionPoint const& point) const -> bool;
153 auto selected_text() const -> di::String;
154
155 auto find_row(u64 row) const -> di::Tuple<u32, RowGroup const&>;
156 auto iterate_row(u64 row) const {
157 auto [r, group] = find_row(row);
158 return group.iterate_row(r);
159 }
160
168 auto state_as_escape_sequences() const -> di::String;
169
170 void put_cell(di::StringView text, MultiCellInfo const& multi_cell_info, AutoWrapMode auto_wrap_mode,
171 bool explicitly_sized, bool complex_grapheme_cluster);
172
173private:
174 void put_single_cell(di::StringView text, MultiCellInfo const& multi_cell_info, AutoWrapMode auto_wrap_mode,
175 bool explicitly_sized, bool complex_grapheme_cluster);
176 void put_wide_cell(di::StringView text, MultiCellInfo const& multi_cell_info, AutoWrapMode auto_wrap_mode,
177 bool explicitly_sized, bool complex_grapheme_cluster);
178
179 // Row/column helper functions for dealing with origin mode.
180 auto translate_row(u32 row) const -> u32;
181 auto translate_col(u32 col) const -> u32;
182 auto min_row() const -> u32;
183 auto max_row_inclusive() const -> u32;
184 auto min_col() const -> u32;
185 auto max_col_inclusive() const -> u32;
186
187 auto cursor_in_scroll_region() const -> bool;
188
189 // Clamp the selection to be within bounds, after adding/removing rows from scrollback.
190 void clamp_selection();
191
192 // Clamp a selection point to only refer to actual cells (and the top-left of any multi cell).
193 // Also return the corresponding row information, for efficiency.
194 auto clamp_selection_point(SelectionPoint const& point) const -> di::Tuple<SelectionPoint, RowGroup const&, u32>;
195
196 // Invalidate a region of rows and cells, as specified by the selection region.
197 void invalidate_region(Selection const& region);
198
199 auto begin_row_iterator() { return rows().begin() + m_scroll_region.start_row; }
200 auto end_row_iterator() { return rows().begin() + m_scroll_region.end_row; }
201
202 auto rows() -> di::Ring<Row>& { return m_active_rows.rows(); }
203 auto rows() const -> di::Ring<Row> const& { return m_active_rows.rows(); }
204
205 // Screen state.
206 RowGroup m_active_rows;
207 bool m_whole_screen_dirty { true };
208
209 // Scroll back
210 ScrollBack m_scroll_back;
211 ScrollBackEnabled m_scroll_back_enabled { ScrollBackEnabled::No };
212 u64 m_visual_scroll_offset { 0 };
213 bool m_never_got_input { true };
214
215 // Visual selection
216 di::Optional<Selection> m_selection;
217
218 // Mutable state for writing cells.
219 Cursor m_cursor;
220 OriginMode m_origin_mode { OriginMode::Disabled };
221 u16 m_graphics_id { 0 };
222 u16 m_hyperlink_id { 0 };
223
224 // Terminal size information.
225 Size m_size {};
226 ScrollRegion m_scroll_region;
227};
228}
Represents a group of terminal rows.
Definition row_group.h:23
auto rows() -> di::Ring< Row > &
Definition row_group.h:31
auto max_width() const -> u32
Definition screen.h:76
BeginSelectionMode
Definition screen.h:142
void clear_row()
Definition screen.cpp:568
void clear_scroll_back()
Definition screen.cpp:1282
void delete_characters(u32 count)
Definition screen.cpp:415
void set_origin_mode(OriginMode mode)
Definition screen.cpp:228
void clear_row_before_cursor()
Definition screen.cpp:617
auto visual_scroll_offset() const -> u64
Definition screen.h:132
void begin_selection(SelectionPoint const &point, BeginSelectionMode mode)
Definition screen.cpp:1341
auto total_rows() const -> usize
Definition screen.h:128
auto find_row(u64 row) const -> di::Tuple< u32, RowGroup const & >
Definition screen.cpp:1501
void put_code_point(c32 code_point, AutoWrapMode auto_wrap_mode)
Definition screen.cpp:722
Screen(Size const &size, ScrollBackEnabled scroll_back_enabled)
Definition screen.cpp:23
auto max_height() const -> u32
Definition screen.h:75
auto absolute_row_start() const -> u64
Definition screen.h:125
void clear_damage_tracking()
Definition screen.cpp:1308
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:972
void set_cursor(u32 row, u32 col)
Definition screen.cpp:248
void insert_blank_lines(u32 count)
Definition screen.cpp:378
void set_cursor_row(u32 row)
Definition screen.cpp:276
auto in_selection(SelectionPoint const &point) const -> bool
Definition screen.cpp:1411
void clear()
Definition screen.cpp:506
void set_scroll_region(ScrollRegion const &region)
Definition screen.cpp:137
void erase_characters(u32 n)
Definition screen.cpp:641
auto scroll_region() const -> ScrollRegion const &
Definition screen.h:78
void set_cursor_col_relative(u32 col)
Definition screen.cpp:280
auto whole_screen_dirty() const -> bool
Definition screen.h:121
void set_cursor_col(u32 col)
Definition screen.cpp:284
void scroll_down()
Definition screen.cpp:684
void clear_after_cursor()
Definition screen.cpp:528
void set_current_graphics_rendition(GraphicsRendition const &rendition)
Definition screen.cpp:151
auto size() const -> Size const &
Definition screen.h:77
auto state_as_escape_sequences() const -> di::String
Serialize screen contents to terminal escape sequences.
Definition screen.cpp:1511
ScrollBackEnabled
Definition screen.h:68
auto current_graphics_rendition() const -> GraphicsRendition const &
Definition screen.cpp:143
void put_osc66(OSC66 const &sized_text, AutoWrapMode auto_wrap_mode)
Definition screen.cpp:901
void restore_cursor(SavedCursor const &cursor)
Definition screen.cpp:217
auto selected_text() const -> di::String
Definition screen.cpp:1451
void set_cursor_relative(u32 row, u32 col)
Definition screen.cpp:239
void delete_lines(u32 count)
Definition screen.cpp:466
auto absolute_row_screen_start() const -> u64
Definition screen.h:126
void resize(Size const &size)
Definition screen.cpp:28
auto absolute_row_end() const -> u64
Definition screen.h:127
void visual_scroll_up()
Definition screen.cpp:1287
void visual_scroll_down()
Definition screen.cpp:1294
auto selection() const -> di::Optional< Selection >
Definition screen.h:148
auto origin_mode() const -> OriginMode
Definition screen.h:87
void set_cursor_row_relative(u32 row)
Definition screen.cpp:272
void update_selection(SelectionPoint const &point)
Definition screen.cpp:1397
void set_current_hyperlink(di::Optional< Hyperlink const & > hyperlink)
Definition screen.cpp:179
void visual_scroll_to_bottom()
Definition screen.cpp:1301
void clear_selection()
Definition screen.cpp:1317
auto current_hyperlink() const -> di::Optional< Hyperlink const & >
Definition screen.cpp:147
void insert_blank_characters(u32 count)
Definition screen.cpp:316
auto visual_scroll_at_bottom() const -> bool
Definition screen.h:137
void clear_whole_screen_dirty_flag()
Definition screen.h:122
void clear_row_after_cursor()
Definition screen.cpp:583
void invalidate_all()
Definition screen.h:120
void clear_before_cursor()
Definition screen.cpp:545
auto iterate_row(u64 row) const
Definition screen.h:156
auto save_cursor() const -> SavedCursor
Definition screen.cpp:207
auto cursor() const -> Cursor
Definition screen.h:86
Definition capability.h:8
OriginMode
Whether or not origin mode (DEC mode 6) is enabled.
Definition screen.h:31
@ Disabled
Definition screen.h:32
AutoWrapMode
Whether or not auto-wrap (DEC mode 7) is enabled.
Definition screen.h:20
@ Enabled
Definition screen.h:22
@ Disabled
Definition screen.h:21
Definition graphics_rendition.h:114
Definition size.h:7
Represents the current cursor position of the terminal.
Definition cursor.h:8
Shared information for cells linked via text sizing protocol (OSC 66) or double width characters.
Definition multi_cell_info.h:8
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:40
u32 col
Column (x coordinate)
Definition screen.h:42
bool overflow_pending
Signals that the previous text outputted reached the end of a row.
Definition screen.h:43
constexpr friend auto tag_invoke(di::Tag< di::reflect >, di::InPlaceType< SavedCursor >)
Definition screen.h:50
u32 row
Row (y coordinate)
Definition screen.h:41
auto operator<=>(SavedCursor const &) const =default
GraphicsRendition graphics_rendition
Active graphics rendition.
Definition screen.h:44
auto operator==(SavedCursor const &) const -> bool=default
OriginMode origin_mode
Origin mode.
Definition screen.h:45
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 a coordinate of a visual selection.
Definition selection.h:12
Represents the visual selection of a terminal.
Definition selection.h:26