@ -138,6 +138,7 @@ enum term_mode {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						MODE_BRCKTPASTE   =  1  < <  19 ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						MODE_PRINT        =  1  < <  20 ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						MODE_UTF8         =  1  < <  21 ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						MODE_SIXEL        =  1  < <  22 ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						MODE_MOUSE        =  MODE_MOUSEBTN | MODE_MOUSEMOTION | MODE_MOUSEX10 \   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						                  | MODE_MOUSEMANY ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					} ;  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -155,11 +156,12 @@ enum charset {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					enum  escape_state  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						ESC_START       =  1 ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						ESC_CSI         =  2 ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						ESC_STR         =  4 ,   /* DCS,  OSC, PM, APC */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						ESC_STR         =  4 ,   /* 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 ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					} ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					enum  window_state  {  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -1485,7 +1487,7 @@ ttyread(void)  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						ptr  =  buf ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						for  ( ; ; )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							if  ( IS_SET ( MODE_UTF8 ) )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							if  ( IS_SET ( MODE_UTF8 )  & &  ! IS_SET ( MODE_SIXEL )  )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								/* process a complete utf8 char */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								charsize  =  utf8decode ( ptr ,  & unicodep ,  buflen ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								if  ( charsize  = =  0 )   
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -1578,7 +1580,7 @@ ttysend(char *s, size_t n)  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						lim  =  & s [ n ] ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						for  ( t  =  s ;  t  <  lim ;  t  + =  len )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							if  ( IS_SET ( MODE_UTF8 ) )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							if  ( IS_SET ( MODE_UTF8 )  & &  ! IS_SET ( MODE_SIXEL )  )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								len  =  utf8decode ( t ,  & u ,  n ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							}  else  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								u  =  * t  &  0xFF ;   
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -2548,6 +2550,7 @@ strhandle(void)  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							xsettitle ( strescseq . args [ 0 ] ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							return ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						case  ' P ' :  /* DCS -- Device Control String */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							term . mode  | =  ESC_DCS ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						case  ' _ ' :  /* APC -- Application Program Command */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						case  ' ^ ' :  /* PM -- Privacy Message */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							return ;   
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -2754,9 +2757,12 @@ 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  =  ' _ ' ;   
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -2768,7 +2774,6 @@ tstrsequence(uchar c)  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							c  =  ' ] ' ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						strreset ( ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						strescseq . type  =  c ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						term . esc  | =  ESC_STR ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					}  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -2968,7 +2973,7 @@ tputc(Rune u)  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						Glyph  * gp ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						control  =  ISCONTROL ( u ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						if  ( ! IS_SET ( MODE_UTF8 ) )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						if  ( ! IS_SET ( MODE_UTF8 )  & &  ! IS_SET ( MODE_SIXEL )  )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							c [ 0 ]  =  u ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							width  =  len  =  1 ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						}  else  {   
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -2991,30 +2996,47 @@ 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 ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								term . esc  & =  ~ ( ESC_START | ESC_STR | ESC_DCS ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								if  ( IS_SET ( MODE_SIXEL ) )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									/* TODO: render sixel */ ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									term . mode  & =  ~ MODE_SIXEL ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									return ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								term . esc  | =  ESC_STR_END ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							}  else  if  ( strescseq . len  +  len  <  sizeof ( strescseq . buf )  -  1 )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								memmove ( & strescseq . buf [ strescseq . len ] ,  c ,  len ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								strescseq . len  + =  len ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								goto  check_control_code ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							if  ( IS_SET ( MODE_SIXEL ) )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								/* TODO: implement sixel mode */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								return ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							}  else  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							/*   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							 *  Here  is  a  bug  in  terminals .  If  the  user  never  sends   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							 *  some  code  to  stop  the  str  or  esc  command ,  then  st   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							 *  will  stop  responding .  But  this  is  better  than   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							 *  silently  failing  with  unknown  characters .  At  least   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							 *  then  users  will  report  back .   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							 *   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							 *  In  the  case  users  ever  get  fixed ,  here  is  the  code :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							 */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							/*   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							 *  term . esc  =  0 ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							 *  strhandle ( ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							 */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							if  ( term . esc & ESC_DCS  & &  strescseq . len  = =  0  & &  u  = =  ' q ' )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								term . mode  | =  MODE_SIXEL ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							if  ( strescseq . len + len  > =  sizeof ( strescseq . buf ) - 1 )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								/*   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								 *  Here  is  a  bug  in  terminals .  If  the  user  never  sends   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								 *  some  code  to  stop  the  str  or  esc  command ,  then  st   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								 *  will  stop  responding .  But  this  is  better  than   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								 *  silently  failing  with  unknown  characters .  At  least   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								 *  then  users  will  report  back .   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								 *   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								 *  In  the  case  users  ever  get  fixed ,  here  is  the  code :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								 */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								/*   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								 *  term . esc  =  0 ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								 *  strhandle ( ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								 */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								return ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							memmove ( & strescseq . buf [ strescseq . len ] ,  c ,  len ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							strescseq . len  + =  len ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							return ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					check_control_code :  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						/*   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						 *  Actions  of  control  codes  must  be  performed  as  soon  they  arrive   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						 *  because  they  can  be  embedded  inside  a  control  sequence ,  and