@ -273,6 +273,7 @@ static void tsetchar(char*);  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					static  void  tsetscroll ( int ,  int ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					static  void  tswapscreen ( void ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					static  void  tsetdirt ( int ,  int ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					static  void  tsetmode ( bool ,  bool ,  int  * ,  int ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					static  void  tfulldirt ( void ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					static  void  ttynew ( void ) ;  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -1178,6 +1179,79 @@ tsetscroll(int t, int b) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						term . bot  =  b ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					# define MODBIT(x, set, bit) ((set) ? ((x) |= (bit)) : ((x) &= ~(bit)))  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					void  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					tsetmode ( bool  priv ,  bool  set ,  int  * args ,  int  narg )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						int  * lim ,  mode ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						for  ( lim  =  args  +  narg ;  args  <  lim ;  + + args )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							if ( priv )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								switch ( * args )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  1 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									MODBIT ( term . mode ,  set ,  MODE_APPKEYPAD ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  5 :  /* DECSCNM -- Reverve video */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									mode  =  term . mode ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									MODBIT ( term . mode , set ,  MODE_REVERSE ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									if  ( mode  ! =  term . mode )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
										draw ( ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  7 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									MODBIT ( term . mode ,  set ,  MODE_WRAP ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  20 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									MODBIT ( term . mode ,  set ,  MODE_CRLF ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  12 :  /* att610 -- Start blinking cursor (IGNORED) */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  25 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									MODBIT ( term . c . state ,  ! set ,  CURSOR_HIDE ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  1000 :  /* 1000,1002: enable xterm mouse report */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									MODBIT ( term . mode ,  set ,  MODE_MOUSEBTN ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  1002 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									MODBIT ( term . mode ,  set ,  MODE_MOUSEMOTION ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  1049 :  /* = 1047 and 1048 */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  47 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  1047 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									if ( IS_SET ( MODE_ALTSCREEN ) )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
										tclearregion ( 0 ,  0 ,  term . col - 1 ,  term . row - 1 ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									if  ( ( set  & &  ! IS_SET ( MODE_ALTSCREEN ) )  | |   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									    ( ! set  & &  IS_SET ( MODE_ALTSCREEN ) ) )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
										    tswapscreen ( ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									if  ( * args  ! =  1049 )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
										break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									/* pass through */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  1048 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									tcursor ( ( set )  ?  CURSOR_SAVE  :  CURSOR_LOAD ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								default :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									fprintf ( stderr ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
										" erresc: unknown private set/reset mode %d \n " ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
										* args ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							}  else  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								switch ( * args )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  4 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									MODBIT ( term . mode ,  set ,  MODE_INSERT ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								default :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									fprintf ( stderr ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
										" erresc: unknown set/reset mode %d \n " ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
										* args ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					# undef MODBIT  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					void  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					csihandle ( void )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						switch ( csiescseq . mode )  {   
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -1291,58 +1365,7 @@ csihandle(void) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							tinsertblankline ( csiescseq . arg [ 0 ] ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						case  ' l ' :  /* RM -- Reset Mode */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							if ( csiescseq . priv )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								switch ( csiescseq . arg [ 0 ] )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  1 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									term . mode  & =  ~ MODE_APPKEYPAD ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  5 :  /* DECSCNM -- Remove reverse video */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									if ( IS_SET ( MODE_REVERSE ) )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
										term . mode  & =  ~ MODE_REVERSE ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
										draw ( ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  7 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									term . mode  & =  ~ MODE_WRAP ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  12 :  /* att610 -- Stop blinking cursor (IGNORED) */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  20 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									term . mode  & =  ~ MODE_CRLF ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  25 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									term . c . state  | =  CURSOR_HIDE ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  1000 :  /* disable X11 xterm mouse reporting */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									term . mode  & =  ~ MODE_MOUSEBTN ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  1002 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									term . mode  & =  ~ MODE_MOUSEMOTION ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  1049 :  /* = 1047 and 1048 */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  47 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  1047 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									if ( IS_SET ( MODE_ALTSCREEN ) )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
										tclearregion ( 0 ,  0 ,  term . col - 1 ,  term . row - 1 ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
										tswapscreen ( ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									if ( csiescseq . arg [ 0 ]  ! =  1049 )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
										break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  1048 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									tcursor ( CURSOR_LOAD ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								default :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									goto  unknown ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							}  else  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								switch ( csiescseq . arg [ 0 ] )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  4 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									term . mode  & =  ~ MODE_INSERT ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								default :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									goto  unknown ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							tsetmode ( csiescseq . priv ,  0 ,  csiescseq . arg ,  csiescseq . narg ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						case  ' M ' :  /* DL -- Delete <n> lines */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							DEFAULT ( csiescseq . arg [ 0 ] ,  1 ) ;   
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -1366,58 +1389,7 @@ csihandle(void) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							tmoveto ( term . c . x ,  csiescseq . arg [ 0 ] - 1 ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						case  ' h ' :  /* SM -- Set terminal mode */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							if ( csiescseq . priv )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								switch ( csiescseq . arg [ 0 ] )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  1 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									term . mode  | =  MODE_APPKEYPAD ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  5 :  /* DECSCNM -- Reverve video */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									if ( ! IS_SET ( MODE_REVERSE ) )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
										term . mode  | =  MODE_REVERSE ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
										draw ( ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  7 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									term . mode  | =  MODE_WRAP ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  20 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									term . mode  | =  MODE_CRLF ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  12 :  /* att610 -- Start blinking cursor (IGNORED) */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									 /* fallthrough for xterm cvvis = CSI [ ? 12 ; 25 h */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									if ( csiescseq . narg  >  1  & &  csiescseq . arg [ 1 ]  ! =  25 )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
										break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  25 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									term . c . state  & =  ~ CURSOR_HIDE ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  1000 :  /* 1000,1002: enable xterm mouse report */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									term . mode  | =  MODE_MOUSEBTN ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  1002 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									term . mode  | =  MODE_MOUSEMOTION ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  1049 :  /* = 1047 and 1048 */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  47 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  1047 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									if ( IS_SET ( MODE_ALTSCREEN ) )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
										tclearregion ( 0 ,  0 ,  term . col - 1 ,  term . row - 1 ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									else   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
										tswapscreen ( ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									if ( csiescseq . arg [ 0 ]  ! =  1049 )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
										break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  1048 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									tcursor ( CURSOR_SAVE ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								default :  goto  unknown ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							}  else  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								switch ( csiescseq . arg [ 0 ] )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								case  4 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									term . mode  | =  MODE_INSERT ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
									break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								default :  goto  unknown ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							} ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							tsetmode ( csiescseq . priv ,  1 ,  csiescseq . arg ,  csiescseq . narg ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							break ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						case  ' m ' :  /* SGR -- Terminal attribute (color) */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							tsetattr ( csiescseq . arg ,  csiescseq . narg ) ;