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:
		
							parent
							
								
									a7d7e29300
								
							
						
					
					
						commit
						3af49e34f6
					
				
							
								
								
									
										68
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										68
									
								
								st.c
									
									
									
									
									
								
							| @ -1668,6 +1668,32 @@ tputc(char *c, int len) { | |||||||
| 	if(iofd != -1) | 	if(iofd != -1) | ||||||
| 		write(iofd, c, len); | 		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_START) { | ||||||
| 		if(term.esc & ESC_CSI) { | 		if(term.esc & ESC_CSI) { | ||||||
| 			csiescseq.buf[csiescseq.len++] = ascii; | 			csiescseq.buf[csiescseq.len++] = ascii; | ||||||
| @ -1791,40 +1817,14 @@ tputc(char *c, int len) { | |||||||
| 	} else { | 	} else { | ||||||
| 		if(sel.bx != -1 && BETWEEN(term.c.y, sel.by, sel.ey)) | 		if(sel.bx != -1 && BETWEEN(term.c.y, sel.by, sel.ey)) | ||||||
| 			sel.bx = -1; | 			sel.bx = -1; | ||||||
| 		switch(ascii) { | 		if(ascii >= '\020' || term.c.attr.mode & ATTR_GFX) { | ||||||
| 		case '\t': | 			if(IS_SET(MODE_WRAP) && term.c.state & CURSOR_WRAPNEXT) | ||||||
| 			tputtab(1); | 				tnewline(1); /* always go to first col */ | ||||||
| 			break; | 			tsetchar(c); | ||||||
| 		case '\b': | 			if(term.c.x+1 < term.col) | ||||||
| 			tmoveto(term.c.x-1, term.c.y); | 				tmoveto(term.c.x+1, term.c.y); | ||||||
| 			break; | 			else | ||||||
| 		case '\r': | 				term.c.state |= CURSOR_WRAPNEXT; | ||||||
| 			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 */ |  | ||||||
| 				tsetchar(c); |  | ||||||
| 				if(term.c.x+1 < term.col) |  | ||||||
| 					tmoveto(term.c.x+1, term.c.y); |  | ||||||
| 				else |  | ||||||
| 					term.c.state |= CURSOR_WRAPNEXT; |  | ||||||
| 			} |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user