diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Fl_Simple_Terminal.cxx | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/src/Fl_Simple_Terminal.cxx b/src/Fl_Simple_Terminal.cxx index 680b157dd..3f7ade3eb 100644 --- a/src/Fl_Simple_Terminal.cxx +++ b/src/Fl_Simple_Terminal.cxx @@ -287,7 +287,6 @@ void Fl_Simple_Terminal::vscroll_cb(Fl_Widget *w, void *data) { Fl_Simple_Terminal::Fl_Simple_Terminal(int X,int Y,int W,int H,const char *l) : Fl_Text_Display(X,Y,W,H,l) { history_lines_ = 500; // something 'reasonable' stay_at_bottom_ = true; - ansi_ = false; lines_ = 0; // note: lines!=mNBufferLines when lines are wrapping scrollaway_ = false; scrolling_ = false; @@ -312,6 +311,9 @@ Fl_Simple_Terminal::Fl_Simple_Terminal(int X,int Y,int W,int H,const char *l) : normal_style_index_ = builtin_normal_index; current_style_index_ = builtin_normal_index; current_style_ = 'A' + 0; + // ANSI escape seq + ansi_ = false; + ansi_show_unknown_ = false; // Intercept vertical scrolling orig_vscroll_cb_ = mVScrollBar->callback(); orig_vscroll_data_ = mVScrollBar->user_data(); @@ -471,6 +473,23 @@ void Fl_Simple_Terminal::ansi(bool val) { } /** + See if we should show unknown ANSI sequences with '¿' or not. + \see ansi_show_unknown(bool) +*/ +bool Fl_Simple_Terminal::ansi_show_unknown(void) const { + return ansi_show_unknown_; +} + +/** + Enable showing unknown ESC sequences with the '¿' character. + By default this is off, and unknown escape sequences are silently ignored. + \see ansi_show_unknown() +*/ +void Fl_Simple_Terminal::ansi_show_unknown(bool val) { + ansi_show_unknown_ = val; +} + +/** Return the current style table being used. This is the value last passed as the 1st argument to @@ -760,6 +779,16 @@ void Fl_Simple_Terminal::handle_backspace() { backspace_buffer(1); } +// Handle unknown esc sequences +void Fl_Simple_Terminal::unknown_escape() { + if ( ansi_show_unknown() ) { + for ( const char *s = "¿"; *s; s++ ) { + *ntp_++ = *s; // emit utf-8 encoded char + *nsp_++ = current_style(); // use current style + } + } +} + /** Handle appending string with ANSI escape sequences, and other 'special' character processing (such as backspaces). @@ -782,6 +811,7 @@ void Fl_Simple_Terminal::append_ansi(const char *s, int len) { if ( escseq.parse_in_progress() ) { // ESC sequence in progress? switch ( escseq.parse(*sp) ) { // parse until completed or fail case Fl_Escape_Seq::fail: // parsing error? + unknown_escape(); escseq.reset(); // ..reset and continue ++sp; continue; @@ -801,10 +831,10 @@ void Fl_Simple_Terminal::append_ansi(const char *s, int len) { case 'J': // ESC[#J switch (val) { case 0: // ESC[0J -- clear to eol - // unsupported + unknown_escape(); break; case 1: // ESC[1J -- clear to sol - // unsupported + unknown_escape(); break; case 2: // ESC[2J -- clear visible screen // NOTE: Currently we clear the /entire screen history/, and @@ -817,6 +847,9 @@ void Fl_Simple_Terminal::append_ansi(const char *s, int len) { ntp_ = ntm_; // clear text contents accumulated so far nsp_ = nsm_; // clear style contents "" break; + default: // all other ESC[#J unsupported + unknown_escape(); + break; } break; // SELECT GRAPHIC RENDITION (SGR) @@ -831,6 +864,7 @@ void Fl_Simple_Terminal::append_ansi(const char *s, int len) { break; // UNSUPPORTED MODES default: + unknown_escape(); break; // unsupported } } |
