I think this patch to fbterm could fix it. It's based off http://deb.debian.org/debian/pool/main/f/fbterm/fbterm_1.7.orig.tar.gz
Upstream doesn't seem active so I don't know where to send it to. There seems to be an unrelated problem, seen on my machine with the version of fbterm I compiled to test this patch: cursor movement in fish does not work. But that problem does not exist in the fbterm (1.7) installed from my package manager. That's why I think the patch might be enough. diff --git a/src/lib/vterm.cpp b/src/lib/vterm.cpp index 3a5dcc7..39d261e 100644 --- a/src/lib/vterm.cpp +++ b/src/lib/vterm.cpp @@ -407,7 +407,35 @@ void VTerm::input(const u8 *buf, u32 count) continue; } - do_control_char(); + if (esc_state == VTerm::ES_CSI_Init || esc_state == VTerm::ES_CSI_Parameters || esc_state == VTerm::ES_CSI_Intermediate) { + if (esc_state == VTerm::ES_CSI_Init) + { + this->clear_param(); + esc_state = VTerm::ES_CSI_Parameters; + } + if (tc >= 0x40 && tc <= 0x7e) + esc_state = ESnormal; + else if (tc >= 0x20 && tc <= 0x2f) + esc_state = ES_CSI_Intermediate; + } else if (esc_state == VTerm::ES_OSC_Init || esc_state == VTerm::ES_OSC) { + if (esc_state == VTerm::ES_OSC_Init) { + this->clear_param(); + esc_state = VTerm::ES_OSC; + } + if (tc == 0x07) + esc_state = ESnormal; + if (esc_state == ES_OSC_Maybe_ST) + { + if (tc == '\\') + esc_state = ESnormal; + else + esc_state = ES_OSC; + } + if (tc == 0x1b) + esc_state = ES_OSC_Maybe_ST; + } else { + do_control_char(); + } } update(); diff --git a/src/lib/vterm.h b/src/lib/vterm.h index 32ffd2a..cdc4bb6 100644 --- a/src/lib/vterm.h +++ b/src/lib/vterm.h @@ -185,7 +185,10 @@ private: static bool init_ambiguous_wide(); typedef enum { - ESnormal = 0, ESesc, ESsquare, ESnonstd, ESpercent, EScharset, EShash, ESfunckey, ESkeep + ESnormal = 0, ESesc, ESsquare, ESnonstd, + ESpercent, EScharset, EShash, ESfunckey, ESkeep, + ES_CSI_Init, ES_CSI_Parameters, ES_CSI_Intermediate, + ES_OSC_Init, ES_OSC, ES_OSC_Maybe_ST, } EscapeState; EscapeState esc_state; diff --git a/src/lib/vterm_states.cpp b/src/lib/vterm_states.cpp index 1881490..3bcfcc8 100644 --- a/src/lib/vterm_states.cpp +++ b/src/lib/vterm_states.cpp @@ -49,8 +49,8 @@ const VTerm::Sequence VTerm::escape_sequences[] = { { static_cast<u16>(-1) }, // ESesc - { '[', &VTerm::clear_param, ESsquare }, - { ']', &VTerm::clear_param, ESnonstd }, + { '[', 0, ES_CSI_Init }, + { ']', 0, ES_OSC_Init }, { '%', 0, ESpercent }, { '#', 0, EShash }, { '(', &VTerm::current_is_g0, EScharset },