⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fhandler_console.cc

📁 cygwin, 著名的在win32下模拟unix操作系统的东东
💻 CC
📖 第 1 页 / 共 4 页
字号:
    win_fg |= FOREGROUND_INTENSITY;  return (win_fg | win_bg);}/* * Clear the screen context from x1/y1 to x2/y2 cell. * Negative values represents current screen dimensions */voidfhandler_console::clear_screen (int x1, int y1, int x2, int y2){  COORD tlc;  DWORD done;  int num;  (void)fillin_info ();  if (x1 < 0)    x1 = dev_state->info.dwWinSize.X - 1;  if (y1 < 0)    y1 = dev_state->info.winBottom;  if (x2 < 0)    x2 = dev_state->info.dwWinSize.X - 1;  if (y2 < 0)    y2 = dev_state->info.winBottom;  num = abs (y1 - y2) * dev_state->info.dwBufferSize.X + abs (x1 - x2) + 1;  if ((y2 * dev_state->info.dwBufferSize.X + x2) > (y1 * dev_state->info.dwBufferSize.X + x1))    {      tlc.X = x1;      tlc.Y = y1;    }  else    {      tlc.X = x2;      tlc.Y = y2;    }  FillConsoleOutputCharacterA (get_output_handle (), ' ',			       num,			       tlc,			       &done);  FillConsoleOutputAttribute (get_output_handle (),			       dev_state->current_win32_attr,			       num,			       tlc,			       &done);}voidfhandler_console::cursor_set (BOOL rel_to_top, int x, int y){  COORD pos;  (void) fillin_info ();  if (y > dev_state->info.winBottom)    y = dev_state->info.winBottom;  else if (y < 0)    y = 0;  else if (rel_to_top)    y += dev_state->info.winTop;  if (x > dev_state->info.dwWinSize.X)    x = dev_state->info.dwWinSize.X - 1;  else if (x < 0)    x = 0;  pos.X = x;  pos.Y = y;  SetConsoleCursorPosition (get_output_handle (), pos);}voidfhandler_console::cursor_rel (int x, int y){  fillin_info ();  x += dev_state->info.dwCursorPosition.X;  y += dev_state->info.dwCursorPosition.Y;  cursor_set (FALSE, x, y);}voidfhandler_console::cursor_get (int *x, int *y){  fillin_info ();  *y = dev_state->info.dwCursorPosition.Y;  *x = dev_state->info.dwCursorPosition.X;}#define BAK 1#define ESC 2#define NOR 0#define IGN 4#if 0#define ERR 5#else#define ERR NOR#endif#define DWN 6#define BEL 7#define TAB 8 /* We should't let the console deal with these */#define CR 13#define LF 10static const char base_chars[256] ={/*00 01 02 03 04 05 06 07 */ IGN, ERR, ERR, NOR, NOR, NOR, NOR, BEL,/*08 09 0A 0B 0C 0D 0E 0F */ BAK, TAB, DWN, ERR, ERR, CR,  ERR, IGN,/*10 11 12 13 14 15 16 17 */ NOR, NOR, ERR, ERR, ERR, ERR, ERR, ERR,/*18 19 1A 1B 1C 1D 1E 1F */ NOR, NOR, ERR, ESC, ERR, ERR, ERR, ERR,/*   !  "  #  $  %  &  '  */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,/*()  *  +  ,  -  .  /  */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,/*0  1  2  3  4  5  6  7  */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,/*8  9  :  ;  <  =  >  ?  */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,/*@  A  B  C  D  E  F  G  */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,/*H  I  J  K  L  M  N  O  */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,/*P  Q  R  S  T  U  V  W  */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,/*X  Y  Z  [  \  ]  ^  _  */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,/*`  a  b  c  d  e  f  g  */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,/*h  i  j  k  l  m  n  o  */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,/*p  q  r  s  t  u  v  w  */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,/*x  y  z  {  |  }  ~  7F */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,/*80 81 82 83 84 85 86 87 */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,/*88 89 8A 8B 8C 8D 8E 8F */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,/*90 91 92 93 94 95 96 97 */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,/*98 99 9A 9B 9C 9D 9E 9F */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,/*A0 A1 A2 A3 A4 A5 A6 A7 */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,/*A8 A9 AA AB AC AD AE AF */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,/*B0 B1 B2 B3 B4 B5 B6 B7 */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,/*B8 B9 BA BB BC BD BE BF */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,/*C0 C1 C2 C3 C4 C5 C6 C7 */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,/*C8 C9 CA CB CC CD CE CF */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,/*D0 D1 D2 D3 D4 D5 D6 D7 */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,/*D8 D9 DA DB DC DD DE DF */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,/*E0 E1 E2 E3 E4 E5 E6 E7 */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,/*E8 E9 EA EB EC ED EE EF */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,/*F0 F1 F2 F3 F4 F5 F6 F7 */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,/*F8 F9 FA FB FC FD FE FF */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR };voidfhandler_console::char_command (char c){  int x, y;  char buf[40];  switch (c)    {    case 'm':   /* Set Graphics Rendition */       int i;       for (i = 0; i <= dev_state->nargs_; i++)	 switch (dev_state->args_[i])	   {	     case 0:    /* normal color */	       set_default_attr ();	       break;	     case 1:    /* bold */	       dev_state->intensity = INTENSITY_BOLD;	       break;	     case 4:	       dev_state->underline = 1;	       break;	     case 5:    /* blink mode */	       dev_state->blink = TRUE;	       break;	     case 7:    /* reverse */	       dev_state->reverse = TRUE;	       break;	     case 8:    /* invisible */	       dev_state->intensity = INTENSITY_INVISIBLE;	       break;	     case 9:    /* dim */	       dev_state->intensity = INTENSITY_DIM;	       break;	     case 24:	       dev_state->underline = FALSE;	       break;	     case 27:	       dev_state->reverse = FALSE;	       break;	     case 30:		/* BLACK foreground */	       dev_state->fg = 0;	       break;	     case 31:		/* RED foreground */	       dev_state->fg = FOREGROUND_RED;	       break;	     case 32:		/* GREEN foreground */	       dev_state->fg = FOREGROUND_GREEN;	       break;	     case 33:		/* YELLOW foreground */	       dev_state->fg = FOREGROUND_RED | FOREGROUND_GREEN;	       break;	     case 34:		/* BLUE foreground */	       dev_state->fg = FOREGROUND_BLUE;	       break;	     case 35:		/* MAGENTA foreground */	       dev_state->fg = FOREGROUND_RED | FOREGROUND_BLUE;	       break;	     case 36:		/* CYAN foreground */	       dev_state->fg = FOREGROUND_BLUE | FOREGROUND_GREEN;	       break;	     case 37:		/* WHITE foreg */	       dev_state->fg = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED;	       break;	     case 39:	       dev_state->fg = dev_state->default_color & FOREGROUND_ATTR_MASK;	       break;	     case 40:		/* BLACK background */	       dev_state->bg = 0;	       break;	     case 41:		/* RED background */	       dev_state->bg = BACKGROUND_RED;	       break;	     case 42:		/* GREEN background */	       dev_state->bg = BACKGROUND_GREEN;	       break;	     case 43:		/* YELLOW background */	       dev_state->bg = BACKGROUND_RED | BACKGROUND_GREEN;	       break;	     case 44:		/* BLUE background */	       dev_state->bg = BACKGROUND_BLUE;	       break;	     case 45:		/* MAGENTA background */	       dev_state->bg = BACKGROUND_RED | BACKGROUND_BLUE;	       break;	     case 46:		/* CYAN background */	       dev_state->bg = BACKGROUND_BLUE | BACKGROUND_GREEN;	       break;	     case 47:    /* WHITE background */	       dev_state->bg = BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED;	       break;	     case 49:	       dev_state->bg = dev_state->default_color & BACKGROUND_ATTR_MASK;	       break;	   }	 dev_state->current_win32_attr = get_win32_attr ();	 SetConsoleTextAttribute (get_output_handle (), dev_state->current_win32_attr);      break;    case 'h':    case 'l':      if (!dev_state->saw_question_mark)	{	  switch (dev_state->args_[0])	    {	    case 4:    /* Insert mode */	      dev_state->insert_mode = (c == 'h') ? TRUE : FALSE;	      syscall_printf ("insert mode %sabled", dev_state->insert_mode ? "en" : "dis");	      break;	    }	  break;	}      switch (dev_state->args_[0])	{	case 47:   /* Save/Restore screen */	  if (c == 'h') /* save */	    {	      CONSOLE_SCREEN_BUFFER_INFO now;	      COORD cob = { 0, 0 };	      if (!GetConsoleScreenBufferInfo (get_output_handle (), &now))		break;	      dev_state->savebufsiz.X = now.srWindow.Right - now.srWindow.Left + 1;	      dev_state->savebufsiz.Y = now.srWindow.Bottom - now.srWindow.Top + 1;	      if (dev_state->savebuf)		cfree (dev_state->savebuf);	      dev_state->savebuf = (PCHAR_INFO) cmalloc (HEAP_1_BUF, sizeof (CHAR_INFO) *					     dev_state->savebufsiz.X * dev_state->savebufsiz.Y);	      ReadConsoleOutputA (get_output_handle (), dev_state->savebuf,				  dev_state->savebufsiz, cob, &now.srWindow);	    }	  else		/* restore */	    {	      CONSOLE_SCREEN_BUFFER_INFO now;	      COORD cob = { 0, 0 };	      if (!GetConsoleScreenBufferInfo (get_output_handle (), &now))		break;	      if (!dev_state->savebuf)		break;	      WriteConsoleOutputA (get_output_handle (), dev_state->savebuf,				   dev_state->savebufsiz, cob, &now.srWindow);	      cfree (dev_state->savebuf);	      dev_state->savebuf = NULL;	      dev_state->savebufsiz.X = dev_state->savebufsiz.Y = 0;	    }	  break;	case 1000: /* Mouse support */	  dev_state->use_mouse = (c == 'h') ? TRUE : FALSE;	  syscall_printf ("mouse support %sabled", dev_state->use_mouse ? "en" : "dis");	  break;	case 2000: /* Raw keyboard mode */	  set_raw_win32_keyboard_mode ((c == 'h') ? TRUE : FALSE);	  break;	default: /* Ignore */	  syscall_printf ("unknown h/l command: %d", dev_state->args_[0]);	  break;	}      break;    case 'J':      switch (dev_state->args_[0])	{	case 0:			/* Clear to end of screen */	  cursor_get (&x, &y);	  clear_screen (x, y, -1, -1);	  break;	case 1:			/* Clear from beginning of screen to cursor */	  cursor_get (&x, &y);	  clear_screen (0, 0, x, y);	  break;	case 2:			/* Clear screen */	  clear_screen (0, 0, -1, -1);	  cursor_set (TRUE, 0,0);	  break;	default:	  goto bad_escape;	}      break;    case 'A':      cursor_rel (0, -(dev_state->args_[0] ? dev_state->args_[0] : 1));      break;    case 'B':      cursor_rel (0, dev_state->args_[0] ? dev_state->args_[0] : 1);      break;    case 'C':      cursor_rel (dev_state->args_[0] ? dev_state->args_[0] : 1, 0);      break;    case 'D':      cursor_rel (-(dev_state->args_[0] ? dev_state->args_[0] : 1),0);      break;    case 'K':      switch (dev_state->args_[0])	{	  case 0:		/* Clear to end of line */	    cursor_get (&x, &y);	    clear_screen (x, y, -1, y);	    break;	  case 2:		/* Clear line */	    cursor_get (&x, &y);	    clear_screen (0, y, -1, y);	    break;	  case 1:		/* Clear from bol to cursor */	    cursor_get (&x, &y);	    clear_screen (0, y, x, y);	    break;	  default:	    goto bad_escape;	}      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);      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);      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));      break;    case 's':   /* Save cursor position */      cursor_get (&dev_state->savex, &dev_state->savey);      dev_state->savey -= dev_state->info.winTop;      break;    case 'u':   /* Restore cursor position */      cursor_set (TRUE, dev_state->savex, dev_state->savey);      break;    case 'I':	/* TAB */      cursor_get (&x, &y);      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;      cursor_get (&x, &y);      scroll_screen (0, y, -1, -1, 0, y + dev_state->args_[0]);      break;    case 'M':				/* DL - delete lines */      dev_state->args_[0] = dev_state->args_[0] ? dev_state->args_[0] : 1;      cursor_get (&x, &y);      scroll_screen (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;      cursor_get (&x, &y);      scroll_screen (x, y, -1, y, x + dev_state->args_[0], y);      break;    case 'P':				/* DC - delete chars */      dev_state->args_[0] = dev_state->args_[0] ? dev_state->args_[0] : 1;      cursor_get (&x, &y);      scroll_screen (x + dev_state->args_[0], 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);      break;    case 'T':				/* SR - Scroll down */      fillin_info ();      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]);      break;    case 'X':				/* ec - erase chars */      dev_state->args_[0] = dev_state->args_[0] ? 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);      break;    case 'Z':				/* Back tab */      cursor_get (&x, &y);      cursor_set (FALSE, ((8 * (x / 8 + 1)) - 8), y);      break;    case 'b':				/* Repeat char #1 #2 times */      if (dev_state->insert_mode)	{	  cursor_get (&x, &y);	  scroll_screen (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);      break;    case 'c':				/* u9 - Terminal enquire string */      strcpy (buf, "\033[?6c");      puts_readahead (buf);      break;    case 'n':

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -