@ -77,6 +77,13 @@ char *argv0;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					# define IS_SET(flag) ((term.mode & (flag)) != 0)  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					# define TIMEDIFF(t1, t2) ((t1.tv_sec-t2.tv_sec)*1000 + (t1.tv_usec-t2.tv_usec) / 1000)  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					# define TRUECOLOR(r,g,b) (1 << 24 | (r) << 16 | (g) << 8 | (b))  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					# define IS_TRUECOL(x)    (1 << 24 & (x))  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					# define TRUERED(x)       (((x) & 0xff0000) >> 8)  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					# define TRUEGREEN(x)     (((x) & 0xff00))  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					# define TRUEBLUE(x)      (((x) & 0xff) << 8)  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					# define VT102ID "\033[?6c"  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					enum  glyph_attribute  {  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -158,8 +165,8 @@ typedef unsigned short ushort;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					typedef  struct  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						char  c [ UTF_SIZ ] ;  /* character code */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						uchar  mode ;       /* attribute flags */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						ushort   fg ;        /* foreground  */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						ushort   bg ;        /* background  */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						ulong   fg ;          /* foreground  */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						ulong   bg ;          /* background  */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					}  Glyph ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					typedef  Glyph  * Line ;  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -354,7 +361,7 @@ static void tsetdirtattr(int);  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					static  void  tsetmode ( bool ,  bool ,  int  * ,  int ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					static  void  tfulldirt ( void ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					static  void  techo ( char  * ,  int ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					static  ulong  tdefcolor ( int  * ,  int  * ,  int ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					static  inline  bool  match ( uint ,  uint ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					static  void  ttynew ( void ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					static  void  ttyread ( void ) ;  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -1618,9 +1625,58 @@ tdeleteline(int n) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						tscrollup ( term . c . y ,  n ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					ulong  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					tdefcolor ( int  * attr ,  int  * npar ,  int  l )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						long  idx  =  - 1 ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						uint  r ,  g ,  b ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						switch  ( attr [ * npar  +  1 ] )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						case  2 :  /* direct colour in RGB space */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							if  ( * npar  +  4  > =  l )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								fprintf ( stderr ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									" erresc(38): Incorrect number of parameters (%d) \n " ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									* npar ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							r  =  attr [ * npar  +  2 ] ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							g  =  attr [ * npar  +  3 ] ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							b  =  attr [ * npar  +  4 ] ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							* npar  + =  4 ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							if ( ! BETWEEN ( r ,  0 ,  255 )  | |  ! BETWEEN ( g ,  0 ,  255 )  | |  ! BETWEEN ( b ,  0 ,  255 ) )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								fprintf ( stderr ,  " erresc: bad rgb color (%d,%d,%d) \n " ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									r ,  g ,  b ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							else   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								idx  =  TRUECOLOR ( r ,  g ,  b ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						case  5 :  /* indexed colour */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							if  ( * npar  +  2  > =  l )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								fprintf ( stderr ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									" erresc(38): Incorrect number of parameters (%d) \n " ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									* npar ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							* npar  + =  2 ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							if ( ! BETWEEN ( attr [ * npar ] ,  0 ,  255 ) )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								fprintf ( stderr ,  " erresc: bad fgcolor %d \n " ,  attr [ * npar ] ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							else   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								idx  =  attr [ * npar ] ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						case  0 :  /* implemented defined (only foreground) */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						case  1 :  /* transparent */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						case  3 :  /* direct colour in CMY space */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						case  4 :  /* direct colour in CMYK space */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						default :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							fprintf ( stderr ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							        " erresc(38): gfx attr %d unknown \n " ,  attr [ * npar ] ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						return  idx ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					void  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					tsetattr ( int  * attr ,  int  l )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						int  i ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						ulong  idx ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						for ( i  =  0 ;  i  <  l ;  i + + )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							switch ( attr [ i ] )  {   
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -1665,39 +1721,15 @@ tsetattr(int *attr, int l) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								term . c . attr . mode  & =  ~ ATTR_REVERSE ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							case  38 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								if ( i  +  2  <  l  & &  attr [ i  +  1 ]  = =  5 )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									i  + =  2 ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									if ( BETWEEN ( attr [ i ] ,  0 ,  255 ) )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
										term . c . attr . fg  =  attr [ i ] ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									}  else  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
										fprintf ( stderr ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
											" erresc: bad fgcolor %d \n " ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
											attr [ i ] ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								}  else  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									fprintf ( stderr ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
										" erresc(38): gfx attr %d unknown \n " ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
										attr [ i ] ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								if  ( ( idx  =  tdefcolor ( attr ,  & i ,  l ) )  > =  0 )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									term . c . attr . fg  =  idx ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							case  39 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								term . c . attr . fg  =  defaultfg ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							case  48 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								if ( i  +  2  <  l  & &  attr [ i  +  1 ]  = =  5 )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									i  + =  2 ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									if ( BETWEEN ( attr [ i ] ,  0 ,  255 ) )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
										term . c . attr . bg  =  attr [ i ] ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									}  else  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
										fprintf ( stderr ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
											" erresc: bad bgcolor %d \n " ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
											attr [ i ] ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								}  else  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									fprintf ( stderr ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
										" erresc(48): gfx attr %d unknown \n " ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
										attr [ i ] ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								if  ( ( idx  =  tdefcolor ( attr ,  & i ,  l ) )  > =  0 )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									term . c . attr . bg  =  idx ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							case  49 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								term . c . attr . bg  =  defaultbg ;   
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -2916,7 +2948,7 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						FcPattern  * fcpattern ,  * fontpattern ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						FcFontSet  * fcsets [ ]  =  {  NULL  } ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						FcCharSet  * fccharset ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						Colour  * fg ,  * bg ,  * temp ,  revfg ,  revbg ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						Colour  * fg ,  * bg ,  * temp ,  revfg ,  revbg ,  truefg ,  truebg ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						XRenderColor  colfg ,  colbg ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						Rectangle  r ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -2936,8 +2968,27 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							if ( base . fg  = =  defaultfg )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								base . fg  =  defaultunderline ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						fg  =  & dc . col [ base . fg ] ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						bg  =  & dc . col [ base . bg ] ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						if ( IS_TRUECOL ( base . fg ) )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							colfg . red  =  TRUERED ( base . fg ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							colfg . green  =  TRUEGREEN ( base . fg ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							colfg . blue  =  TRUEBLUE ( base . fg ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							XftColorAllocValue ( xw . dpy ,  xw . vis ,  xw . cmap ,  & colfg ,  & truefg ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							fg  =  & truefg ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						}  else  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							fg  =  & dc . col [ base . fg ] ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						if ( IS_TRUECOL ( base . bg ) )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							colbg . green  =  TRUEGREEN ( base . bg ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							colbg . red  =  TRUERED ( base . bg ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							colbg . blue  =  TRUEBLUE ( base . bg ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							XftColorAllocValue ( xw . dpy ,  xw . vis ,  xw . cmap ,  & colbg ,  & truebg ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							bg  =  & truebg ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						}  else  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							bg  =  & dc . col [ base . bg ] ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						if ( base . mode  &  ATTR_BOLD )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							if ( BETWEEN ( base . fg ,  0 ,  7 ) )  {