Fl_Terminal doc fixes, private->protected for utf8_char_at_*()

This commit is contained in:
Greg Ercolano
2025-05-09 09:43:10 -07:00
parent b21b7feaaa
commit 469249f91a
3 changed files with 52 additions and 17 deletions
+2
View File
@@ -1012,8 +1012,10 @@ private:
void display_modified(void); void display_modified(void);
void display_modified_clear(void); void display_modified_clear(void);
void clear_char_at_disp(int drow, int dcol); void clear_char_at_disp(int drow, int dcol);
protected:
const Utf8Char* utf8_char_at_disp(int drow, int dcol) const; const Utf8Char* utf8_char_at_disp(int drow, int dcol) const;
const Utf8Char* utf8_char_at_glob(int grow, int gcol) const; const Utf8Char* utf8_char_at_glob(int grow, int gcol) const;
private:
void repeat_char(char c, int rep); void repeat_char(char c, int rep);
void utf8_cache_clear(void); void utf8_cache_clear(void);
void utf8_cache_flush(void); void utf8_cache_flush(void);
+4 -4
View File
@@ -194,10 +194,10 @@ into the history, all without moving memory around.
In fact the only time screen memory is moved around is during these infrequent In fact the only time screen memory is moved around is during these infrequent
operations: operations:
- during scrolling "down" - during "scroll down" escape sequences, e.g. ESC[\#T
- character insert/delete operations within a line - character insert/delete operations within a line, e.g. ESC[\#@, ESC[\#P
- changing the display size - changing the display size e.g. Fl_Terminal::resize()
- changing the history size - changing the history size e.g. Fl_Terminal::history_lines()
So a class "RingBuffer" is defined to manage the ring, and accessing its various So a class "RingBuffer" is defined to manage the ring, and accessing its various
parts, either as the entire entity ring, just the history, or just the display. parts, either as the entire entity ring, just the history, or just the display.
+46 -13
View File
@@ -911,8 +911,8 @@ void Fl_Terminal::RingBuffer::scroll(int rows, const CharStyle& style) {
// //
// Example: // Example:
// // Walk ALL rows in the ring buffer.. // // Walk ALL rows in the ring buffer..
// for (int row=0; row<ring.rows(); row++) { // for (int row=0; row<ring_rows(); row++) {
// Utf8Char *u8c = ring.u8c_ring_row(row); // Utf8Char *u8c = u8c_ring_row(row);
// .. // ..
// } // }
// //
@@ -925,7 +925,7 @@ const Fl_Terminal::Utf8Char* Fl_Terminal::RingBuffer::u8c_ring_row(int row) cons
// Return UTF-8 char for beginning of 'row' in the history buffer. // Return UTF-8 char for beginning of 'row' in the history buffer.
// Example: // Example:
// // Walk ALL rows in history.. // // Walk ALL rows in history..
// for (int hrow=0; hrow<ring.hrows(); hrow++) { // for (int hrow=0; hrow<hist_rows(); hrow++) {
// Utf8Char *u8c = u8c_hist_row(hrow); // Utf8Char *u8c = u8c_hist_row(hrow);
// .. // ..
// } // }
@@ -940,7 +940,7 @@ const Fl_Terminal::Utf8Char* Fl_Terminal::RingBuffer::u8c_hist_row(int hrow) con
// Special case to walk the "in use" rows of the history // Special case to walk the "in use" rows of the history
// Example: // Example:
// // Walk the "in use" rows of history.. // // Walk the "in use" rows of history..
// for (int hrow=0; hrow<ring.hist_use(); hrow++) { // for (int hrow=0; hrow<hist_use(); hrow++) {
// Utf8Char *u8c = u8c_hist_use_row(hrow); // Utf8Char *u8c = u8c_hist_use_row(hrow);
// .. // ..
// } // }
@@ -957,7 +957,7 @@ const Fl_Terminal::Utf8Char* Fl_Terminal::RingBuffer::u8c_hist_use_row(int hurow
// Return UTF-8 char for beginning of 'row' in the display buffer // Return UTF-8 char for beginning of 'row' in the display buffer
// Example: // Example:
// // Walk ALL rows in display.. // // Walk ALL rows in display..
// for (int drow=0; drow<ring.drows(); drow++) { // for (int drow=0; drow<disp_rows(); drow++) {
// Utf8Char *u8c = u8c_disp_row(drow); // Utf8Char *u8c = u8c_disp_row(drow);
// .. // ..
// } // }
@@ -975,8 +975,8 @@ const Fl_Terminal::Utf8Char* Fl_Terminal::RingBuffer::u8c_disp_row(int drow) con
// Scrolling offset is NOT applied; this is raw access to the ring's rows. // Scrolling offset is NOT applied; this is raw access to the ring's rows.
// Example: // Example:
// // Walk ALL rows in the ring buffer.. // // Walk ALL rows in the ring buffer..
// for (int row=0; row<ring.rows(); row++) { // for (int row=0; row<ring_rows(); row++) {
// Utf8Char *u8c = ring.u8c_ring_row(row); // Utf8Char *u8c = u8c_ring_row(row);
// .. // ..
// } // }
// //
@@ -992,7 +992,7 @@ Fl_Terminal::Utf8Char* Fl_Terminal::RingBuffer::u8c_hist_use_row(int hurow)
// Return UTF-8 char for beginning of 'row' in the display buffer // Return UTF-8 char for beginning of 'row' in the display buffer
// Example: // Example:
// // Walk ALL rows in display.. // // Walk ALL rows in display..
// for (int drow=0; drow<ring.drows(); drow++) { // for (int drow=0; drow<disp_rows(); drow++) {
// Utf8Char *u8c = u8c_disp_row(drow); // Utf8Char *u8c = u8c_disp_row(drow);
// .. // ..
// } // }
@@ -1081,10 +1081,15 @@ const Fl_Terminal::Utf8Char* Fl_Terminal::u8c_disp_row(int drow) const
Example: Example:
\code \code
// Walk ALL rows and cols in the ring buffer.. // Walk ALL rows and cols in the raw ring buffer..
for (int row=0; row<ring.rows(); row++) { // These will not necessarily be in order as they appear
Utf8Char *u8c = ring.u8c_ring_row(row); // on-screen.
for (int col=0; col<ring.cols(); col++,u8c++) { // For walking the terminal lines in order, see examples
// for u8c_hist_use_row() and u8c_disp_row().
//
for (int row=0; row<ring_rows(); row++) {
Utf8Char *u8c = u8c_ring_row(row);
for (int col=0; col<ring_cols(); col++,u8c++) {
..make use of u8c->xxx() methods.. ..make use of u8c->xxx() methods..
} }
} }
@@ -1111,6 +1116,19 @@ Fl_Terminal::Utf8Char* Fl_Terminal::u8c_hist_row(int hrow)
aren't many (or any) rows in the history buffer that have been aren't many (or any) rows in the history buffer that have been
populated with scrollback text yet. populated with scrollback text yet.
Example to walk all "in use" lines of the history buffer:
\code
// Walk the entire screen history ("in use") and display to stdout
for (int row=0; row<hist_use(); row++) {
const Utf8Char *u8c = u8c_hist_use_row(row); // first char in row
for (int col=0; col<=hist_cols(); col++,u8c++) { // walk columns left-to-right
// ..Do things here with each u8c char..
::printf("%.*s", u8c->length(), u8c->text_utf8()); // show each utf8 char to stdout
}
::printf("\n"); // end of each line
}
\endcode
\see u8c_disp_row(int) for example use. \see u8c_disp_row(int) for example use.
*/ */
Fl_Terminal::Utf8Char* Fl_Terminal::u8c_hist_use_row(int hurow) Fl_Terminal::Utf8Char* Fl_Terminal::u8c_hist_use_row(int hurow)
@@ -1130,6 +1148,21 @@ Fl_Terminal::Utf8Char* Fl_Terminal::u8c_hist_use_row(int hurow)
::printf("<%.*s>", len, text); // print potentially multibyte char ::printf("<%.*s>", len, text); // print potentially multibyte char
} }
\endcode \endcode
- This can also be used to walk all rows on the display screen up to the cursor row, e.g.
\code
// Write all chars in display up to cursor row to stdout
for (int row=0; row<disp_rows() && row<=cursor_row(); row++) {
const Utf8Char *u8c = u8c_disp_row(row); // first char in row
for (int col=0; col<=display_cols(); col++,u8c++) { // walk columns left-to-right
// ..Do things here with each u8c char..
::printf("%.*s", u8c->text_utf8(), u8c->length()); // write each utf8 char to stdout
}
::printf("\n");
}
\endcode
\see u8c_hist_use_row() for examples of walking the screen history
*/ */
Fl_Terminal::Utf8Char* Fl_Terminal::u8c_disp_row(int drow) Fl_Terminal::Utf8Char* Fl_Terminal::u8c_disp_row(int drow)
{ return const_cast<Utf8Char*>(const_cast<const Fl_Terminal*>(this)->u8c_disp_row(drow)); } { return const_cast<Utf8Char*>(const_cast<const Fl_Terminal*>(this)->u8c_disp_row(drow)); }
@@ -3925,7 +3958,7 @@ int Fl_Terminal::handle(int e) {
/** /**
Return a string copy of all lines in the terminal (including history). Return a string copy of all lines in the terminal (including history).
The returned string is allocated with strdup(3), which the caller must free. The returned string is allocated with `strdup(3)`, which the caller must `free(3)`.
If \p 'lines_below_cursor' is false (default), lines below the cursor on down If \p 'lines_below_cursor' is false (default), lines below the cursor on down
to the bottom of the display are ignored, and not included in the returned string. to the bottom of the display are ignored, and not included in the returned string.