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

Reply via email to