Allow control characters inside escape sequences
Taken from vt100 manual programmer: Control characters (codes \0 to \37 inclusive) are specifically excluded from the control sequence syntax, but may be embedded within a control sequence. Embedded control characters are executed as soon as they are encountered by the VT100. The processing of the control sequence then continues with the next character received. --- st.c | 68 +++++++++++++++++++++++++++++++++--------------------------------- 1 file changed, 34 insertions(+), 34 deletions(-)
This commit is contained in:
		
							
								
								
									
										52
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										52
									
								
								st.c
									
									
									
									
									
								
							@ -1668,6 +1668,32 @@ tputc(char *c, int len) {
 | 
			
		||||
	if(iofd != -1)
 | 
			
		||||
		write(iofd, c, len);
 | 
			
		||||
 | 
			
		||||
	switch(ascii) {
 | 
			
		||||
	case '\t':
 | 
			
		||||
		tputtab(1);
 | 
			
		||||
		return;
 | 
			
		||||
	case '\b':
 | 
			
		||||
		tmoveto(term.c.x-1, term.c.y);
 | 
			
		||||
		return;
 | 
			
		||||
	case '\r':
 | 
			
		||||
		tmoveto(0, term.c.y);
 | 
			
		||||
		return;
 | 
			
		||||
	case '\f':
 | 
			
		||||
	case '\v':
 | 
			
		||||
	case '\n':
 | 
			
		||||
		/* go to first col if the mode is set */
 | 
			
		||||
		tnewline(IS_SET(MODE_CRLF));
 | 
			
		||||
		return;
 | 
			
		||||
	case '\a':
 | 
			
		||||
		if(!(xw.state & WIN_FOCUSED))
 | 
			
		||||
			xseturgency(1);
 | 
			
		||||
		return;
 | 
			
		||||
	case '\033':
 | 
			
		||||
		csireset();
 | 
			
		||||
		term.esc = ESC_START;
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(term.esc & ESC_START) {
 | 
			
		||||
		if(term.esc & ESC_CSI) {
 | 
			
		||||
			csiescseq.buf[csiescseq.len++] = ascii;
 | 
			
		||||
@ -1791,31 +1817,6 @@ tputc(char *c, int len) {
 | 
			
		||||
	} else {
 | 
			
		||||
		if(sel.bx != -1 && BETWEEN(term.c.y, sel.by, sel.ey))
 | 
			
		||||
			sel.bx = -1;
 | 
			
		||||
		switch(ascii) {
 | 
			
		||||
		case '\t':
 | 
			
		||||
			tputtab(1);
 | 
			
		||||
			break;
 | 
			
		||||
		case '\b':
 | 
			
		||||
			tmoveto(term.c.x-1, term.c.y);
 | 
			
		||||
			break;
 | 
			
		||||
		case '\r':
 | 
			
		||||
			tmoveto(0, term.c.y);
 | 
			
		||||
			break;
 | 
			
		||||
		case '\f':
 | 
			
		||||
		case '\v':
 | 
			
		||||
		case '\n':
 | 
			
		||||
			/* go to first col if the mode is set */
 | 
			
		||||
			tnewline(IS_SET(MODE_CRLF));
 | 
			
		||||
			break;
 | 
			
		||||
		case '\a':
 | 
			
		||||
			if(!(xw.state & WIN_FOCUSED))
 | 
			
		||||
				xseturgency(1);
 | 
			
		||||
			break;
 | 
			
		||||
		case '\033':
 | 
			
		||||
			csireset();
 | 
			
		||||
			term.esc = ESC_START;
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
		if(ascii >= '\020' || term.c.attr.mode & ATTR_GFX) {
 | 
			
		||||
			if(IS_SET(MODE_WRAP) && term.c.state & CURSOR_WRAPNEXT)
 | 
			
		||||
				tnewline(1); /* always go to first col */
 | 
			
		||||
@ -1826,7 +1827,6 @@ tputc(char *c, int len) {
 | 
			
		||||
				term.c.state |= CURSOR_WRAPNEXT;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user