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