📄 ncurses.c
字号:
do {#if HAVE_SLK_COLOR if (new_color) { init_pair(1, bg, fg); slk_color(1); new_color = FALSE; mvprintw(SLK_WORK, 0, "Colors %d/%d\n", fg, bg); refresh(); }#endif move(0, 0); switch (c) { case CTRL('l'): erase(); attron(A_BOLD); mvaddstr(0, 20, "Soft Key Exerciser"); attroff(A_BOLD); slk_help(); /* fall through */ case 'a': slk_restore(); break; case 'e': wclear(stdscr); break; case 's': mvprintw(SLK_WORK, 0, "Press Q to stop the scrolling-test: "); while ((c = Getchar()) != 'Q' && (c != ERR)) addch((chtype) c); break; case 'd': slk_clear(); break; case 'l': fmt = 0; break; case 'c': fmt = 1; break; case 'r': fmt = 2; break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': (void) mvaddstr(SLK_WORK, 0, "Please enter the label value: "); strcpy(buf, ""); if ((s = slk_label(c - '0')) != 0) { strncpy(buf, s, 8); } wGetstring(stdscr, buf, 8); slk_set((c - '0'), buf, fmt); slk_refresh(); move(SLK_WORK, 0); clrtobot(); break; case 'x': case 'q': goto done;#if HAVE_SLK_COLOR case 'F': if (has_colors()) { fg = (fg + 1) % COLORS; new_color = TRUE; } break; case 'B': if (has_colors()) { bg = (bg + 1) % COLORS; new_color = TRUE; } break;#endif default: beep(); } } while ((c = Getchar()) != EOF); done: erase(); endwin();}#if USE_WIDEC_SUPPORT#define SLKLEN 8static voidwide_slk_test(void)/* exercise the soft keys */{ int c, fmt = 1; wchar_t buf[SLKLEN + 1]; char *s; short fg = COLOR_BLACK; short bg = COLOR_WHITE; bool new_color = FALSE; c = CTRL('l'); if (has_colors()) { new_color = TRUE; } do { if (new_color) { init_pair(1, bg, fg); slk_color(1); new_color = FALSE; mvprintw(SLK_WORK, 0, "Colors %d/%d\n", fg, bg); refresh(); } move(0, 0); switch (c) { case CTRL('l'): erase(); attr_on(WA_BOLD, NULL); mvaddstr(0, 20, "Soft Key Exerciser"); attr_off(WA_BOLD, NULL); slk_help(); /* fall through */ case 'a': slk_restore(); break; case 'e': wclear(stdscr); break; case 's': mvprintw(SLK_WORK, 0, "Press Q to stop the scrolling-test: "); while ((c = Getchar()) != 'Q' && (c != ERR)) addch((chtype) c); break; case 'd': slk_clear(); break; case 'l': fmt = 0; break; case 'c': fmt = 1; break; case 'r': fmt = 2; break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': (void) mvaddstr(SLK_WORK, 0, "Please enter the label value: "); *buf = 0; if ((s = slk_label(c - '0')) != 0) { char *temp = strdup(s); size_t used = strlen(temp); size_t want = SLKLEN; size_t test; mbstate_t state; buf[0] = L'\0'; while (want > 0 && used != 0) { const char *base = s; memset(&state, 0, sizeof(state)); test = mbsrtowcs(0, &base, 0, &state); if (test == (size_t) -1) { temp[--used] = 0; } else if (test > want) { temp[--used] = 0; } else { memset(&state, 0, sizeof(state)); mbsrtowcs(buf, &base, want, &state); break; } } free(temp); } wGet_wstring(stdscr, buf, SLKLEN); slk_wset((c - '0'), buf, fmt); slk_refresh(); move(SLK_WORK, 0); clrtobot(); break; case 'x': case 'q': goto done; case 'F': if (has_colors()) { fg = (fg + 1) % COLORS; new_color = TRUE; } break; case 'B': if (has_colors()) { bg = (bg + 1) % COLORS; new_color = TRUE; } break; default: beep(); } } while ((c = Getchar()) != EOF); done: erase(); endwin();}#endif/**************************************************************************** * * Alternate character-set stuff * ****************************************************************************//* ISO 6429: codes 0x80 to 0x9f may be control characters that cause the * terminal to perform functions. The remaining codes can be graphic. */static voidshow_upper_chars(unsigned first){ bool C1 = (first == 128); unsigned code; unsigned last = first + 31; int reply; erase(); attron(A_BOLD); mvprintw(0, 20, "Display of %s Character Codes %d to %d", C1 ? "C1" : "GR", first, last); attroff(A_BOLD); refresh(); for (code = first; code <= last; code++) { int row = 4 + ((code - first) % 16); int col = ((code - first) / 16) * COLS / 2; char tmp[80]; sprintf(tmp, "%3u (0x%x)", code, code); mvprintw(row, col, "%*s: ", COLS / 4, tmp); if (C1) nodelay(stdscr, TRUE); echochar(code); if (C1) { /* (yes, this _is_ crude) */ while ((reply = Getchar()) != ERR) { addch(UChar(reply)); napms(10); } nodelay(stdscr, FALSE); } }}static voidshow_box_chars(void){ erase(); attron(A_BOLD); mvaddstr(0, 20, "Display of the ACS Line-Drawing Set"); attroff(A_BOLD); refresh(); box(stdscr, 0, 0); /* *INDENT-OFF* */ mvhline(LINES / 2, 0, ACS_HLINE, COLS); mvvline(0, COLS / 2, ACS_VLINE, LINES); mvaddch(0, COLS / 2, ACS_TTEE); mvaddch(LINES / 2, COLS / 2, ACS_PLUS); mvaddch(LINES - 1, COLS / 2, ACS_BTEE); mvaddch(LINES / 2, 0, ACS_LTEE); mvaddch(LINES / 2, COLS - 1, ACS_RTEE); /* *INDENT-ON* */}static intshow_1_acs(int n, const char *name, chtype code){ const int height = 16; int row = 4 + (n % height); int col = (n / height) * COLS / 2; mvprintw(row, col, "%*s : ", COLS / 4, name); addch(code); return n + 1;}static voidshow_acs_chars(void)/* display the ACS character set */{ int n;#define BOTH(name) #name, name erase(); attron(A_BOLD); mvaddstr(0, 20, "Display of the ACS Character Set"); attroff(A_BOLD); refresh(); n = show_1_acs(0, BOTH(ACS_ULCORNER)); n = show_1_acs(n, BOTH(ACS_URCORNER)); n = show_1_acs(n, BOTH(ACS_LLCORNER)); n = show_1_acs(n, BOTH(ACS_LRCORNER)); n = show_1_acs(n, BOTH(ACS_LTEE)); n = show_1_acs(n, BOTH(ACS_RTEE)); n = show_1_acs(n, BOTH(ACS_TTEE)); n = show_1_acs(n, BOTH(ACS_BTEE)); n = show_1_acs(n, BOTH(ACS_HLINE)); n = show_1_acs(n, BOTH(ACS_VLINE)); n = show_1_acs(n, BOTH(ACS_LARROW)); n = show_1_acs(n, BOTH(ACS_RARROW)); n = show_1_acs(n, BOTH(ACS_UARROW)); n = show_1_acs(n, BOTH(ACS_DARROW)); n = show_1_acs(n, BOTH(ACS_BLOCK)); n = show_1_acs(n, BOTH(ACS_BOARD)); n = show_1_acs(n, BOTH(ACS_LANTERN)); n = show_1_acs(n, BOTH(ACS_BULLET)); n = show_1_acs(n, BOTH(ACS_CKBOARD)); n = show_1_acs(n, BOTH(ACS_DEGREE)); n = show_1_acs(n, BOTH(ACS_DIAMOND)); n = show_1_acs(n, BOTH(ACS_PLMINUS)); n = show_1_acs(n, BOTH(ACS_PLUS)); n = show_1_acs(n, BOTH(ACS_GEQUAL)); n = show_1_acs(n, BOTH(ACS_NEQUAL)); n = show_1_acs(n, BOTH(ACS_LEQUAL)); n = show_1_acs(n, BOTH(ACS_STERLING)); n = show_1_acs(n, BOTH(ACS_PI)); n = show_1_acs(n, BOTH(ACS_S1)); n = show_1_acs(n, BOTH(ACS_S3)); n = show_1_acs(n, BOTH(ACS_S7)); n = show_1_acs(n, BOTH(ACS_S9));}static voidacs_display(void){ int c = 'a'; do { switch (c) { case CTRL('L'): Repaint(); break; case 'a': show_acs_chars(); break; case 'b': show_box_chars(); break; case '0': case '1': case '2': case '3': show_upper_chars((unsigned) ((c - '0') * 32 + 128)); break; } mvprintw(LINES - 3, 0, "Note: ANSI terminals may not display C1 characters."); mvprintw(LINES - 2, 0, "Select: a=ACS, b=box, 0=C1, 1,2,3=GR characters, q=quit"); refresh(); } while ((c = Getchar()) != 'x' && c != 'q'); Pause(); erase(); endwin();}#if USE_WIDEC_SUPPORTstatic voidshow_upper_widechars(int first, int repeat, int space){ cchar_t temp; wchar_t code; int last = first + 31; erase(); attron(A_BOLD); mvprintw(0, 20, "Display of Character Codes %d to %d", first, last); attroff(A_BOLD); for (code = first; code <= last; code++) { int row = 4 + ((code - first) % 16); int col = ((code - first) / 16) * COLS / 2; wchar_t codes[10]; attr_t attrs = A_NORMAL; char tmp[80]; int count = repeat; memset(&codes, 0, sizeof(codes)); codes[0] = code; sprintf(tmp, "%3ld (0x%lx)", (long) code, (long) code); mvprintw(row, col, "%*s: ", COLS / 4, tmp); setcchar(&temp, codes, attrs, 0, 0); do { /* * Give non-spacing characters something to combine with. If we * don't, they'll bunch up in a heap on the space after the ":". * Mark them with reverse-video to make them simpler to find on * the display. */ if (wcwidth(code) == 0) addch(space | A_REVERSE); /* * This could use add_wch(), but is done for comparison with the * normal 'f' test (and to make a test-case for echo_wchar()). * The screen will flicker because the erase() at the top of the * function is met by the builtin refresh() in echo_wchar(). */ echo_wchar(&temp); } while (--count > 0); }}static intshow_1_wacs(int n, const char *name, const cchar_t *code){ const int height = 16; int row = 4 + (n % height); int col = (n / height) * COLS / 2; mvprintw(row, col, "%*s : ", COLS / 4, name); add_wchnstr(code, 1); return n + 1;}static voidshow_wacs_chars(void)/* display the wide-ACS character set */{ int n;/*#define BOTH2(name) #name, &(name) */#define BOTH2(name) #name, name erase(); attron(A_BOLD); mvaddstr(0, 20, "Display of the Wide-ACS Character Set"); attroff(A_BOLD); refresh(); n = show_1_wacs(0, BOTH2(WACS_ULCORNER)); n = show_1_wacs(n, BOTH2(WACS_URCORNER)); n = show_1_wacs(n, BOTH2(WACS_LLCORNER)); n = show_1_wacs(n, BOTH2(WACS_LRCORNER)); n = show_1_wacs(n, BOTH2(WACS_LTEE)); n = show_1_wacs(n, BOTH2(WACS_RTEE)); n = show_1_wacs(n, BOTH2(WACS_TTEE)); n = show_1_wacs(n, BOTH2(WACS_BTEE)); n = show_1_wacs(n, BOTH2(WACS_HLINE)); n = show_1_wacs(n, BOTH2(WACS_VLINE)); n = show_1_wacs(n, BOTH2(WACS_LARROW)); n = show_1_wacs(n, BOTH2(WACS_RARROW)); n = show_1_wacs(n, BOTH2(WACS_UARROW)); n = show_1_wacs(n, BOTH2(WACS_DARROW)); n = show_1_wacs(n, BOTH2(WACS_BLOCK)); n = show_1_wacs(n, BOTH2(WACS_BOARD)); n = show_1_wacs(n, BOTH2(WACS_LANTERN)); n = show_1_wacs(n, BOTH2(WACS_BULLET)); n = show_1_wacs(n, BOTH2(WACS_CKBOARD)); n = show_1_wacs(n, BOTH2(WACS_DEGREE)); n = show_1_wacs(n, BOTH2(WACS_DIAMOND)); n = show_1_wacs(n, BOTH2(WACS_PLMINUS)); n = show_1_wacs(n, BOTH2(WACS_PLUS));#ifdef CURSES_WACS_ARRAY n = show_1_wacs(n, BOTH2(WACS_GEQUAL)); n = show_1_wacs(n, BOTH2(WACS_NEQUAL)); n = show_1_wacs(n, BOTH2(WACS_LEQUAL)); n = show_1_wacs(n, BOTH2(WACS_STERLING)); n = show_1_wacs(n, BOTH2(WACS_PI)); n = show_1_wacs(n, BOTH2(WACS_S1)); n = show_1_wacs(n, BOTH2(WACS_S3)); n = show_1_wacs(n, BOTH2(WACS_S7)); n = show_1_wacs(n, BOTH2(WACS_S9));#endif}static voidshow_wbox_chars(void){ erase(); attron(A_BOLD); mvaddstr(0, 20, "Display of the Wide-ACS Line-Drawing Set"); attroff(A_BOLD); refresh(); box_set(stdscr, 0, 0); /* *INDENT-OFF* */ mvhline_set(LINES / 2, 0, WACS_HLINE, COLS); mvvline_set(0, COLS / 2, WACS_VLINE, LINES); mvadd_wch(0, COLS / 2, WACS_TTEE); mvadd_wch(LINES / 2, COLS / 2, WACS_PLUS); mvadd_wch(LINES - 1, COLS / 2, WACS_BTEE); mvadd_wch(LINES / 2, 0, WACS_LTEE); mvadd_wch(LINES / 2, COLS - 1, WACS_RTEE); /* *INDENT-ON* */}static intshow_2_wacs(int n, const char *name, const char *code){ const int height = 16; int row = 4 + (n % height); int col = (n / height) * COLS / 2; char temp[80]; mvprintw(row, col, "%*s : ", COLS / 4, name); addstr(strcpy(temp, code)); return n + 1;}static voidshow_utf8_chars(void)/* display the wide-ACS character set */{ int n; erase(); attron(A_BOLD); mvaddstr(0, 20, "Display of the Wide-ACS Character Set"); attroff(A_BOLD); refresh(); /* *INDENT-OFF* */ n = show_2_wacs(0, "WACS_ULCORNER", "\342\224\214"); n = show_2_wacs(n, "WACS_URCORNER", "\342\224\220"); n = show_2_wacs(n, "WACS_LLCORNER", "\342\224\224"); n = show_2_wacs(n, "WACS_LRCORNER", "\342\224\230"); n = show_2_wacs(n, "WACS_LTEE", "\342\224\234"); n = show_2_wacs(n, "WACS_RTEE", "\342\224\244"); n = show_2_wacs(n, "WACS_TTEE", "\342\224\254"); n = show_2_wacs(n, "WACS_BTEE", "\342\224\264"); n = show_2_wacs(n, "WACS_HLINE", "\342\224\200"); n = show_2_wacs(n, "WACS_VLINE", "\342\224\202"); n = show_2_wacs(n, "WACS_LARROW", "\342\206\220"); n = show_2_wacs(n, "WACS_RARROW", "\342\206\222"); n = show_2_wacs(n, "WACS_UARROW", "\342\206\221"); n = show_2_wacs(n, "WACS_DARROW", "\342\206\223"); n = show_2_wacs(n, "WACS_BLOCK", "\342\226\256"); n = show_2_wacs(n, "WACS_BOARD", "\342\226\222"); n = show_2_wacs(n,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -