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
> _AT_@ -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
Received on Wed May 07 2014 - 10:33:56 CEST