📄 fhandler_console.cc
字号:
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 + -