X-Git-Url: http://ncurses.scripts.mit.edu/?a=blobdiff_plain;f=test%2Fncurses.c;h=9a90d4018dc9fbdb740e2d9988d48cd15508fce3;hb=cea2b8032daa63b0f131fd5793de28b2abdf5471;hp=fce36630ab0ff2fccd586bebb3ada7024e6f9cc4;hpb=ab61bfec8cb0c26638ea53ceadcd17048ee02996;p=ncurses.git diff --git a/test/ncurses.c b/test/ncurses.c index fce36630..9a90d401 100644 --- a/test/ncurses.c +++ b/test/ncurses.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * Copyright (c) 1998-2015,2016 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -40,7 +40,7 @@ AUTHOR Author: Eric S. Raymond 1993 Thomas E. Dickey (beginning revision 1.27 in 1996). -$Id: ncurses.c,v 1.410 2014/07/05 22:23:34 tom Exp $ +$Id: ncurses.c,v 1.429 2016/01/03 01:50:10 tom Exp $ ***************************************************************************/ @@ -305,7 +305,7 @@ wGetstring(WINDOW *win, char *buffer, int limit) static wchar_t fullwidth_digit(int ch) { - return (ch + 0xff10 - '0'); + return (wchar_t) (ch + 0xff10 - '0'); } static void @@ -323,7 +323,7 @@ make_narrow_text(wchar_t *target, const char *source) { int ch; while ((ch = *source++) != 0) { - *target++ = ch; + *target++ = (wchar_t) ch; } *target = 0; } @@ -636,15 +636,22 @@ setup_getch(WINDOW *win, GetchFlags flags) } static void -init_getch(WINDOW *win, GetchFlags flags) +init_getch(WINDOW *win, GetchFlags flags, int delay) { memset(flags, FALSE, NUM_GETCH_FLAGS); flags[UChar('k')] = (win == stdscr); flags[UChar('m')] = TRUE; + flags[UChar('t')] = (delay != 0); setup_getch(win, flags); } +static bool +blocking_getch(GetchFlags flags, int delay) +{ + return ((delay < 0) && flags['t']); +} + static void wgetch_help(WINDOW *win, GetchFlags flags) { @@ -655,7 +662,8 @@ wgetch_help(WINDOW *win, GetchFlags flags) ,"k -- toggle keypad/literal mode" ,"m -- toggle meta (7-bit/8-bit) mode" ,"^q -- quit" - ,"s -- shell out\n" + ,"s -- shell out" + ,"t -- toggle timeout" ,"w -- create a new window" #ifdef SIGTSTP ,"z -- suspend this process" @@ -810,9 +818,9 @@ wgetch_test(unsigned level, WINDOW *win, int delay) int c; int incount = 0; GetchFlags flags; - bool blocking = (delay < 0); - init_getch(win, flags); + init_getch(win, flags, delay); + notimeout(win, FALSE); wtimeout(win, delay); getyx(win, first_y, first_x); @@ -823,7 +831,7 @@ wgetch_test(unsigned level, WINDOW *win, int delay) for (;;) { while ((c = wGetchar(win)) == ERR) { incount++; - if (blocking) { + if (blocking_getch(flags, delay)) { (void) wprintw(win, "%05d: input error", incount); break; } else { @@ -831,7 +839,7 @@ wgetch_test(unsigned level, WINDOW *win, int delay) } wgetch_wrap(win, first_y); } - if (c == ERR && blocking) { + if (c == ERR && blocking_getch(flags, delay)) { wprintw(win, "ERR"); wgetch_wrap(win, first_y); } else if (isQuit(c)) { @@ -860,6 +868,10 @@ wgetch_test(unsigned level, WINDOW *win, int delay) wgetch_help(win, flags); } else if (c == 's') { ShellOut(TRUE); + } else if (c == 't') { + notimeout(win, flags[UChar('t')]); + flags[UChar('t')] = !flags[UChar('t')]; + wgetch_help(win, flags); } else if (c == 'w') { int high = getmaxy(win) - 1 - first_y + 1; int wide = getmaxx(win) - first_x; @@ -931,7 +943,7 @@ wgetch_test(unsigned level, WINDOW *win, int delay) wtimeout(win, -1); if (!level) - init_getch(win, flags); + init_getch(win, flags, delay); } static int @@ -943,7 +955,7 @@ begin_getch_test(void) refresh(); #ifdef NCURSES_MOUSE_VERSION - mousemask(ALL_MOUSE_EVENTS, (mmask_t *) 0); + mousemask(ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, (mmask_t *) 0); #endif (void) printw("Delay in 10ths of a second ( for blocking input)? "); @@ -958,7 +970,7 @@ begin_getch_test(void) delay = -1; } raw(); - move(5, 0); + move(6, 0); return delay; } @@ -1060,11 +1072,11 @@ wget_wch_test(unsigned level, WINDOW *win, int delay) wint_t c; int incount = 0; GetchFlags flags; - bool blocking = (delay < 0); int code; char *temp; - init_getch(win, flags); + init_getch(win, flags, delay); + notimeout(win, FALSE); wtimeout(win, delay); getyx(win, first_y, first_x); @@ -1075,7 +1087,7 @@ wget_wch_test(unsigned level, WINDOW *win, int delay) for (;;) { while ((code = wGet_wchar(win, &c)) == ERR) { incount++; - if (blocking) { + if (blocking_getch(flags, delay)) { (void) wprintw(win, "%05d: input error", incount); break; } else { @@ -1083,7 +1095,7 @@ wget_wch_test(unsigned level, WINDOW *win, int delay) } wgetch_wrap(win, first_y); } - if (code == ERR && blocking) { + if (code == ERR && blocking_getch(flags, delay)) { wprintw(win, "ERR"); wgetch_wrap(win, first_y); } else if (isQuit((int) c)) { @@ -1125,6 +1137,10 @@ wget_wch_test(unsigned level, WINDOW *win, int delay) wgetch_help(win, flags); } else if (c == 's') { ShellOut(TRUE); + } else if (c == 't') { + notimeout(win, flags[UChar('t')]); + flags[UChar('t')] = !flags[UChar('t')]; + wgetch_help(win, flags); } else if (c == 'w') { int high = getmaxy(win) - 1 - first_y + 1; int wide = getmaxx(win) - first_x; @@ -1184,7 +1200,7 @@ wget_wch_test(unsigned level, WINDOW *win, int delay) wtimeout(win, -1); if (!level) - init_getch(win, flags); + init_getch(win, flags, delay); } static void @@ -1255,9 +1271,10 @@ my_termattrs(void) #define ATTRSTRING_1ST 32 /* ' ' */ #define ATTRSTRING_END 126 /* '~' */ -#define COL_ATTRSTRING 25 -#define MARGIN_4_ATTRS (COL_ATTRSTRING + 8) -#define LEN_ATTRSTRING (COLS - MARGIN_4_ATTRS) +#define COLS_PRE_ATTRS 5 +#define COLS_AFT_ATTRS 15 +#define COL_ATTRSTRING (COLS_PRE_ATTRS + 17) +#define LEN_ATTRSTRING (COLS - (COL_ATTRSTRING + COLS_AFT_ATTRS)) #define MAX_ATTRSTRING (ATTRSTRING_END + 1 - ATTRSTRING_1ST) static char attr_test_string[MAX_ATTRSTRING + 1]; @@ -1412,11 +1429,11 @@ static int show_attr(WINDOW *win, int row, int skip, bool arrow, chtype attr, const char *name) { int ncv = get_ncv(); - chtype test = attr & (chtype) (~A_ALTCHARSET); + chtype test = attr & (chtype) (~(A_ALTCHARSET | A_CHARTEXT)); if (arrow) - MvPrintw(row, 5, "-->"); - MvPrintw(row, 8, "%s mode:", name); + MvPrintw(row, COLS_PRE_ATTRS - 3, "-->"); + MvPrintw(row, COLS_PRE_ATTRS, "%s mode:", name); MvPrintw(row, COL_ATTRSTRING - 1, "|"); if (skip) printw("%*s", skip, " "); @@ -1436,9 +1453,9 @@ show_attr(WINDOW *win, int row, int skip, bool arrow, chtype attr, const char *n (void) waddch(win, ch | attr); } } else { - (void) wattrset(win, attr); + (void) wattrset(win, AttrArg(attr, 0)); (void) waddstr(win, attr_test_string); - (void) wattroff(win, attr); + (void) wattroff(win, (int) attr); } if (skip) printw("%*s", skip, " "); @@ -1477,8 +1494,9 @@ show_attr(WINDOW *win, int row, int skip, bool arrow, chtype attr, const char *n if (found) printw(" (NCV)"); } - if ((termattrs() & test) != test) + if ((termattrs() & test) != test) { printw(" (Part)"); + } } } return row + 2; @@ -1640,6 +1658,7 @@ attr_test(void) beep(); } else { extras |= (chtype) COLOR_PAIR(pair); + normal &= ~A_COLOR; } } } @@ -1653,16 +1672,17 @@ attr_test(void) for (j = 0; j < my_size; ++j) { bool arrow = (j == k); row = show_attr(my_wins[j], row, n, arrow, + normal | extras | my_list[j].attr | my_list[k].attr, my_list[j].name); } - MvPrintw(row, 8, + MvPrintw(row, COLS_PRE_ATTRS, "This terminal does %shave the magic-cookie glitch", get_xmc() > -1 ? "" : "not "); - MvPrintw(row + 1, 8, "Enter '?' for help."); + MvPrintw(row + 1, COLS_PRE_ATTRS, "Enter '?' for help."); show_color_attr(fg, bg, tx); printw(" ACS (%d)", ac != 0); @@ -1685,9 +1705,9 @@ static wchar_t wide_attr_test_string[MAX_ATTRSTRING + 1]; #define FULL_HI 0xff5e #define HALF_LO 0x20 -#define isFullWidth(ch) ((ch) >= FULL_LO && (ch) <= FULL_HI) -#define ToNormalWidth(ch) (((ch) - FULL_LO) + HALF_LO) -#define ToFullWidth(ch) (((ch) - HALF_LO) + FULL_LO) +#define isFullWidth(ch) ((int)(ch) >= FULL_LO && (int)(ch) <= FULL_HI) +#define ToNormalWidth(ch) (wchar_t) (((int)(ch) - FULL_LO) + HALF_LO) +#define ToFullWidth(ch) (wchar_t) (((int)(ch) - HALF_LO) + FULL_LO) /* * Returns an ASCII code in [32..126] @@ -1695,7 +1715,7 @@ static wchar_t wide_attr_test_string[MAX_ATTRSTRING + 1]; static wchar_t normal_wchar(int ch) { - wchar_t result = ch; + wchar_t result = (wchar_t) ch; if (isFullWidth(ch)) result = ToNormalWidth(ch); return result; @@ -1708,7 +1728,7 @@ normal_wchar(int ch) static wchar_t target_wchar(int ch) { - wchar_t result = ch; + wchar_t result = (wchar_t) ch; if (use_fullwidth) { if (!isFullWidth(ch)) result = ToFullWidth(ch); @@ -1752,7 +1772,7 @@ static void wide_init_attr_string(void) { use_fullwidth = FALSE; - wide_attr_test_string[0] = default_attr_string(); + wide_attr_test_string[0] = (wchar_t) default_attr_string(); wide_adjust_attr_string(0); } @@ -1800,8 +1820,8 @@ wide_show_attr(WINDOW *win, chtype test = attr & ~WA_ALTCHARSET; if (arrow) - MvPrintw(row, 5, "-->"); - MvPrintw(row, 8, "%s mode:", name); + MvPrintw(row, COLS_PRE_ATTRS - 3, "-->"); + MvPrintw(row, COLS_PRE_ATTRS, "%s mode:", name); MvPrintw(row, COL_ATTRSTRING - 1, "|"); if (skip) printw("%*s", skip, " "); @@ -1865,8 +1885,9 @@ wide_show_attr(WINDOW *win, if (found) printw(" (NCV)"); } - if ((term_attrs() & test) != test) + if ((term_attrs() & test) != test) { printw(" (Part)"); + } } } return row + 2; @@ -2010,10 +2031,10 @@ wide_attr_test(void) my_list[j].name); } - MvPrintw(row, 8, + MvPrintw(row, COLS_PRE_ATTRS, "This terminal does %shave the magic-cookie glitch", get_xmc() > -1 ? "" : "not "); - MvPrintw(row + 1, 8, "Enter '?' for help."); + MvPrintw(row + 1, COLS_PRE_ATTRS, "Enter '?' for help."); show_color_attr(fg, bg, tx); printw(" ACS (%d)", ac != 0); @@ -2164,9 +2185,10 @@ color_test(void) int page_size = (LINES - grid_top); int pairs_max; int colors_max = COLORS; + int col_limit; int row_limit; int per_row; - char numbered[80]; + char *numbered = 0; const char *hello; bool done = FALSE; bool opt_acsc = FALSE; @@ -2176,6 +2198,15 @@ color_test(void) bool opt_wide = FALSE; WINDOW *helpwin; + numbered = (char *) calloc((size_t) (COLS + 1), sizeof(char)); + done = ((COLS < 16) || (numbered == 0)); + + /* + * Because the number of colors is usually a power of two, we also use + * a power of two for the number of colors shown per line (to be tidy). + */ + for (col_limit = 1; col_limit * 2 < COLS; col_limit *= 2) ; + while (!done) { int shown = 0; @@ -2193,11 +2224,11 @@ color_test(void) if (opt_wide) { width = 4; hello = "Test"; - per_row = (colors_max > 8) ? 16 : 8; + per_row = (col_limit / ((colors_max > 8) ? 4 : 8)); } else { width = 8; hello = "Hello"; - per_row = 8; + per_row = (col_limit / 8); } per_row -= min_colors; @@ -2228,6 +2259,9 @@ color_test(void) int col = (i % per_row + 1) * width; NCURSES_PAIRS_T pair = i; + if ((i / per_row) > row_limit) + break; + #define InxToFG(i) (NCURSES_COLOR_T) ((i % (colors_max - min_colors)) + min_colors) #define InxToBG(i) (NCURSES_COLOR_T) ((i / (colors_max - min_colors)) + min_colors) if (row >= 0 && move(row, col) != ERR) { @@ -2235,13 +2269,13 @@ color_test(void) NCURSES_COLOR_T bg = InxToBG(i); init_pair(pair, fg, bg); - attron((attr_t) COLOR_PAIR(pair)); + attron(COLOR_PAIR(pair)); if (opt_acsc) - attron((attr_t) A_ALTCHARSET); + attron(A_ALTCHARSET); if (opt_bold) - attron((attr_t) A_BOLD); + attron(A_BOLD); if (opt_revs) - attron((attr_t) A_REVERSE); + attron(A_REVERSE); if (opt_nums) { sprintf(numbered, "{%02X}", (int) i); @@ -2354,6 +2388,8 @@ color_test(void) erase(); endwin(); + + free(numbered); } #if USE_WIDEC_SUPPORT @@ -2368,9 +2404,10 @@ wide_color_test(void) int page_size = (LINES - grid_top); int pairs_max = (unsigned short) (-1); int colors_max = COLORS; + int col_limit; int row_limit; int per_row; - char numbered[80]; + char *numbered = 0; const char *hello; bool done = FALSE; bool opt_acsc = FALSE; @@ -2379,9 +2416,19 @@ wide_color_test(void) bool opt_wide = FALSE; bool opt_nums = FALSE; bool opt_xchr = FALSE; - wchar_t buffer[80]; + wchar_t *buffer = 0; WINDOW *helpwin; + numbered = (char *) calloc((size_t) (COLS + 1), sizeof(char)); + buffer = (wchar_t *) calloc((size_t) (COLS + 1), sizeof(wchar_t)); + done = ((COLS < 16) || (numbered == 0) || (buffer == 0)); + + /* + * Because the number of colors is usually a power of two, we also use + * a power of two for the number of colors shown per line (to be tidy). + */ + for (col_limit = 1; col_limit * 2 < COLS; col_limit *= 2) ; + while (!done) { int shown = 0; @@ -2395,15 +2442,14 @@ wide_color_test(void) pairs_max = COLOR_PAIRS; } - /* this assumes an 80-column line */ if (opt_wide) { width = 4; hello = "Test"; - per_row = (colors_max > 8) ? 16 : 8; + per_row = (col_limit / ((colors_max > 8) ? 4 : 8)); } else { width = 8; hello = "Hello"; - per_row = 8; + per_row = (col_limit / 8); } per_row -= min_colors; @@ -2442,15 +2488,18 @@ wide_color_test(void) int col = (i % per_row + 1) * width; NCURSES_PAIRS_T pair = (NCURSES_PAIRS_T) i; + if ((i / per_row) > row_limit) + break; + if (row >= 0 && move(row, col) != ERR) { init_pair(pair, InxToFG(i), InxToBG(i)); (void) color_set(pair, NULL); if (opt_acsc) - attr_on((attr_t) A_ALTCHARSET, NULL); + attr_on(A_ALTCHARSET, NULL); if (opt_bold) - attr_on((attr_t) A_BOLD, NULL); + attr_on(A_BOLD, NULL); if (opt_revs) - attr_on((attr_t) A_REVERSE, NULL); + attr_on(A_REVERSE, NULL); if (opt_nums) { sprintf(numbered, "{%02X}", i); @@ -2573,6 +2622,9 @@ wide_color_test(void) erase(); endwin(); + + free(numbered); + free(buffer); } #endif /* USE_WIDEC_SUPPORT */ @@ -2651,7 +2703,7 @@ color_edit(void) (i == current ? '>' : ' '), (i < (int) SIZEOF(the_color_names) ? the_color_names[i] : numeric)); - (void) attrset((attr_t) COLOR_PAIR(i)); + (void) attrset(AttrArg(COLOR_PAIR(i), 0)); addstr(" "); (void) attrset(A_NORMAL); @@ -3609,7 +3661,7 @@ show_paged_widechars(int base, MvPrintw(0, 20, "Display of Character Codes %#x to %#x", first, last); attroff(A_BOLD); - for (code = first; (int) code <= last; code++) { + for (code = (wchar_t) first; (int) code <= last; code++) { int row = (2 + ((int) code - first) / per_line); int col = 5 * ((int) code % per_line); int count; @@ -3642,7 +3694,7 @@ show_upper_widechars(int first, int repeat, int space, attr_t attr, NCURSES_PAIR MvPrintw(0, 20, "Display of Character Codes %d to %d", first, last); attroff(A_BOLD); - for (code = first; (int) code <= last; code++) { + for (code = (wchar_t) first; (int) code <= last; code++) { int row = 2 + ((code - first) % 16); int col = ((code - first) / 16) * COLS / 2; wchar_t codes[10]; @@ -5141,10 +5193,15 @@ panner_v_cleanup(int from_y, int from_x, int to_y) } static void -fill_pad(WINDOW *panpad, bool pan_lines) +fill_pad(WINDOW *panpad, bool pan_lines, bool colored) { int y, x; unsigned gridcount = 0; + chtype fill = 0; +#ifdef A_COLOR + if (colored) + fill = (chtype) COLOR_PAIR(1); +#endif wmove(panpad, 0, 0); for (y = 0; y < getmaxy(panpad); y++) { @@ -5158,7 +5215,7 @@ fill_pad(WINDOW *panpad, bool pan_lines) waddch(panpad, pan_lines ? ACS_LTEE : '+'); else waddch(panpad, (chtype) ((pan_lines ? 'a' : 'A') + - (int) (gridcount++ % 26))); + (int) (gridcount++ % 26)) | fill); } else if (y % GRIDSIZE == 0) waddch(panpad, pan_lines ? ACS_HLINE : '-'); else if (x % GRIDSIZE == 0) @@ -5172,7 +5229,8 @@ fill_pad(WINDOW *panpad, bool pan_lines) static void panner(WINDOW *pad, int top_x, int top_y, int porty, int portx, - int (*pgetc) (WINDOW *)) + int (*pgetc) (WINDOW *), + bool colored) { #if HAVE_GETTIMEOFDAY struct timeval before, after; @@ -5219,7 +5277,7 @@ panner(WINDOW *pad, break; case 'a': pan_lines = !pan_lines; - fill_pad(pad, pan_lines); + fill_pad(pad, pan_lines, colored); pending_pan = FALSE; break; @@ -5506,7 +5564,7 @@ padgetch(WINDOW *win) #define PAD_WIDE 200 static void -demo_pad(void) +demo_pad(bool colored) /* Demonstrate pads. */ { WINDOW *panpad = newpad(PAD_HIGH, PAD_WIDE); @@ -5515,8 +5573,14 @@ demo_pad(void) Cannot("cannot create requested pad"); return; } - - fill_pad(panpad, FALSE); +#ifdef A_COLOR + if (colored && use_colors) { + init_pair(1, COLOR_BLACK, COLOR_GREEN); + init_pair(2, COLOR_CYAN, COLOR_BLUE); + wbkgd(panpad, (chtype) (COLOR_PAIR(2) | ' ')); + } +#endif + fill_pad(panpad, FALSE, colored); panner_legend(LINES - 4); panner_legend(LINES - 3); @@ -5529,7 +5593,7 @@ demo_pad(void) * We'll still be able to widen it during a test, since that's required * for testing boundaries. */ - panner(panpad, 2, 2, LINES - 5, COLS - 15, padgetch); + panner(panpad, 2, 2, LINES - 5, COLS - 15, padgetch, colored); delwin(panpad); endwin(); @@ -6407,11 +6471,11 @@ overlap_test_1_attr(WINDOW *win, int flavor, int col) break; case 2: init_pair(cpair, COLOR_BLUE, COLOR_WHITE); - (void) wattrset(win, (int) (COLOR_PAIR(cpair) | A_NORMAL)); + (void) wattrset(win, AttrArg(COLOR_PAIR(cpair), A_NORMAL)); break; case 3: init_pair(cpair, COLOR_WHITE, COLOR_BLUE); - (void) wattrset(win, (int) (COLOR_PAIR(cpair) | A_BOLD)); + (void) wattrset(win, AttrArg(COLOR_PAIR(cpair), A_BOLD)); break; } } @@ -6793,7 +6857,11 @@ do_single_test(const char c) #endif case 'p': - demo_pad(); + demo_pad(FALSE); + break; + + case 'P': + demo_pad(TRUE); break; #if USE_LIBFORM @@ -6834,7 +6902,9 @@ usage(void) ," -a f,b set default-colors (assumed white-on-black)" ," -d use default-colors if terminal supports them" #endif +#if HAVE_USE_ENV ," -E call use_env(FALSE) to ignore $LINES and $COLUMNS" +#endif #if USE_SOFTKEYS ," -e fmt specify format for soft-keys test (e)" #endif @@ -6947,6 +7017,7 @@ main_menu(bool top) #endif #endif (void) puts("p = exercise pad features"); + (void) puts("P = exercise pad features, using color"); (void) puts("q = quit"); #if USE_LIBFORM (void) puts("r = exercise forms code"); @@ -7054,9 +7125,11 @@ main(int argc, char *argv[]) default_colors = TRUE; break; #endif +#if HAVE_USE_ENV case 'E': use_env(FALSE); break; +#endif case 'e': my_e_param = atoi(optarg); #ifdef NCURSES_VERSION