Hi, On Sun, Apr 27, 2014 at 11:37:42AM +0200, Roberto E. Vargas Caballero wrote: > From http://www.vt100.net/docs/vt510-rm/chapter4: > > *The VT510 ignores all following characters until it receives a > SUB, ST, or any other C1 control character. > > So OSC, PM and APC sequence ends with a SUB (it cancels the sequence > and show a question mark as error), ST or any another C1 (8 bits) > code, or their C0 (7 bits) equivalent sequences (at this moment we > do not handle C1 codes, but we should). But it is also said that: > > Cancel CAN > 1/8 Immediately cancels an escape sequence, control sequence, > or device control string in progress. In this case, the > VT510 does not display any error character. > > Escape ESC > 1/11 Introduces an escape sequence. ESC also cancels any escape > sequence, control sequence, or device control string in > progress. > --- > st.c | 206 > +++++++++++++++++++++++++++++++++++++++++-------------------------- > 1 file changed, 127 insertions(+), 79 deletions(-) > > diff --git a/st.c b/st.c > index 49df792..124c047 100644 > --- a/st.c > +++ b/st.c > @@ -2340,58 +2354,135 @@ tselcs(void) { > ATTR_GFX); > } > > +bool > +tcontrolcode(uchar ascii) { > + static char question[UTF_SIZ] = "?"; > + > + switch(ascii) { > + case '\t': /* HT */ > + tputtab(1); > + break; > + case '\b': /* BS */ > + tmoveto(term.c.x-1, term.c.y); > + break; > + case '\r': /* CR */ > + tmoveto(0, term.c.y); > + break; > + case '\f': /* LF */ > + case '\v': /* VT */ > + case '\n': /* LF */ > + /* go to first col if the mode is set */ > + tnewline(IS_SET(MODE_CRLF)); > + break; > + case '\a': /* BEL */ > + if(term.esc & ESC_STR_END) { > + /* backwards compatibility to xterm */ > + strhandle(); > + } else { > + if(!(xw.state & WIN_FOCUSED)) > + xseturgency(1); > + if (bellvolume) > + XBell(xw.dpy, bellvolume); > + } > + break; > + case '\033': /* ESC */ > + csireset(); > + term.esc &= ~(ESC_CSI|ESC_ALTCHARSET|ESC_TEST); > + term.esc |= ESC_START; > + return 1; > + case '\016': /* SO */ > + term.charset = 0; > + tselcs(); > + break; > + case '\017': /* SI */ > + term.charset = 1; > + tselcs(); > + break; > + case '\032': /* SUB */ > + tsetchar(question, &term.c.attr, term.c.x, term.c.y); > + case '\030': /* CAN */ > + csireset(); > + break; > + case '\005': /* ENQ (IGNORED) */ > + case '\000': /* NUL (IGNORED) */ > + case '\021': /* XON (IGNORED) */ > + case '\023': /* XOFF (IGNORED) */ > + case 0177: /* DEL (IGNORED) */ > + case 0x84: /* TODO: IND */ > + case 0x85: /* TODO: NEL */ > + case 0x88: /* TODO: HTS */ > + case 0x8d: /* TODO: RI */ > + case 0x8e: /* TODO: SS2 */ > + case 0x8f: /* TODO: SS3 */ > + case 0x90: /* TODO: DCS */ > + case 0x98: /* TODO: SOS */ > + case 0x9a: /* TODO: DECID */ > + case 0x9b: /* TODO: CSI */ > + case 0x9c: /* TODO: ST */ > + case 0x9d: /* TODO: OSC */ > + case 0x9e: /* TODO: PM */ > + case 0x9f: /* TODO: APC */ > + break; > + default: > + return 0; > + } > + term.esc &= ~(ESC_STR_END|ESC_STR);
Shouldn’t these flags be cleared only on SUB, CAN, ST, C1s and \a ? -- Ivan "Colona" Delalande
