📄 new_curse.c
字号:
{ 3, "\033OD", 0404 }, /* key left */ { 3, "\033OB", 0402 }, /* key down */ { 4, "\033O6~", 0522 }, /* key next page */ { 4, "\033O5~", 0523 }, /* key prev page */ { 3, "\033O[", 0550 }, /* key end */ { 3, "\033O@", 0406 }, /* key home */ { 4, "\033O2~", 0513 }, /* key insert char */ { 3, "\033Oy", 0410 }, /* key F0 */ { 3, "\033OP", 0411 }, /* key F1 */ { 3, "\033OQ", 0412 }, /* key F2 */ { 3, "\033OR", 0413 }, /* key F3 */ { 3, "\033OS", 0414 }, /* key F4 */ { 3, "\033Ot", 0415 }, /* key F5 */ { 3, "\033Ou", 0416 }, /* key F6 */ { 3, "\033Ov", 0417 }, /* key F7 */ { 3, "\033Ol", 0420 }, /* key F8 */ { 3, "\033Ow", 0421 }, /* key F9 */ { 3, "\033Ox", 0422 }, /* key F10 */ { 5, "\033O10~", 0410 }, /* key F0 */ { 5, "\033O11~", 0411 }, /* key F1 */ { 5, "\033O12~", 0412 }, /* key F2 */ { 5, "\033O13~", 0413 }, /* key F3 */ { 5, "\033O14~", 0414 }, /* key F4 */ { 5, "\033O15~", 0415 }, /* key F5 */ { 5, "\033O17~", 0416 }, /* key F6 */ { 5, "\033O18~", 0417 }, /* key F7 */ { 5, "\033O19~", 0420 }, /* key F8 */ { 5, "\033O20~", 0421 }, /* key F9 */ { 5, "\033O21~", 0422 }, /* key F10 */ { 5, "\033O23~", 0423 }, /* key F11 */ { 5, "\033O24~", 0424 }, /* key F12 */ { 3, "\033Oq", 0534 }, /* ka1 upper-left of keypad */ { 3, "\033Os", 0535 }, /* ka3 upper-right of keypad */ { 3, "\033Or", 0536 }, /* kb2 center of keypad */ { 3, "\033Op", 0537 }, /* kc1 lower-left of keypad */ { 3, "\033On", 0540 }, /* kc3 lower-right of keypad */ { 0, "", 0 } /* end */ };struct Parameters { int value; struct Parameters *next; };int Key_vals[] = { 0407, 0526, 0515, 0525, 0512, 0510, 0402, 0514, 0517, 0516, 0410, 0411, 0422, 0412, 0413, 0414, 0415, 0416, 0417, 0420, 0421, 0406, 0513, 0511, 0404, 0533, 0522, 0523, 0405, 0520, 0521, 0524, 0403, 0534, 0535, 0536, 0537, 0540, 0541, 0542, 0543, 0544, 0545, 0546, 0547, 0550, 0527, 0551, 0552, 0553, 0554, 0555, 0556, 0557, 0560, 0561, 0562, 0532, 0563, 0564, 0565, 0566, 0567, 0570, 0571, 0627, 0630, 0572, 0573, 0574, 0575, 0576, 0577, 0600, 0601, 0602, 0603, 0604, 0605, 0606, 0607, 0610, 0611, 0612, 0613, 0614, 0615, 0616, 0617, 0620, 0621, 0622, 0623, 0624, 0625, 0626, 0423, 0424, 0425, 0426, 0427, 0430, 0431, 0432, 0433, 0434, 0435, 0436, 0437, 0440, 0441, 0442, 0443, 0444, 0445, 0446, 0447, 0450, 0451, 0452, 0453, 0454, 0455, 0456, 0457, 0460, 0461, 0462, 0463, 0464, 0465, 0466, 0467, 0470, 0471, 0472, 0473, 0474, 0475, 0476, 0477, 0500, 0501, 0502, 0503, 0504, 0505, 0506, 0507};int attributes_set[9];static int nc_attributes = 0; /* global attributes for new_curse to observe */#ifdef SYS5struct termio Terminal;struct termio Saved_tty;#elsestruct sgttyb Terminal;struct sgttyb Saved_tty;#endifchar *tc_;int Booleans[128]; int Numbers[128];char *String_table[1024];int *virtual_lines;static char nc_scrolling_ability = FALSE;#ifdef CAP#if defined(__STDC__) || defined(__cplusplus)#define P_(s) s#else#define P_(s) ()#endif /* __STDC__ */int tc_Get_int P_((int));void CAP_PARSE P_((void));void Find_term P_((void));#undef P_#endif /* CAP */#ifndef __STDC__#ifndef HAS_STDLIBextern char *fgets();extern char *malloc();extern char *getenv();FILE *fopen(); /* declaration for open function */#endif /* HAS_STDLIB */#endif /* __STDC__ */#ifdef SIGWINCH/* | Copy the contents of one window to another. */void copy_window(origin, destination)WINDOW *origin, *destination;{ int row, column; struct _line *orig, *dest; orig = origin->first_line; dest = destination->first_line; for (row = 0; row < (min(origin->Num_lines, destination->Num_lines)); row++) { for (column = 0; column < (min(origin->Num_cols, destination->Num_cols)); column++) { dest->row[column] = orig->row[column]; dest->attributes[column] = orig->attributes[column]; } dest->changed = orig->changed; dest->scroll = orig->scroll; dest->last_char = min(orig->last_char, destination->Num_cols); orig = orig->next_screen; dest = dest->next_screen; } destination->LX = min((destination->Num_cols - 1), origin->LX); destination->LY = min((destination->Num_lines - 1), origin->LY); destination->Attrib = origin->Attrib; destination->scroll_up = origin->scroll_up; destination->scroll_down = origin->scroll_down; destination->SCROLL_CLEAR = origin->SCROLL_CLEAR;}void reinitscr(foo)int foo; { WINDOW *local_virt; WINDOW *local_std; WINDOW *local_cur; signal(SIGWINCH, reinitscr);#ifdef TIOCGWINSZ if (ioctl(0, TIOCGWINSZ, &ws) >= 0) { if (ws.ws_row == LINES && ws.ws_col == COLS) return; if (ws.ws_row > 0) LINES = ws.ws_row; if (ws.ws_col > 0) COLS = ws.ws_col; }#endif /* TIOCGWINSZ */ local_virt = newwin(LINES, COLS, 0, 0); local_std = newwin(LINES, COLS, 0, 0); local_cur = newwin(LINES, COLS, 0, 0); copy_window(virtual_scr, local_virt); copy_window(stdscr, local_std); copy_window(curscr, local_cur); delwin(virtual_scr); delwin(stdscr); delwin(curscr); virtual_scr = local_virt; stdscr = local_std; curscr = local_cur; free(virtual_lines); virtual_lines = (int *) malloc(LINES * (sizeof(int))); interrupt_flag = TRUE;}#endif /* SIGWINCH */void initscr() /* initialize terminal for operations */{ int value; char *lines_string; char *columns_string;#ifdef CAP char *pointer;#endif /* CAP */#ifdef DIAGprintf("starting initscr \n");fflush(stdout);#endif if (initialized) return;#ifdef BSD_SELECT setbuf(stdin, NULL);#endif /* BSD_SELECT */ Flip_Bytes = FALSE; Parity = 0; Time_Out = FALSE; bufp = 0; Move_It = FALSE; Noblock = FALSE;#ifdef SYS5 value = ioctl(0, TCGETA, &Terminal); if (Terminal.c_cflag & PARENB) { if (Terminal.c_cflag & PARENB) Parity = 1; else Parity = 2; } if ((Terminal.c_cflag & CS8) == CS8) { Num_bits = 8; } else if ((Terminal.c_cflag & CS7) == CS7) Num_bits = 7; else if ((Terminal.c_cflag & CS6) == CS6) Num_bits = 6; else Num_bits = 5; value = Terminal.c_cflag & 037; switch (value) { case 01: speed = 50.0; break; case 02: speed = 75.0; break; case 03: speed = 110.0; break; case 04: speed = 134.5; break; case 05: speed = 150.0; break; case 06: speed = 200.0; break; case 07: speed = 300.0; break; case 010: speed = 600.0; break; case 011: speed = 900.0; break; case 012: speed = 1200.0; break; case 013: speed = 1800.0; break; case 014: speed = 2400.0; break; case 015: speed = 3600.0; break; case 016: speed = 4800.0; break; case 017: speed = 7200.0; break; case 020: speed = 9600.0; break; case 021: speed = 19200.0; break; case 022: speed = 38400.0; break; default: speed = 0.0; }#else value = ioctl(0, TIOCGETP, &Terminal); if (Terminal.sg_flags & EVENP) Parity = 2; else if (Terminal.sg_flags & ODDP) Parity = 1; value = Terminal.sg_ospeed; switch (value) { case 01: speed = 50.0; break; case 02: speed = 75.0; break; case 03: speed = 110.0; break; case 04: speed = 134.5; break; case 05: speed = 150.0; break; case 06: speed = 200.0; break; case 07: speed = 300.0; break; case 010: speed = 600.0; break; case 011: speed = 1200.0; break; case 012: speed = 1800.0; break; case 013: speed = 2400.0; break; case 014: speed = 4800.0; break; case 015: speed = 9600.0; break; default: speed = 0.0; }#endif chars_per_millisecond = (0.001 * speed) / 8.0; TERMINAL_TYPE = getenv("TERM"); if (TERMINAL_TYPE == NULL) { printf("unknown terminal type\n"); exit(0); }#ifndef CAP Fildes = -1; TERM_PATH = getenv("TERMINFO"); if (TERM_PATH != NULL) { Data_Line_len = 23 + strlen(TERM_PATH) + strlen(TERMINAL_TYPE); Term_File_name = malloc(Data_Line_len); sprintf(Term_File_name, "%s/%c/%s", TERM_PATH, *TERMINAL_TYPE, TERMINAL_TYPE); Fildes = open(Term_File_name, O_RDONLY); } if (Fildes == -1) { TERM_PATH = "/usr/lib/terminfo"; Data_Line_len = 23 + strlen(TERM_PATH) + strlen(TERMINAL_TYPE); Term_File_name = malloc(Data_Line_len); sprintf(Term_File_name, "%s/%c/%s", TERM_PATH, *TERMINAL_TYPE, TERMINAL_TYPE); Fildes = open(Term_File_name, O_RDONLY); } if (Fildes == -1) { TERM_PATH = "/usr/share/lib/terminfo"; Data_Line_len = 23 + strlen(TERM_PATH) + strlen(TERMINAL_TYPE); Term_File_name = malloc(Data_Line_len); sprintf(Term_File_name, "%s/%c/%s", TERM_PATH, *TERMINAL_TYPE, TERMINAL_TYPE); Fildes = open(Term_File_name, O_RDONLY); } if (Fildes == -1) { TERM_PATH = "/usr/share/terminfo"; Data_Line_len = 23 + strlen(TERM_PATH) + strlen(TERMINAL_TYPE); Term_File_name = malloc(Data_Line_len); sprintf(Term_File_name, "%s/%c/%s", TERM_PATH, *TERMINAL_TYPE, TERMINAL_TYPE); Fildes = open(Term_File_name, O_RDONLY); } if (Fildes == -1) { free(Term_File_name); Term_File_name = NULL; } else TERM_INFO = INFO_PARSE();#else /* | termcap information can be in the TERMCAP env variable, if so | use that, otherwise check the /etc/termcap file */ if ((pointer = Term_File_name = getenv("TERMCAP")) != NULL) { if (*Term_File_name != '/') Term_File_name = "/etc/termcap"; } else { Term_File_name = "/etc/termcap"; } if ((TFP = fopen(Term_File_name, "r")) == NULL) { printf("unable to open /etc/termcap file \n"); exit(0); } for (value = 0; value < 1024; value++) String_table[value] = NULL; for (value = 0; value < 128; value++) Booleans[value] = 0; for (value = 0; value < 128; value++) Numbers[value] = 0; Data_Line = malloc(512); if (pointer && *pointer != '/') { TERM_data_ptr = pointer; CAP_PARSE(); } else { Find_term(); CAP_PARSE(); }#endif if (String_table[pc__] == NULL) String_table[pc__] = "\0"; if ((String_table[cm__] == NULL) || (Booleans[hc__])) { fprintf(stderr, "sorry, unable to use this terminal type for screen editing\n"); exit(0); } Key_Get(); keys_vt100(); LINES = Numbers[li__]; COLS = Numbers[co__]; if ((lines_string = getenv("LINES")) != NULL) { value = atoi(lines_string); if (value > 0) LINES = value; } if ((columns_string = getenv("COLUMNS")) != NULL) { value = atoi(columns_string); if (value > 0) COLS = value; }#ifdef TIOCGWINSZ /* | get the window size */ if (ioctl(0, TIOCGWINSZ, &ws) >= 0) { if (ws.ws_row > 0) LINES = ws.ws_row; if (ws.ws_col > 0) COLS = ws.ws_col; }#endif virtual_scr = newwin(LINES, COLS, 0, 0); stdscr = newwin(LINES, COLS, 0, 0); curscr = newwin(LINES, COLS, 0, 0); wmove(stdscr, 0, 0); werase(stdscr); Repaint_screen = TRUE; initialized = TRUE; virtual_lines = (int *) malloc(LINES * (sizeof(int)));#ifdef SIGWINCH /* | reset size of windows and LINES and COLS if term window | changes size */ signal(SIGWINCH, reinitscr);#endif /* SIGWINCH */ /* | check if scrolling is available */ nc_scrolling_ability = ((String_table[al__] != NULL) && (String_table[dl__])) || ((String_table[cs__]) && (String_table[sr__]));}#ifndef CAPint Get_int() /* get a two-byte integer from the terminfo file */{ int High_byte; int Low_byte; int temp; Low_byte = *((unsigned char *) TERM_data_ptr++); High_byte = *((unsigned char *) TERM_data_ptr++); if (Flip_Bytes) { temp = Low_byte; Low_byte = High_byte; High_byte = temp; } if ((High_byte == 255) && (Low_byte == 255)) return (-1); else return(Low_byte + (High_byte * 256));}int INFO_PARSE() /* parse off the data in the terminfo data file */{ int offset; int magic_number = 0; int counter = 0; int Num_names = 0; int Num_bools = 0; int Num_ints = 0; int Num_strings = 0; int string_table_len = 0; char *temp_ptr; TERM_data_ptr = Data_Line = malloc((10240 * (sizeof(char)))); Data_Line_len = read(Fildes, Data_Line, 10240); if ((Data_Line_len >= 10240) || (Data_Line_len < 0)) return(0); /* | get magic number */ magic_number = Get_int(); /* | if magic number not right, reverse byte order and check again */ if (magic_number != 282) { Flip_Bytes = TRUE; TERM_data_ptr--; TERM_data_ptr--; magic_number = Get_int(); if (magic_number != 282) return(0); } /* | get the number of each type in the terminfo data file */ Num_names = Get_int(); Num_bools = Get_int(); Num_ints = Get_int(); Num_strings = Get_int(); string_table_len = Get_int(); Strings = malloc(string_table_len); while (Num_names > 0) { TERM_data_ptr++; Num_names--; } counter = 0; while (Num_bools) { Num_bools--; Booleans[counter++] = *TERM_data_ptr++; } if (((unsigned int) TERM_data_ptr) & 1) /* force alignment */ TERM_data_ptr++; counter = 0; while (Num_ints) { Num_ints--; Numbers[counter] = Get_int(); counter++; } temp_ptr = TERM_data_ptr + Num_strings + Num_strings; memcpy(Strings, temp_ptr, string_table_len); counter = bt__; while (Num_strings) { Num_strings--; if ((offset=Get_int()) != -1) { if (String_table[counter] == NULL) String_table[counter] = Strings + offset; } else String_table[counter] = NULL; counter++; } close(Fildes); free(Data_Line); return(TRUE);}#endif /* ifndef CAP */int AtoI() /* convert ascii text to integers */{ int Temp; Temp = 0; while ((*TERM_data_ptr >= '0') && (*TERM_data_ptr <= '9')) { Temp = (Temp * 10) + (*TERM_data_ptr - '0'); TERM_data_ptr++; } return(Temp);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -