|  |  | @ -51,7 +51,6 @@ enum term_mode { | 
			
		
	
		
			
				
					|  |  |  | MODE_ECHO        = 1 << 4, | 
			
		
	
		
			
				
					|  |  |  | MODE_PRINT       = 1 << 5, | 
			
		
	
		
			
				
					|  |  |  | MODE_UTF8        = 1 << 6, | 
			
		
	
		
			
				
					|  |  |  | MODE_SIXEL       = 1 << 7, | 
			
		
	
		
			
				
					|  |  |  | }; | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | enum cursor_movement { | 
			
		
	
	
		
			
				
					|  |  | @ -78,12 +77,11 @@ enum charset { | 
			
		
	
		
			
				
					|  |  |  | enum escape_state { | 
			
		
	
		
			
				
					|  |  |  | ESC_START      = 1, | 
			
		
	
		
			
				
					|  |  |  | ESC_CSI        = 2, | 
			
		
	
		
			
				
					|  |  |  | ESC_STR        = 4,  /* OSC, PM, APC */ | 
			
		
	
		
			
				
					|  |  |  | ESC_STR        = 4,  /* DCS, OSC, PM, APC */ | 
			
		
	
		
			
				
					|  |  |  | ESC_ALTCHARSET = 8, | 
			
		
	
		
			
				
					|  |  |  | ESC_STR_END    = 16, /* a final string was encountered */ | 
			
		
	
		
			
				
					|  |  |  | ESC_TEST       = 32, /* Enter in test mode */ | 
			
		
	
		
			
				
					|  |  |  | ESC_UTF8       = 64, | 
			
		
	
		
			
				
					|  |  |  | ESC_DCS        =128, | 
			
		
	
		
			
				
					|  |  |  | }; | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | typedef struct { | 
			
		
	
	
		
			
				
					|  |  | @ -2090,12 +2088,9 @@ tdectest(char c) | 
			
		
	
		
			
				
					|  |  |  | void | 
			
		
	
		
			
				
					|  |  |  | tstrsequence(uchar c) | 
			
		
	
		
			
				
					|  |  |  | { | 
			
		
	
		
			
				
					|  |  |  | strreset(); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | switch (c) { | 
			
		
	
		
			
				
					|  |  |  | case 0x90:   /* DCS -- Device Control String */ | 
			
		
	
		
			
				
					|  |  |  | c = 'P'; | 
			
		
	
		
			
				
					|  |  |  | term.esc |= ESC_DCS; | 
			
		
	
		
			
				
					|  |  |  | break; | 
			
		
	
		
			
				
					|  |  |  | case 0x9f:   /* APC -- Application Program Command */ | 
			
		
	
		
			
				
					|  |  |  | c = '_'; | 
			
		
	
	
		
			
				
					|  |  | @ -2107,6 +2102,7 @@ tstrsequence(uchar c) | 
			
		
	
		
			
				
					|  |  |  | c = ']'; | 
			
		
	
		
			
				
					|  |  |  | break; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | strreset(); | 
			
		
	
		
			
				
					|  |  |  | strescseq.type = c; | 
			
		
	
		
			
				
					|  |  |  | term.esc |= ESC_STR; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
	
		
			
				
					|  |  | @ -2304,7 +2300,7 @@ tputc(Rune u) | 
			
		
	
		
			
				
					|  |  |  | Glyph *gp; | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | control = ISCONTROL(u); | 
			
		
	
		
			
				
					|  |  |  | if (u < 127 || !IS_SET(MODE_UTF8 | MODE_SIXEL)) { | 
			
		
	
		
			
				
					|  |  |  | if (u < 127 || !IS_SET(MODE_UTF8)) { | 
			
		
	
		
			
				
					|  |  |  | c[0] = u; | 
			
		
	
		
			
				
					|  |  |  | width = len = 1; | 
			
		
	
		
			
				
					|  |  |  | } else { | 
			
		
	
	
		
			
				
					|  |  | @ -2325,23 +2321,11 @@ tputc(Rune u) | 
			
		
	
		
			
				
					|  |  |  | if (term.esc & ESC_STR) { | 
			
		
	
		
			
				
					|  |  |  | if (u == '\a' || u == 030 || u == 032 || u == 033 || | 
			
		
	
		
			
				
					|  |  |  | ISCONTROLC1(u)) { | 
			
		
	
		
			
				
					|  |  |  | term.esc &= ~(ESC_START|ESC_STR|ESC_DCS); | 
			
		
	
		
			
				
					|  |  |  | if (IS_SET(MODE_SIXEL)) { | 
			
		
	
		
			
				
					|  |  |  | /* TODO: render sixel */; | 
			
		
	
		
			
				
					|  |  |  | term.mode &= ~MODE_SIXEL; | 
			
		
	
		
			
				
					|  |  |  | return; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | term.esc &= ~(ESC_START|ESC_STR); | 
			
		
	
		
			
				
					|  |  |  | term.esc |= ESC_STR_END; | 
			
		
	
		
			
				
					|  |  |  | goto check_control_code; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | if (IS_SET(MODE_SIXEL)) { | 
			
		
	
		
			
				
					|  |  |  | /* TODO: implement sixel mode */ | 
			
		
	
		
			
				
					|  |  |  | return; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | if (term.esc&ESC_DCS && strescseq.len == 0 && u == 'q') | 
			
		
	
		
			
				
					|  |  |  | term.mode |= MODE_SIXEL; | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | if (strescseq.len+len >= strescseq.siz) { | 
			
		
	
		
			
				
					|  |  |  | /* | 
			
		
	
		
			
				
					|  |  |  | * Here is a bug in terminals. If the user never sends | 
			
		
	
	
		
			
				
					|  |  | @ -2453,7 +2437,7 @@ twrite(const char *buf, int buflen, int show_ctrl) | 
			
		
	
		
			
				
					|  |  |  | int n; | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | for (n = 0; n < buflen; n += charsize) { | 
			
		
	
		
			
				
					|  |  |  | if (IS_SET(MODE_UTF8) && !IS_SET(MODE_SIXEL)) { | 
			
		
	
		
			
				
					|  |  |  | if (IS_SET(MODE_UTF8)) { | 
			
		
	
		
			
				
					|  |  |  | /* process a complete utf8 char */ | 
			
		
	
		
			
				
					|  |  |  | charsize = utf8decode(buf + n, &u, buflen - n); | 
			
		
	
		
			
				
					|  |  |  | if (charsize == 0) | 
			
		
	
	
		
			
				
					|  |  | 
 |