|  |  |  | @@ -43,8 +43,8 @@ details. */ | 
		
	
		
			
				|  |  |  |  | #define CTRL_PRESSED (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED) | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | #define dev_state (shared_console_info->dev_state) | 
		
	
		
			
				|  |  |  |  | #define srTop (dev_state.info.winTop + dev_state.scroll_region.Top) | 
		
	
		
			
				|  |  |  |  | #define srBottom ((dev_state.scroll_region.Bottom < 0) ? dev_state.info.winBottom : dev_state.info.winTop + dev_state.scroll_region.Bottom) | 
		
	
		
			
				|  |  |  |  | #define srTop (dev_state.winTop + dev_state.scroll_region.Top) | 
		
	
		
			
				|  |  |  |  | #define srBottom ((dev_state.scroll_region.Bottom < 0) ? dev_state.winBottom : dev_state.winTop + dev_state.scroll_region.Bottom) | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | const char *get_nonascii_key (INPUT_RECORD&, char *); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
	
		
			
				
					
					|  |  |  | @@ -172,7 +172,6 @@ fhandler_console::setup () | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |   if (set_unit ()) | 
		
	
		
			
				|  |  |  |  |       { | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	dev_state.scroll_region.Bottom = -1; | 
		
	
		
			
				|  |  |  |  | 	dev_state.dwLastCursorPosition.X = -1; | 
		
	
		
			
				|  |  |  |  | 	dev_state.dwLastCursorPosition.Y = -1; | 
		
	
	
		
			
				
					
					|  |  |  | @@ -264,11 +263,11 @@ fhandler_console::set_cursor_maybe () | 
		
	
		
			
				|  |  |  |  | void | 
		
	
		
			
				|  |  |  |  | fhandler_console::send_winch_maybe () | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |   SHORT y = dev_state.info.dwWinSize.Y; | 
		
	
		
			
				|  |  |  |  |   SHORT x = dev_state.info.dwWinSize.X; | 
		
	
		
			
				|  |  |  |  |   dev_state.fillin_info (get_output_handle ()); | 
		
	
		
			
				|  |  |  |  |   SHORT y = dev_state.dwWinSize.Y; | 
		
	
		
			
				|  |  |  |  |   SHORT x = dev_state.dwWinSize.X; | 
		
	
		
			
				|  |  |  |  |   dev_state.fillin (get_output_handle ()); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   if (y != dev_state.info.dwWinSize.Y || x != dev_state.info.dwWinSize.X) | 
		
	
		
			
				|  |  |  |  |   if (y != dev_state.dwWinSize.Y || x != dev_state.dwWinSize.X) | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |       dev_state.scroll_region.Top = 0; | 
		
	
		
			
				|  |  |  |  |       dev_state.scroll_region.Bottom = -1; | 
		
	
	
		
			
				
					
					|  |  |  | @@ -734,27 +733,31 @@ fhandler_console::set_input_state () | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | bool | 
		
	
		
			
				|  |  |  |  | dev_console::fillin_info (HANDLE h) | 
		
	
		
			
				|  |  |  |  | dev_console::fillin (HANDLE h) | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |   bool ret; | 
		
	
		
			
				|  |  |  |  |   CONSOLE_SCREEN_BUFFER_INFO linfo; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   if ((ret = GetConsoleScreenBufferInfo (h, &linfo))) | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |       info.winTop = linfo.srWindow.Top; | 
		
	
		
			
				|  |  |  |  |       info.winBottom = linfo.srWindow.Bottom; | 
		
	
		
			
				|  |  |  |  |       info.dwWinSize.Y = 1 + linfo.srWindow.Bottom - linfo.srWindow.Top; | 
		
	
		
			
				|  |  |  |  |       info.dwWinSize.X = 1 + linfo.srWindow.Right - linfo.srWindow.Left; | 
		
	
		
			
				|  |  |  |  |       info.dwBufferSize = linfo.dwSize; | 
		
	
		
			
				|  |  |  |  |       info.dwCursorPosition = linfo.dwCursorPosition; | 
		
	
		
			
				|  |  |  |  |       info.wAttributes = linfo.wAttributes; | 
		
	
		
			
				|  |  |  |  |       winTop = linfo.srWindow.Top; | 
		
	
		
			
				|  |  |  |  |       winBottom = linfo.srWindow.Bottom; | 
		
	
		
			
				|  |  |  |  |       dwWinSize.Y = 1 + linfo.srWindow.Bottom - linfo.srWindow.Top; | 
		
	
		
			
				|  |  |  |  |       dwWinSize.X = 1 + linfo.srWindow.Right - linfo.srWindow.Left; | 
		
	
		
			
				|  |  |  |  |       if (dwBufferSize.Y != linfo.dwSize.Y || dwBufferSize.X != linfo.dwSize.X) | 
		
	
		
			
				|  |  |  |  | 	dwEnd.X = dwEnd.Y = 0; | 
		
	
		
			
				|  |  |  |  |       dwBufferSize = linfo.dwSize; | 
		
	
		
			
				|  |  |  |  |       dwCursorPosition = linfo.dwCursorPosition; | 
		
	
		
			
				|  |  |  |  |       if (dwCursorPosition.Y > dwEnd.Y | 
		
	
		
			
				|  |  |  |  | 	  || (dwCursorPosition.Y >= dwEnd.Y && dwCursorPosition.X > dwEnd.X)) | 
		
	
		
			
				|  |  |  |  | 	dwEnd = dwCursorPosition; | 
		
	
		
			
				|  |  |  |  |       wAttributes = linfo.wAttributes; | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |   else | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |       memset (&info, 0, sizeof info); | 
		
	
		
			
				|  |  |  |  |       info.dwWinSize.Y = 25; | 
		
	
		
			
				|  |  |  |  |       info.dwWinSize.X = 80; | 
		
	
		
			
				|  |  |  |  |       info.winBottom = 24; | 
		
	
		
			
				|  |  |  |  |       dwWinSize.Y = 25; | 
		
	
		
			
				|  |  |  |  |       dwWinSize.X = 80; | 
		
	
		
			
				|  |  |  |  |       winBottom = 24; | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   return ret; | 
		
	
	
		
			
				
					
					|  |  |  | @@ -767,37 +770,28 @@ dev_console::fillin_info (HANDLE h) | 
		
	
		
			
				|  |  |  |  |    Negative values represents current screen dimensions | 
		
	
		
			
				|  |  |  |  | */ | 
		
	
		
			
				|  |  |  |  | void | 
		
	
		
			
				|  |  |  |  | fhandler_console::scroll_screen (int x1, int y1, int x2, int y2, int xn, int yn) | 
		
	
		
			
				|  |  |  |  | fhandler_console::scroll_buffer (int x1, int y1, int x2, int y2, int xn, int yn) | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |   SMALL_RECT sr1, sr2; | 
		
	
		
			
				|  |  |  |  |   CHAR_INFO fill; | 
		
	
		
			
				|  |  |  |  |   COORD dest; | 
		
	
		
			
				|  |  |  |  |   fill.Char.AsciiChar = ' '; | 
		
	
		
			
				|  |  |  |  |   fill.Attributes = dev_state.current_win32_attr; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   dev_state.fillin_info (get_output_handle ()); | 
		
	
		
			
				|  |  |  |  |   sr1.Left = x1 >= 0 ? x1 : dev_state.info.dwWinSize.X - 1; | 
		
	
		
			
				|  |  |  |  |   if (y1 == 0) | 
		
	
		
			
				|  |  |  |  |     sr1.Top = dev_state.info.winTop; | 
		
	
		
			
				|  |  |  |  |   else | 
		
	
		
			
				|  |  |  |  |     sr1.Top = y1 > 0 ? y1 : dev_state.info.winBottom; | 
		
	
		
			
				|  |  |  |  |   sr1.Right = x2 >= 0 ? x2 : dev_state.info.dwWinSize.X - 1; | 
		
	
		
			
				|  |  |  |  |   if (y2 == 0) | 
		
	
		
			
				|  |  |  |  |     sr1.Bottom = dev_state.info.winTop; | 
		
	
		
			
				|  |  |  |  |   else | 
		
	
		
			
				|  |  |  |  |     sr1.Bottom = y2 > 0 ? y2 : dev_state.info.winBottom; | 
		
	
		
			
				|  |  |  |  |   dev_state.fillin (get_output_handle ()); | 
		
	
		
			
				|  |  |  |  |   sr1.Left = x1 >= 0 ? x1 : dev_state.dwWinSize.X - 1; | 
		
	
		
			
				|  |  |  |  |   sr1.Top = y1 >= 0 ? y1 : dev_state.winBottom; | 
		
	
		
			
				|  |  |  |  |   sr1.Right = x2 >= 0 ? x2 : dev_state.dwWinSize.X - 1; | 
		
	
		
			
				|  |  |  |  |   sr1.Bottom = y2 >= 0 ? y2 : dev_state.winBottom; | 
		
	
		
			
				|  |  |  |  |   sr2.Top = srTop; | 
		
	
		
			
				|  |  |  |  |   sr2.Left = 0; | 
		
	
		
			
				|  |  |  |  |   sr2.Bottom = srBottom; | 
		
	
		
			
				|  |  |  |  |   sr2.Right = dev_state.info.dwWinSize.X - 1; | 
		
	
		
			
				|  |  |  |  |   sr2.Right = dev_state.dwWinSize.X - 1; | 
		
	
		
			
				|  |  |  |  |   if (sr1.Bottom > sr2.Bottom && sr1.Top <= sr2.Bottom) | 
		
	
		
			
				|  |  |  |  |     sr1.Bottom = sr2.Bottom; | 
		
	
		
			
				|  |  |  |  |   dest.X = xn >= 0 ? xn : dev_state.info.dwWinSize.X - 1; | 
		
	
		
			
				|  |  |  |  |   if (yn == 0) | 
		
	
		
			
				|  |  |  |  |     dest.Y = dev_state.info.winTop; | 
		
	
		
			
				|  |  |  |  |   else | 
		
	
		
			
				|  |  |  |  |     dest.Y = yn > 0 ? yn : dev_state.info.winBottom; | 
		
	
		
			
				|  |  |  |  |   fill.Char.AsciiChar = ' '; | 
		
	
		
			
				|  |  |  |  |   fill.Attributes = dev_state.current_win32_attr; | 
		
	
		
			
				|  |  |  |  |   ScrollConsoleScreenBuffer (get_output_handle (), &sr1, &sr2, dest, &fill); | 
		
	
		
			
				|  |  |  |  |   dest.X = xn >= 0 ? xn : dev_state.dwWinSize.X - 1; | 
		
	
		
			
				|  |  |  |  |   dest.Y = yn >= 0 ? yn : dev_state.winBottom; | 
		
	
		
			
				|  |  |  |  |   ScrollConsoleScreenBuffer (get_output_handle (), &sr1, NULL, dest, &fill); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | #if 0 /* CGF: 2014-01-04 Assuming that we don't need this anymore */ | 
		
	
		
			
				|  |  |  |  |   /* ScrollConsoleScreenBuffer on Windows 95 is buggy - when scroll distance | 
		
	
	
		
			
				
					
					|  |  |  | @@ -860,11 +854,11 @@ fhandler_console::open (int flags, mode_t) | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |   set_output_handle (h); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   if (dev_state.fillin_info (get_output_handle ())) | 
		
	
		
			
				|  |  |  |  |   if (dev_state.fillin (get_output_handle ())) | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |       dev_state.current_win32_attr = dev_state.info.wAttributes; | 
		
	
		
			
				|  |  |  |  |       dev_state.current_win32_attr = dev_state.wAttributes; | 
		
	
		
			
				|  |  |  |  |       if (!dev_state.default_color) | 
		
	
		
			
				|  |  |  |  | 	dev_state.default_color = dev_state.info.wAttributes; | 
		
	
		
			
				|  |  |  |  | 	dev_state.default_color = dev_state.wAttributes; | 
		
	
		
			
				|  |  |  |  |       dev_state.set_default_attr (); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
	
		
			
				
					
					|  |  |  | @@ -912,13 +906,13 @@ fhandler_console::ioctl (unsigned int cmd, void *arg) | 
		
	
		
			
				|  |  |  |  |       case TIOCGWINSZ: | 
		
	
		
			
				|  |  |  |  | 	int st; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	st = dev_state.fillin_info (get_output_handle ()); | 
		
	
		
			
				|  |  |  |  | 	st = dev_state.fillin (get_output_handle ()); | 
		
	
		
			
				|  |  |  |  | 	if (st) | 
		
	
		
			
				|  |  |  |  | 	  { | 
		
	
		
			
				|  |  |  |  | 	    /* *not* the buffer size, the actual screen size... */ | 
		
	
		
			
				|  |  |  |  | 	    /* based on Left Top Right Bottom of srWindow */ | 
		
	
		
			
				|  |  |  |  | 	    ((struct winsize *) arg)->ws_row = dev_state.info.dwWinSize.Y; | 
		
	
		
			
				|  |  |  |  | 	    ((struct winsize *) arg)->ws_col = dev_state.info.dwWinSize.X; | 
		
	
		
			
				|  |  |  |  | 	    ((struct winsize *) arg)->ws_row = dev_state.dwWinSize.Y; | 
		
	
		
			
				|  |  |  |  | 	    ((struct winsize *) arg)->ws_col = dev_state.dwWinSize.X; | 
		
	
		
			
				|  |  |  |  | 	    syscall_printf ("WINSZ: (row=%d,col=%d)", | 
		
	
		
			
				|  |  |  |  | 			   ((struct winsize *) arg)->ws_row, | 
		
	
		
			
				|  |  |  |  | 			   ((struct winsize *) arg)->ws_col); | 
		
	
	
		
			
				
					
					|  |  |  | @@ -1189,7 +1183,7 @@ dev_console::set_default_attr () | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | int | 
		
	
		
			
				|  |  |  |  | dev_console::console_attrs::set_cl_x (cltype x) | 
		
	
		
			
				|  |  |  |  | dev_console::set_cl_x (cltype x) | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |   if (x == cl_disp_beg || x == cl_buf_beg) | 
		
	
		
			
				|  |  |  |  |     return 0; | 
		
	
	
		
			
				
					
					|  |  |  | @@ -1201,7 +1195,7 @@ dev_console::console_attrs::set_cl_x (cltype x) | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | int | 
		
	
		
			
				|  |  |  |  | dev_console::console_attrs::set_cl_y (cltype y) | 
		
	
		
			
				|  |  |  |  | dev_console::set_cl_y (cltype y) | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |   if (y == cl_buf_beg) | 
		
	
		
			
				|  |  |  |  |     return 0; | 
		
	
	
		
			
				
					
					|  |  |  | @@ -1213,7 +1207,26 @@ dev_console::console_attrs::set_cl_y (cltype y) | 
		
	
		
			
				|  |  |  |  |     return dwBufferSize.Y - 1; | 
		
	
		
			
				|  |  |  |  |   return dwCursorPosition.Y; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |    | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | bool | 
		
	
		
			
				|  |  |  |  | dev_console::is_fullscreen (int x1, int y1, int x2, int y2) | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |   return !savebuf | 
		
	
		
			
				|  |  |  |  | 	 && x1 == 0 && x2 == dwWinSize.X - 1 && y1 == winTop && y2 == winBottom | 
		
	
		
			
				|  |  |  |  | 	 && dwBufferSize.Y > dwWinSize.Y; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | void | 
		
	
		
			
				|  |  |  |  | dev_console::scroll_window (HANDLE h) | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |   SMALL_RECT sr; | 
		
	
		
			
				|  |  |  |  |   sr.Top = sr.Bottom = 1 + dwEnd.Y - winTop; | 
		
	
		
			
				|  |  |  |  |   sr.Left = sr.Right = 0; | 
		
	
		
			
				|  |  |  |  |   SetConsoleWindowInfo (h, FALSE, &sr); | 
		
	
		
			
				|  |  |  |  |   dwEnd.X = 0; | 
		
	
		
			
				|  |  |  |  |   SetConsoleCursorPosition (h, dwEnd); | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | /* | 
		
	
		
			
				|  |  |  |  |  * Clear the screen context from x1/y1 to x2/y2 cell. | 
		
	
		
			
				|  |  |  |  |  * Negative values represents current screen dimensions | 
		
	
	
		
			
				
					
					|  |  |  | @@ -1225,16 +1238,24 @@ fhandler_console::clear_screen (cltype xc1, cltype yc1, cltype xc2, cltype yc2) | 
		
	
		
			
				|  |  |  |  |   DWORD done; | 
		
	
		
			
				|  |  |  |  |   int num; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   dev_state.fillin_info (get_output_handle ()); | 
		
	
		
			
				|  |  |  |  |   dev_state.fillin (get_output_handle ()); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   int x1 = dev_state.info.set_cl_x (xc1); | 
		
	
		
			
				|  |  |  |  |   int y1 = dev_state.info.set_cl_y (yc1); | 
		
	
		
			
				|  |  |  |  |   int x2 = dev_state.info.set_cl_x (xc2); | 
		
	
		
			
				|  |  |  |  |   int y2 = dev_state.info.set_cl_y (yc2); | 
		
	
		
			
				|  |  |  |  |   int x1 = dev_state.set_cl_x (xc1); | 
		
	
		
			
				|  |  |  |  |   int y1 = dev_state.set_cl_y (yc1); | 
		
	
		
			
				|  |  |  |  |   int x2 = dev_state.set_cl_x (xc2); | 
		
	
		
			
				|  |  |  |  |   int y2 = dev_state.set_cl_y (yc2); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   num = abs (y1 - y2) * dev_state.info.dwBufferSize.X + abs (x1 - x2) + 1; | 
		
	
		
			
				|  |  |  |  |   /* Detect special case - scroll the screen if we have a buffer to | 
		
	
		
			
				|  |  |  |  |      preserve the buffer. */ | 
		
	
		
			
				|  |  |  |  |   if (dev_state.is_fullscreen (x1, y1, x2, y2)) | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |       dev_state.scroll_window (get_output_handle ()); | 
		
	
		
			
				|  |  |  |  |       return; | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   if ((y2 * dev_state.info.dwBufferSize.X + x2) > (y1 * dev_state.info.dwBufferSize.X + x1)) | 
		
	
		
			
				|  |  |  |  |   num = abs (y1 - y2) * dev_state.dwBufferSize.X + abs (x1 - x2) + 1; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   if ((y2 * dev_state.dwBufferSize.X + x2) > (y1 * dev_state.dwBufferSize.X + x1)) | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |       tlc.X = x1; | 
		
	
		
			
				|  |  |  |  |       tlc.Y = y1; | 
		
	
	
		
			
				
					
					|  |  |  | @@ -1260,7 +1281,7 @@ fhandler_console::cursor_set (bool rel_to_top, int x, int y) | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |   COORD pos; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   dev_state.fillin_info (get_output_handle ()); | 
		
	
		
			
				|  |  |  |  |   dev_state.fillin (get_output_handle ()); | 
		
	
		
			
				|  |  |  |  | #if 0 | 
		
	
		
			
				|  |  |  |  |   /* Setting y to the current winBottom here is the reason that the window | 
		
	
		
			
				|  |  |  |  |      isn't scrolled back to the current cursor position like it's done in | 
		
	
	
		
			
				
					
					|  |  |  | @@ -1269,17 +1290,17 @@ fhandler_console::cursor_set (bool rel_to_top, int x, int y) | 
		
	
		
			
				|  |  |  |  |      output is generated while the user had the window scrolled back.  This | 
		
	
		
			
				|  |  |  |  |      behaviour is very old, it has no matching ChangeLog entry. | 
		
	
		
			
				|  |  |  |  |      Just disable for now but keep the code in for future reference. */ | 
		
	
		
			
				|  |  |  |  |   if (y > dev_state.info.winBottom) | 
		
	
		
			
				|  |  |  |  |     y = dev_state.info.winBottom; | 
		
	
		
			
				|  |  |  |  |   if (y > dev_state.winBottom) | 
		
	
		
			
				|  |  |  |  |     y = dev_state.winBottom; | 
		
	
		
			
				|  |  |  |  |   else | 
		
	
		
			
				|  |  |  |  | #endif | 
		
	
		
			
				|  |  |  |  |   if (y < 0) | 
		
	
		
			
				|  |  |  |  |     y = 0; | 
		
	
		
			
				|  |  |  |  |   else if (rel_to_top) | 
		
	
		
			
				|  |  |  |  |     y += dev_state.info.winTop; | 
		
	
		
			
				|  |  |  |  |     y += dev_state.winTop; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   if (x > dev_state.info.dwWinSize.X) | 
		
	
		
			
				|  |  |  |  |     x = dev_state.info.dwWinSize.X - 1; | 
		
	
		
			
				|  |  |  |  |   if (x > dev_state.dwWinSize.X) | 
		
	
		
			
				|  |  |  |  |     x = dev_state.dwWinSize.X - 1; | 
		
	
		
			
				|  |  |  |  |   else if (x < 0) | 
		
	
		
			
				|  |  |  |  |     x = 0; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
	
		
			
				
					
					|  |  |  | @@ -1291,18 +1312,18 @@ fhandler_console::cursor_set (bool rel_to_top, int x, int y) | 
		
	
		
			
				|  |  |  |  | void | 
		
	
		
			
				|  |  |  |  | fhandler_console::cursor_rel (int x, int y) | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |   dev_state.fillin_info (get_output_handle ()); | 
		
	
		
			
				|  |  |  |  |   x += dev_state.info.dwCursorPosition.X; | 
		
	
		
			
				|  |  |  |  |   y += dev_state.info.dwCursorPosition.Y; | 
		
	
		
			
				|  |  |  |  |   dev_state.fillin (get_output_handle ()); | 
		
	
		
			
				|  |  |  |  |   x += dev_state.dwCursorPosition.X; | 
		
	
		
			
				|  |  |  |  |   y += dev_state.dwCursorPosition.Y; | 
		
	
		
			
				|  |  |  |  |   cursor_set (false, x, y); | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | void | 
		
	
		
			
				|  |  |  |  | fhandler_console::cursor_get (int *x, int *y) | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |   dev_state.fillin_info (get_output_handle ()); | 
		
	
		
			
				|  |  |  |  |   *y = dev_state.info.dwCursorPosition.Y; | 
		
	
		
			
				|  |  |  |  |   *x = dev_state.info.dwCursorPosition.X; | 
		
	
		
			
				|  |  |  |  |   dev_state.fillin (get_output_handle ()); | 
		
	
		
			
				|  |  |  |  |   *y = dev_state.dwCursorPosition.Y; | 
		
	
		
			
				|  |  |  |  |   *x = dev_state.dwCursorPosition.X; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | /* VT100 line drawing graphics mode maps `abcdefghijklmnopqrstuvwxyz{|}~ to | 
		
	
	
		
			
				
					
					|  |  |  | @@ -1474,14 +1495,14 @@ static const char base_chars[256] = | 
		
	
		
			
				|  |  |  |  | void | 
		
	
		
			
				|  |  |  |  | fhandler_console::char_command (char c) | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |   int x, y; | 
		
	
		
			
				|  |  |  |  |   int x, y, n; | 
		
	
		
			
				|  |  |  |  |   char buf[40]; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   switch (c) | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |     case 'm':   /* Set Graphics Rendition */ | 
		
	
		
			
				|  |  |  |  |        for (int i = 0; i <= dev_state.nargs_; i++) | 
		
	
		
			
				|  |  |  |  | 	 switch (dev_state.args_[i]) | 
		
	
		
			
				|  |  |  |  |        for (int i = 0; i <= dev_state.nargs; i++) | 
		
	
		
			
				|  |  |  |  | 	 switch (dev_state.args[i]) | 
		
	
		
			
				|  |  |  |  | 	   { | 
		
	
		
			
				|  |  |  |  | 	     case 0:    /* normal color */ | 
		
	
		
			
				|  |  |  |  | 	       dev_state.set_default_attr (); | 
		
	
	
		
			
				
					
					|  |  |  | @@ -1585,7 +1606,7 @@ fhandler_console::char_command (char c) | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 	    CONSOLE_CURSOR_INFO console_cursor_info; | 
		
	
		
			
				|  |  |  |  | 	    GetConsoleCursorInfo (get_output_handle (), & console_cursor_info); | 
		
	
		
			
				|  |  |  |  | 	    switch (dev_state.args_[0]) | 
		
	
		
			
				|  |  |  |  | 	    switch (dev_state.args[0]) | 
		
	
		
			
				|  |  |  |  | 	      { | 
		
	
		
			
				|  |  |  |  | 		case 0: /* blinking block */ | 
		
	
		
			
				|  |  |  |  | 		case 1: /* blinking block (default) */ | 
		
	
	
		
			
				
					
					|  |  |  | @@ -1599,7 +1620,7 @@ fhandler_console::char_command (char c) | 
		
	
		
			
				|  |  |  |  | 		  SetConsoleCursorInfo (get_output_handle (), & console_cursor_info); | 
		
	
		
			
				|  |  |  |  | 		  break; | 
		
	
		
			
				|  |  |  |  | 		default: /* use value as percentage */ | 
		
	
		
			
				|  |  |  |  | 		  console_cursor_info.dwSize = dev_state.args_[0]; | 
		
	
		
			
				|  |  |  |  | 		  console_cursor_info.dwSize = dev_state.args[0]; | 
		
	
		
			
				|  |  |  |  | 		  SetConsoleCursorInfo (get_output_handle (), & console_cursor_info); | 
		
	
		
			
				|  |  |  |  | 		  break; | 
		
	
		
			
				|  |  |  |  | 	      } | 
		
	
	
		
			
				
					
					|  |  |  | @@ -1609,7 +1630,7 @@ fhandler_console::char_command (char c) | 
		
	
		
			
				|  |  |  |  |     case 'l': | 
		
	
		
			
				|  |  |  |  |       if (!dev_state.saw_question_mark) | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 	  switch (dev_state.args_[0]) | 
		
	
		
			
				|  |  |  |  | 	  switch (dev_state.args[0]) | 
		
	
		
			
				|  |  |  |  | 	    { | 
		
	
		
			
				|  |  |  |  | 	    case 4:    /* Insert mode */ | 
		
	
		
			
				|  |  |  |  | 	      dev_state.insert_mode = (c == 'h') ? true : false; | 
		
	
	
		
			
				
					
					|  |  |  | @@ -1618,7 +1639,7 @@ fhandler_console::char_command (char c) | 
		
	
		
			
				|  |  |  |  | 	    } | 
		
	
		
			
				|  |  |  |  | 	  break; | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |       switch (dev_state.args_[0]) | 
		
	
		
			
				|  |  |  |  |       switch (dev_state.args[0]) | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 	case 25: /* Show/Hide Cursor (DECTCEM) */ | 
		
	
		
			
				|  |  |  |  | 	  { | 
		
	
	
		
			
				
					
					|  |  |  | @@ -1717,23 +1738,23 @@ fhandler_console::char_command (char c) | 
		
	
		
			
				|  |  |  |  | 	  break; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	default: /* Ignore */ | 
		
	
		
			
				|  |  |  |  | 	  syscall_printf ("unknown h/l command: %d", dev_state.args_[0]); | 
		
	
		
			
				|  |  |  |  | 	  syscall_printf ("unknown h/l command: %d", dev_state.args[0]); | 
		
	
		
			
				|  |  |  |  | 	  break; | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |       break; | 
		
	
		
			
				|  |  |  |  |     case 'J': | 
		
	
		
			
				|  |  |  |  |       switch (dev_state.args_[0]) | 
		
	
		
			
				|  |  |  |  |       switch (dev_state.args[0]) | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 	case 0:			/* Clear to end of screen */ | 
		
	
		
			
				|  |  |  |  | 	  clear_screen (cl_curr_pos, cl_curr_pos, cl_disp_end, cl_disp_end); | 
		
	
		
			
				|  |  |  |  | 	  break; | 
		
	
		
			
				|  |  |  |  | 	case 1:			/* Clear from beginning of screen to cursor */ | 
		
	
		
			
				|  |  |  |  | 	  cursor_get (&x, &y); | 
		
	
		
			
				|  |  |  |  | 	  clear_screen (cl_disp_beg, cl_disp_beg, cl_curr_pos, cl_curr_pos); | 
		
	
		
			
				|  |  |  |  | 	  break; | 
		
	
		
			
				|  |  |  |  | 	case 2:			/* Clear screen */ | 
		
	
		
			
				|  |  |  |  | 	  cursor_get (&x, &y); | 
		
	
		
			
				|  |  |  |  | 	  clear_screen (cl_disp_beg, cl_disp_beg, cl_disp_end, cl_disp_end); | 
		
	
		
			
				|  |  |  |  | 	  cursor_set (true, 0, 0); | 
		
	
		
			
				|  |  |  |  | 	  cursor_set (false, x, y); | 
		
	
		
			
				|  |  |  |  | 	  break; | 
		
	
		
			
				|  |  |  |  | 	default: | 
		
	
		
			
				|  |  |  |  | 	  goto bad_escape; | 
		
	
	
		
			
				
					
					|  |  |  | @@ -1741,19 +1762,19 @@ fhandler_console::char_command (char c) | 
		
	
		
			
				|  |  |  |  |       break; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     case 'A': | 
		
	
		
			
				|  |  |  |  |       cursor_rel (0, -(dev_state.args_[0] ? dev_state.args_[0] : 1)); | 
		
	
		
			
				|  |  |  |  |       cursor_rel (0, -(dev_state.args[0] ?: 1)); | 
		
	
		
			
				|  |  |  |  |       break; | 
		
	
		
			
				|  |  |  |  |     case 'B': | 
		
	
		
			
				|  |  |  |  |       cursor_rel (0, dev_state.args_[0] ? dev_state.args_[0] : 1); | 
		
	
		
			
				|  |  |  |  |       cursor_rel (0, dev_state.args[0] ?: 1); | 
		
	
		
			
				|  |  |  |  |       break; | 
		
	
		
			
				|  |  |  |  |     case 'C': | 
		
	
		
			
				|  |  |  |  |       cursor_rel (dev_state.args_[0] ? dev_state.args_[0] : 1, 0); | 
		
	
		
			
				|  |  |  |  |       cursor_rel (dev_state.args[0] ?: 1, 0); | 
		
	
		
			
				|  |  |  |  |       break; | 
		
	
		
			
				|  |  |  |  |     case 'D': | 
		
	
		
			
				|  |  |  |  |       cursor_rel (-(dev_state.args_[0] ? dev_state.args_[0] : 1),0); | 
		
	
		
			
				|  |  |  |  |       cursor_rel (-(dev_state.args[0] ?: 1),0); | 
		
	
		
			
				|  |  |  |  |       break; | 
		
	
		
			
				|  |  |  |  |     case 'K': | 
		
	
		
			
				|  |  |  |  |       switch (dev_state.args_[0]) | 
		
	
		
			
				|  |  |  |  |       switch (dev_state.args[0]) | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 	  case 0:		/* Clear to end of line */ | 
		
	
		
			
				|  |  |  |  | 	    clear_screen (cl_curr_pos, cl_curr_pos, cl_disp_end, cl_curr_pos); | 
		
	
	
		
			
				
					
					|  |  |  | @@ -1770,20 +1791,20 @@ fhandler_console::char_command (char c) | 
		
	
		
			
				|  |  |  |  |       break; | 
		
	
		
			
				|  |  |  |  |     case 'H': | 
		
	
		
			
				|  |  |  |  |     case 'f': | 
		
	
		
			
				|  |  |  |  |       cursor_set (true, (dev_state.args_[1] ? dev_state.args_[1] : 1) - 1, | 
		
	
		
			
				|  |  |  |  | 			(dev_state.args_[0] ? dev_state.args_[0] : 1) - 1); | 
		
	
		
			
				|  |  |  |  |       cursor_set (true, (dev_state.args[1] ?: 1) - 1, | 
		
	
		
			
				|  |  |  |  | 			(dev_state.args[0] ?: 1) - 1); | 
		
	
		
			
				|  |  |  |  |       break; | 
		
	
		
			
				|  |  |  |  |     case 'G':   /* hpa - position cursor at column n - 1 */ | 
		
	
		
			
				|  |  |  |  |       cursor_get (&x, &y); | 
		
	
		
			
				|  |  |  |  |       cursor_set (false, (dev_state.args_[0] ? dev_state.args_[0] - 1 : 0), y); | 
		
	
		
			
				|  |  |  |  |       cursor_set (false, (dev_state.args[0] ? dev_state.args[0] - 1 : 0), y); | 
		
	
		
			
				|  |  |  |  |       break; | 
		
	
		
			
				|  |  |  |  |     case 'd':   /* vpa - position cursor at line n */ | 
		
	
		
			
				|  |  |  |  |       cursor_get (&x, &y); | 
		
	
		
			
				|  |  |  |  |       cursor_set (true, x, (dev_state.args_[0] ? dev_state.args_[0] - 1 : 0)); | 
		
	
		
			
				|  |  |  |  |       cursor_set (true, x, (dev_state.args[0] ? dev_state.args[0] - 1 : 0)); | 
		
	
		
			
				|  |  |  |  |       break; | 
		
	
		
			
				|  |  |  |  |     case 's':   /* Save cursor position */ | 
		
	
		
			
				|  |  |  |  |       cursor_get (&dev_state.savex, &dev_state.savey); | 
		
	
		
			
				|  |  |  |  |       dev_state.savey -= dev_state.info.winTop; | 
		
	
		
			
				|  |  |  |  |       dev_state.savey -= dev_state.winTop; | 
		
	
		
			
				|  |  |  |  |       break; | 
		
	
		
			
				|  |  |  |  |     case 'u':   /* Restore cursor position */ | 
		
	
		
			
				|  |  |  |  |       cursor_set (true, dev_state.savex, dev_state.savey); | 
		
	
	
		
			
				
					
					|  |  |  | @@ -1793,39 +1814,39 @@ fhandler_console::char_command (char c) | 
		
	
		
			
				|  |  |  |  |       cursor_set (false, 8 * (x / 8 + 1), y); | 
		
	
		
			
				|  |  |  |  |       break; | 
		
	
		
			
				|  |  |  |  |     case 'L':				/* AL - insert blank lines */ | 
		
	
		
			
				|  |  |  |  |       dev_state.args_[0] = dev_state.args_[0] ? dev_state.args_[0] : 1; | 
		
	
		
			
				|  |  |  |  |       n = dev_state.args[0] ?: 1; | 
		
	
		
			
				|  |  |  |  |       cursor_get (&x, &y); | 
		
	
		
			
				|  |  |  |  |       scroll_screen (0, y, -1, -1, 0, y + dev_state.args_[0]); | 
		
	
		
			
				|  |  |  |  |       scroll_buffer (0, y, -1, -1, 0, y + n); | 
		
	
		
			
				|  |  |  |  |       break; | 
		
	
		
			
				|  |  |  |  |     case 'M':				/* DL - delete lines */ | 
		
	
		
			
				|  |  |  |  |       dev_state.args_[0] = dev_state.args_[0] ? dev_state.args_[0] : 1; | 
		
	
		
			
				|  |  |  |  |       n = dev_state.args[0] ?: 1; | 
		
	
		
			
				|  |  |  |  |       cursor_get (&x, &y); | 
		
	
		
			
				|  |  |  |  |       scroll_screen (0, y + dev_state.args_[0], -1, -1, 0, y); | 
		
	
		
			
				|  |  |  |  |       scroll_buffer (0, y + dev_state.args[0], -1, -1, 0, y); | 
		
	
		
			
				|  |  |  |  |       break; | 
		
	
		
			
				|  |  |  |  |     case '@':				/* IC - insert chars */ | 
		
	
		
			
				|  |  |  |  |       dev_state.args_[0] = dev_state.args_[0] ? dev_state.args_[0] : 1; | 
		
	
		
			
				|  |  |  |  |       n = dev_state.args[0] ?: 1; | 
		
	
		
			
				|  |  |  |  |       cursor_get (&x, &y); | 
		
	
		
			
				|  |  |  |  |       scroll_screen (x, y, -1, y, x + dev_state.args_[0], y); | 
		
	
		
			
				|  |  |  |  |       scroll_buffer (x, y, -1, y, x + n, y); | 
		
	
		
			
				|  |  |  |  |       break; | 
		
	
		
			
				|  |  |  |  |     case 'P':				/* DC - delete chars */ | 
		
	
		
			
				|  |  |  |  |       dev_state.args_[0] = dev_state.args_[0] ? dev_state.args_[0] : 1; | 
		
	
		
			
				|  |  |  |  |       n = dev_state.args[0] ?: 1; | 
		
	
		
			
				|  |  |  |  |       cursor_get (&x, &y); | 
		
	
		
			
				|  |  |  |  |       scroll_screen (x + dev_state.args_[0], y, -1, y, x, y); | 
		
	
		
			
				|  |  |  |  |       scroll_buffer (x + n, y, -1, y, x, y); | 
		
	
		
			
				|  |  |  |  |       break; | 
		
	
		
			
				|  |  |  |  |     case 'S':				/* SF - Scroll forward */ | 
		
	
		
			
				|  |  |  |  |       dev_state.args_[0] = dev_state.args_[0] ? dev_state.args_[0] : 1; | 
		
	
		
			
				|  |  |  |  |       scroll_screen (0, dev_state.args_[0], -1, -1, 0, 0); | 
		
	
		
			
				|  |  |  |  |       n = dev_state.args[0] ?: 1; | 
		
	
		
			
				|  |  |  |  |       scroll_buffer (0, n, -1, -1, 0, 0); | 
		
	
		
			
				|  |  |  |  |       break; | 
		
	
		
			
				|  |  |  |  |     case 'T':				/* SR - Scroll down */ | 
		
	
		
			
				|  |  |  |  |       dev_state.fillin_info (get_output_handle ()); | 
		
	
		
			
				|  |  |  |  |       dev_state.args_[0] = dev_state.args_[0] ? dev_state.args_[0] : 1; | 
		
	
		
			
				|  |  |  |  |       scroll_screen (0, 0, -1, -1, 0, dev_state.info.winTop + dev_state.args_[0]); | 
		
	
		
			
				|  |  |  |  |       dev_state.fillin (get_output_handle ()); | 
		
	
		
			
				|  |  |  |  |       n = dev_state.winTop + dev_state.args[0] ?: 1; | 
		
	
		
			
				|  |  |  |  |       scroll_buffer (0, dev_state.winTop, -1, -1, 0, n); | 
		
	
		
			
				|  |  |  |  |       break; | 
		
	
		
			
				|  |  |  |  |     case 'X':				/* ec - erase chars */ | 
		
	
		
			
				|  |  |  |  |       dev_state.args_[0] = dev_state.args_[0] ? dev_state.args_[0] : 1; | 
		
	
		
			
				|  |  |  |  |       n = dev_state.args[0] ?: 1; | 
		
	
		
			
				|  |  |  |  |       cursor_get (&x, &y); | 
		
	
		
			
				|  |  |  |  |       scroll_screen (x + dev_state.args_[0], y, -1, y, x, y); | 
		
	
		
			
				|  |  |  |  |       scroll_screen (x, y, -1, y, x + dev_state.args_[0], y); | 
		
	
		
			
				|  |  |  |  |       scroll_buffer (x + n, y, -1, y, x, y); | 
		
	
		
			
				|  |  |  |  |       scroll_buffer (x, y, -1, y, x + n, y); | 
		
	
		
			
				|  |  |  |  |       break; | 
		
	
		
			
				|  |  |  |  |     case 'Z':				/* Back tab */ | 
		
	
		
			
				|  |  |  |  |       cursor_get (&x, &y); | 
		
	
	
		
			
				
					
					|  |  |  | @@ -1835,10 +1856,10 @@ fhandler_console::char_command (char c) | 
		
	
		
			
				|  |  |  |  |       if (dev_state.insert_mode) | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 	  cursor_get (&x, &y); | 
		
	
		
			
				|  |  |  |  | 	  scroll_screen (x, y, -1, y, x + dev_state.args_[1], y); | 
		
	
		
			
				|  |  |  |  | 	  scroll_buffer (x, y, -1, y, x + dev_state.args[1], y); | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |       while (dev_state.args_[1]--) | 
		
	
		
			
				|  |  |  |  | 	WriteFile (get_output_handle (), &dev_state.args_[0], 1, (DWORD *) &x, 0); | 
		
	
		
			
				|  |  |  |  |       while (dev_state.args[1]--) | 
		
	
		
			
				|  |  |  |  | 	WriteFile (get_output_handle (), &dev_state.args[0], 1, (DWORD *) &x, 0); | 
		
	
		
			
				|  |  |  |  |       break; | 
		
	
		
			
				|  |  |  |  |     case 'c':				/* u9 - Terminal enquire string */ | 
		
	
		
			
				|  |  |  |  |       if (dev_state.saw_greater_than_sign) | 
		
	
	
		
			
				
					
					|  |  |  | @@ -1854,12 +1875,12 @@ fhandler_console::char_command (char c) | 
		
	
		
			
				|  |  |  |  |       puts_readahead (buf); | 
		
	
		
			
				|  |  |  |  |       break; | 
		
	
		
			
				|  |  |  |  |     case 'n': | 
		
	
		
			
				|  |  |  |  |       switch (dev_state.args_[0]) | 
		
	
		
			
				|  |  |  |  |       switch (dev_state.args[0]) | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 	case 6:				/* u7 - Cursor position request */ | 
		
	
		
			
				|  |  |  |  | 	  cursor_get (&x, &y); | 
		
	
		
			
				|  |  |  |  | 	  y -= dev_state.info.winTop; | 
		
	
		
			
				|  |  |  |  | 	  /* x -= dev_state.info.winLeft;		// not available yet */ | 
		
	
		
			
				|  |  |  |  | 	  y -= dev_state.winTop; | 
		
	
		
			
				|  |  |  |  | 	  /* x -= dev_state.winLeft;		// not available yet */ | 
		
	
		
			
				|  |  |  |  | 	  __small_sprintf (buf, "\033[%d;%dR", y + 1, x + 1); | 
		
	
		
			
				|  |  |  |  | 	  puts_readahead (buf); | 
		
	
		
			
				|  |  |  |  | 	  break; | 
		
	
	
		
			
				
					
					|  |  |  | @@ -1868,8 +1889,8 @@ fhandler_console::char_command (char c) | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |       break; | 
		
	
		
			
				|  |  |  |  |     case 'r':				/* Set Scroll region */ | 
		
	
		
			
				|  |  |  |  |       dev_state.scroll_region.Top = dev_state.args_[0] ? dev_state.args_[0] - 1 : 0; | 
		
	
		
			
				|  |  |  |  |       dev_state.scroll_region.Bottom = dev_state.args_[1] ? dev_state.args_[1] - 1 : -1; | 
		
	
		
			
				|  |  |  |  |       dev_state.scroll_region.Top = dev_state.args[0] ? dev_state.args[0] - 1 : 0; | 
		
	
		
			
				|  |  |  |  |       dev_state.scroll_region.Bottom = dev_state.args[1] ? dev_state.args[1] - 1 : -1; | 
		
	
		
			
				|  |  |  |  |       cursor_set (true, 0, 0); | 
		
	
		
			
				|  |  |  |  |       break; | 
		
	
		
			
				|  |  |  |  |     case 'g':				/* TAB set/clear */ | 
		
	
	
		
			
				
					
					|  |  |  | @@ -2011,7 +2032,7 @@ do_print: | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 	  int x, y; | 
		
	
		
			
				|  |  |  |  | 	  cursor_get (&x, &y); | 
		
	
		
			
				|  |  |  |  | 	  scroll_screen (x, y, -1, y, x + buf_len, y); | 
		
	
		
			
				|  |  |  |  | 	  scroll_buffer (x, y, -1, y, x + buf_len, y); | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |       if (!write_console (write_buf, buf_len, done)) | 
		
	
	
		
			
				
					
					|  |  |  | @@ -2041,17 +2062,17 @@ do_print: | 
		
	
		
			
				|  |  |  |  | 	  beep (); | 
		
	
		
			
				|  |  |  |  | 	  break; | 
		
	
		
			
				|  |  |  |  | 	case ESC: | 
		
	
		
			
				|  |  |  |  | 	  dev_state.state_ = gotesc; | 
		
	
		
			
				|  |  |  |  | 	  dev_state.state = gotesc; | 
		
	
		
			
				|  |  |  |  | 	  break; | 
		
	
		
			
				|  |  |  |  | 	case DWN: | 
		
	
		
			
				|  |  |  |  | 	  cursor_get (&x, &y); | 
		
	
		
			
				|  |  |  |  | 	  if (y >= srBottom) | 
		
	
		
			
				|  |  |  |  | 	    { | 
		
	
		
			
				|  |  |  |  | 	      if (y >= dev_state.info.winBottom && !dev_state.scroll_region.Top) | 
		
	
		
			
				|  |  |  |  | 	      if (y >= dev_state.winBottom && !dev_state.scroll_region.Top) | 
		
	
		
			
				|  |  |  |  | 		WriteConsoleW (get_output_handle (), L"\n", 1, &done, 0); | 
		
	
		
			
				|  |  |  |  | 	      else | 
		
	
		
			
				|  |  |  |  | 		{ | 
		
	
		
			
				|  |  |  |  | 		  scroll_screen (0, srTop + 1, -1, srBottom, 0, srTop); | 
		
	
		
			
				|  |  |  |  | 		  scroll_buffer (0, srTop + 1, -1, srBottom, 0, srTop); | 
		
	
		
			
				|  |  |  |  | 		  y--; | 
		
	
		
			
				|  |  |  |  | 		} | 
		
	
		
			
				|  |  |  |  | 	    } | 
		
	
	
		
			
				
					
					|  |  |  | @@ -2123,8 +2144,8 @@ fhandler_console::write (const void *vsrc, size_t len) | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   while (src < end) | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |       paranoid_printf ("char %0c state is %d", *src, dev_state.state_); | 
		
	
		
			
				|  |  |  |  |       switch (dev_state.state_) | 
		
	
		
			
				|  |  |  |  |       paranoid_printf ("char %0c state is %d", *src, dev_state.state); | 
		
	
		
			
				|  |  |  |  |       switch (dev_state.state) | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 	case normal: | 
		
	
		
			
				|  |  |  |  | 	  src = write_normal (src, end); | 
		
	
	
		
			
				
					
					|  |  |  | @@ -2134,33 +2155,33 @@ fhandler_console::write (const void *vsrc, size_t len) | 
		
	
		
			
				|  |  |  |  | 	case gotesc: | 
		
	
		
			
				|  |  |  |  | 	  if (*src == '[')		/* CSI Control Sequence Introducer */ | 
		
	
		
			
				|  |  |  |  | 	    { | 
		
	
		
			
				|  |  |  |  | 	      dev_state.state_ = gotsquare; | 
		
	
		
			
				|  |  |  |  | 	      dev_state.state = gotsquare; | 
		
	
		
			
				|  |  |  |  | 	      dev_state.saw_question_mark = false; | 
		
	
		
			
				|  |  |  |  | 	      dev_state.saw_greater_than_sign = false; | 
		
	
		
			
				|  |  |  |  | 	      dev_state.saw_space = false; | 
		
	
		
			
				|  |  |  |  | 	      for (dev_state.nargs_ = 0; dev_state.nargs_ < MAXARGS; dev_state.nargs_++) | 
		
	
		
			
				|  |  |  |  | 		dev_state.args_[dev_state.nargs_] = 0; | 
		
	
		
			
				|  |  |  |  | 	      dev_state.nargs_ = 0; | 
		
	
		
			
				|  |  |  |  | 	      for (dev_state.nargs = 0; dev_state.nargs < MAXARGS; dev_state.nargs++) | 
		
	
		
			
				|  |  |  |  | 		dev_state.args[dev_state.nargs] = 0; | 
		
	
		
			
				|  |  |  |  | 	      dev_state.nargs = 0; | 
		
	
		
			
				|  |  |  |  | 	    } | 
		
	
		
			
				|  |  |  |  | 	  else if (*src == ']')		/* OSC Operating System Command */ | 
		
	
		
			
				|  |  |  |  | 	    { | 
		
	
		
			
				|  |  |  |  | 	      dev_state.rarg = 0; | 
		
	
		
			
				|  |  |  |  | 	      dev_state.my_title_buf[0] = '\0'; | 
		
	
		
			
				|  |  |  |  | 	      dev_state.state_ = gotrsquare; | 
		
	
		
			
				|  |  |  |  | 	      dev_state.state = gotrsquare; | 
		
	
		
			
				|  |  |  |  | 	    } | 
		
	
		
			
				|  |  |  |  | 	  else if (*src == '(')		/* Designate G0 character set */ | 
		
	
		
			
				|  |  |  |  | 	    { | 
		
	
		
			
				|  |  |  |  | 	      dev_state.state_ = gotparen; | 
		
	
		
			
				|  |  |  |  | 	      dev_state.state = gotparen; | 
		
	
		
			
				|  |  |  |  | 	    } | 
		
	
		
			
				|  |  |  |  | 	  else if (*src == ')')		/* Designate G1 character set */ | 
		
	
		
			
				|  |  |  |  | 	    { | 
		
	
		
			
				|  |  |  |  | 	      dev_state.state_ = gotrparen; | 
		
	
		
			
				|  |  |  |  | 	      dev_state.state = gotrparen; | 
		
	
		
			
				|  |  |  |  | 	    } | 
		
	
		
			
				|  |  |  |  | 	  else if (*src == 'M')		/* Reverse Index (scroll down) */ | 
		
	
		
			
				|  |  |  |  | 	    { | 
		
	
		
			
				|  |  |  |  | 	      dev_state.fillin_info (get_output_handle ()); | 
		
	
		
			
				|  |  |  |  | 	      scroll_screen (0, 0, -1, -1, 0, dev_state.info.winTop + 1); | 
		
	
		
			
				|  |  |  |  | 	      dev_state.state_ = normal; | 
		
	
		
			
				|  |  |  |  | 	      dev_state.fillin (get_output_handle ()); | 
		
	
		
			
				|  |  |  |  | 	      scroll_buffer (0, 0, -1, -1, 0, dev_state.winTop + 1); | 
		
	
		
			
				|  |  |  |  | 	      dev_state.state = normal; | 
		
	
		
			
				|  |  |  |  | 	    } | 
		
	
		
			
				|  |  |  |  | 	  else if (*src == 'c')		/* RIS Full Reset */ | 
		
	
		
			
				|  |  |  |  | 	    { | 
		
	
	
		
			
				
					
					|  |  |  | @@ -2170,60 +2191,60 @@ fhandler_console::write (const void *vsrc, size_t len) | 
		
	
		
			
				|  |  |  |  | 	      dev_state.iso_2022_G1 = false; | 
		
	
		
			
				|  |  |  |  | 	      cursor_set (false, 0, 0); | 
		
	
		
			
				|  |  |  |  | 	      clear_screen (cl_buf_beg, cl_buf_beg, cl_buf_end, cl_buf_end); | 
		
	
		
			
				|  |  |  |  | 	      dev_state.state_ = normal; | 
		
	
		
			
				|  |  |  |  | 	      dev_state.state = normal; | 
		
	
		
			
				|  |  |  |  | 	    } | 
		
	
		
			
				|  |  |  |  | 	  else if (*src == '8')		/* DECRC Restore cursor position */ | 
		
	
		
			
				|  |  |  |  | 	    { | 
		
	
		
			
				|  |  |  |  | 	      cursor_set (true, dev_state.savex, dev_state.savey); | 
		
	
		
			
				|  |  |  |  | 	      dev_state.state_ = normal; | 
		
	
		
			
				|  |  |  |  | 	      dev_state.state = normal; | 
		
	
		
			
				|  |  |  |  | 	    } | 
		
	
		
			
				|  |  |  |  | 	  else if (*src == '7')		/* DECSC Save cursor position */ | 
		
	
		
			
				|  |  |  |  | 	    { | 
		
	
		
			
				|  |  |  |  | 	      cursor_get (&dev_state.savex, &dev_state.savey); | 
		
	
		
			
				|  |  |  |  | 	      dev_state.savey -= dev_state.info.winTop; | 
		
	
		
			
				|  |  |  |  | 	      dev_state.state_ = normal; | 
		
	
		
			
				|  |  |  |  | 	      dev_state.savey -= dev_state.winTop; | 
		
	
		
			
				|  |  |  |  | 	      dev_state.state = normal; | 
		
	
		
			
				|  |  |  |  | 	    } | 
		
	
		
			
				|  |  |  |  | 	  else if (*src == 'R')		/* ? */ | 
		
	
		
			
				|  |  |  |  | 	      dev_state.state_ = normal; | 
		
	
		
			
				|  |  |  |  | 	      dev_state.state = normal; | 
		
	
		
			
				|  |  |  |  | 	  else | 
		
	
		
			
				|  |  |  |  | 	    { | 
		
	
		
			
				|  |  |  |  | 	      dev_state.state_ = normal; | 
		
	
		
			
				|  |  |  |  | 	      dev_state.state = normal; | 
		
	
		
			
				|  |  |  |  | 	    } | 
		
	
		
			
				|  |  |  |  | 	  src++; | 
		
	
		
			
				|  |  |  |  | 	  break; | 
		
	
		
			
				|  |  |  |  | 	case gotarg1: | 
		
	
		
			
				|  |  |  |  | 	  if (isdigit (*src)) | 
		
	
		
			
				|  |  |  |  | 	    { | 
		
	
		
			
				|  |  |  |  | 	      dev_state.args_[dev_state.nargs_] = dev_state.args_[dev_state.nargs_] * 10 + *src - '0'; | 
		
	
		
			
				|  |  |  |  | 	      dev_state.args[dev_state.nargs] = dev_state.args[dev_state.nargs] * 10 + *src - '0'; | 
		
	
		
			
				|  |  |  |  | 	      src++; | 
		
	
		
			
				|  |  |  |  | 	    } | 
		
	
		
			
				|  |  |  |  | 	  else if (*src == ';') | 
		
	
		
			
				|  |  |  |  | 	    { | 
		
	
		
			
				|  |  |  |  | 	      src++; | 
		
	
		
			
				|  |  |  |  | 	      dev_state.nargs_++; | 
		
	
		
			
				|  |  |  |  | 	      if (dev_state.nargs_ >= MAXARGS) | 
		
	
		
			
				|  |  |  |  | 		dev_state.nargs_--; | 
		
	
		
			
				|  |  |  |  | 	      dev_state.nargs++; | 
		
	
		
			
				|  |  |  |  | 	      if (dev_state.nargs >= MAXARGS) | 
		
	
		
			
				|  |  |  |  | 		dev_state.nargs--; | 
		
	
		
			
				|  |  |  |  | 	    } | 
		
	
		
			
				|  |  |  |  | 	  else if (*src == ' ') | 
		
	
		
			
				|  |  |  |  | 	    { | 
		
	
		
			
				|  |  |  |  | 	      src++; | 
		
	
		
			
				|  |  |  |  | 	      dev_state.saw_space = true; | 
		
	
		
			
				|  |  |  |  | 	      dev_state.state_ = gotcommand; | 
		
	
		
			
				|  |  |  |  | 	      dev_state.state = gotcommand; | 
		
	
		
			
				|  |  |  |  | 	    } | 
		
	
		
			
				|  |  |  |  | 	  else | 
		
	
		
			
				|  |  |  |  | 	    dev_state.state_ = gotcommand; | 
		
	
		
			
				|  |  |  |  | 	    dev_state.state = gotcommand; | 
		
	
		
			
				|  |  |  |  | 	  break; | 
		
	
		
			
				|  |  |  |  | 	case gotcommand: | 
		
	
		
			
				|  |  |  |  | 	  char_command (*src++); | 
		
	
		
			
				|  |  |  |  | 	  dev_state.state_ = normal; | 
		
	
		
			
				|  |  |  |  | 	  dev_state.state = normal; | 
		
	
		
			
				|  |  |  |  | 	  break; | 
		
	
		
			
				|  |  |  |  | 	case gotrsquare: | 
		
	
		
			
				|  |  |  |  | 	  if (isdigit (*src)) | 
		
	
		
			
				|  |  |  |  | 	    dev_state.rarg = dev_state.rarg * 10 + (*src - '0'); | 
		
	
		
			
				|  |  |  |  | 	  else if (*src == ';' && (dev_state.rarg == 2 || dev_state.rarg == 0)) | 
		
	
		
			
				|  |  |  |  | 	    dev_state.state_ = gettitle; | 
		
	
		
			
				|  |  |  |  | 	    dev_state.state = gettitle; | 
		
	
		
			
				|  |  |  |  | 	  else | 
		
	
		
			
				|  |  |  |  | 	    dev_state.state_ = eattitle; | 
		
	
		
			
				|  |  |  |  | 	    dev_state.state = eattitle; | 
		
	
		
			
				|  |  |  |  | 	  src++; | 
		
	
		
			
				|  |  |  |  | 	  break; | 
		
	
		
			
				|  |  |  |  | 	case eattitle: | 
		
	
	
		
			
				
					
					|  |  |  | @@ -2232,9 +2253,9 @@ fhandler_console::write (const void *vsrc, size_t len) | 
		
	
		
			
				|  |  |  |  | 	    int n = strlen (dev_state.my_title_buf); | 
		
	
		
			
				|  |  |  |  | 	    if (*src < ' ') | 
		
	
		
			
				|  |  |  |  | 	      { | 
		
	
		
			
				|  |  |  |  | 		if (*src == '\007' && dev_state.state_ == gettitle) | 
		
	
		
			
				|  |  |  |  | 		if (*src == '\007' && dev_state.state == gettitle) | 
		
	
		
			
				|  |  |  |  | 		  set_console_title (dev_state.my_title_buf); | 
		
	
		
			
				|  |  |  |  | 		dev_state.state_ = normal; | 
		
	
		
			
				|  |  |  |  | 		dev_state.state = normal; | 
		
	
		
			
				|  |  |  |  | 	      } | 
		
	
		
			
				|  |  |  |  | 	    else if (n < TITLESIZE) | 
		
	
		
			
				|  |  |  |  | 	      { | 
		
	
	
		
			
				
					
					|  |  |  | @@ -2247,12 +2268,12 @@ fhandler_console::write (const void *vsrc, size_t len) | 
		
	
		
			
				|  |  |  |  | 	case gotsquare: | 
		
	
		
			
				|  |  |  |  | 	  if (*src == ';') | 
		
	
		
			
				|  |  |  |  | 	    { | 
		
	
		
			
				|  |  |  |  | 	      dev_state.state_ = gotarg1; | 
		
	
		
			
				|  |  |  |  | 	      dev_state.nargs_++; | 
		
	
		
			
				|  |  |  |  | 	      dev_state.state = gotarg1; | 
		
	
		
			
				|  |  |  |  | 	      dev_state.nargs++; | 
		
	
		
			
				|  |  |  |  | 	      src++; | 
		
	
		
			
				|  |  |  |  | 	    } | 
		
	
		
			
				|  |  |  |  | 	  else if (isalpha (*src)) | 
		
	
		
			
				|  |  |  |  | 	    dev_state.state_ = gotcommand; | 
		
	
		
			
				|  |  |  |  | 	    dev_state.state = gotcommand; | 
		
	
		
			
				|  |  |  |  | 	  else if (*src != '@' && !isalpha (*src) && !isdigit (*src)) | 
		
	
		
			
				|  |  |  |  | 	    { | 
		
	
		
			
				|  |  |  |  | 	      if (*src == '?') | 
		
	
	
		
			
				
					
					|  |  |  | @@ -2263,14 +2284,14 @@ fhandler_console::write (const void *vsrc, size_t len) | 
		
	
		
			
				|  |  |  |  | 	      src++; | 
		
	
		
			
				|  |  |  |  | 	    } | 
		
	
		
			
				|  |  |  |  | 	  else | 
		
	
		
			
				|  |  |  |  | 	    dev_state.state_ = gotarg1; | 
		
	
		
			
				|  |  |  |  | 	    dev_state.state = gotarg1; | 
		
	
		
			
				|  |  |  |  | 	  break; | 
		
	
		
			
				|  |  |  |  | 	case gotparen:	/* Designate G0 Character Set (ISO 2022) */ | 
		
	
		
			
				|  |  |  |  | 	  if (*src == '0') | 
		
	
		
			
				|  |  |  |  | 	    dev_state.vt100_graphics_mode_G0 = true; | 
		
	
		
			
				|  |  |  |  | 	  else | 
		
	
		
			
				|  |  |  |  | 	    dev_state.vt100_graphics_mode_G0 = false; | 
		
	
		
			
				|  |  |  |  | 	  dev_state.state_ = normal; | 
		
	
		
			
				|  |  |  |  | 	  dev_state.state = normal; | 
		
	
		
			
				|  |  |  |  | 	  src++; | 
		
	
		
			
				|  |  |  |  | 	  break; | 
		
	
		
			
				|  |  |  |  | 	case gotrparen:	/* Designate G1 Character Set (ISO 2022) */ | 
		
	
	
		
			
				
					
					|  |  |  | @@ -2278,7 +2299,7 @@ fhandler_console::write (const void *vsrc, size_t len) | 
		
	
		
			
				|  |  |  |  | 	    dev_state.vt100_graphics_mode_G1 = true; | 
		
	
		
			
				|  |  |  |  | 	  else | 
		
	
		
			
				|  |  |  |  | 	    dev_state.vt100_graphics_mode_G1 = false; | 
		
	
		
			
				|  |  |  |  | 	  dev_state.state_ = normal; | 
		
	
		
			
				|  |  |  |  | 	  dev_state.state = normal; | 
		
	
		
			
				|  |  |  |  | 	  src++; | 
		
	
		
			
				|  |  |  |  | 	  break; | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
	
		
			
				
					
					|  |  |  |   |