X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=test%2Fncurses.c;h=752fe87dc7558c8f96be71d5c6aa5b340f670970;hp=863d5660f88b5fb0714b2ab6969bef04e65c176d;hb=920d493ac02ed9bbbe1e5472e665c718bfdee471;hpb=1051e5f924808ea27fcf8f5b624e63d07788b86e diff --git a/test/ncurses.c b/test/ncurses.c index 863d5660..752fe87d 100644 --- a/test/ncurses.c +++ b/test/ncurses.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2006,2007 Free Software Foundation, Inc. * + * Copyright (c) 1998-2007,2008 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.288 2007/05/12 23:04:11 tom Exp $ +$Id: ncurses.c,v 1.312 2008/03/22 23:02:57 tom Exp $ ***************************************************************************/ @@ -76,7 +76,7 @@ $Id: ncurses.c,v 1.288 2007/05/12 23:04:11 tom Exp $ #define NCURSES_CONST_PARAM const void #ifdef TRACE -static unsigned save_trace = TRACE_ORDINARY | TRACE_CALLS; +static unsigned save_trace = TRACE_ORDINARY | TRACE_ICALLS | TRACE_CALLS; extern unsigned _nc_tracing; #endif @@ -118,6 +118,8 @@ extern unsigned _nc_tracing; #endif +#define ToggleAcs(temp,real) temp = ((temp == real) ? 0 : real) + #define P(string) printw("%s\n", string) #define BLANK ' ' /* this is the background character */ @@ -170,7 +172,7 @@ isQuit(int c) { return ((c) == QUIT || (c) == ESCAPE); } -#define case_QUIT case QUIT: case ESCAPE +#define case_QUIT QUIT: case ESCAPE /* Common function to allow ^T to toggle trace-mode in the middle of a test * so that trace-files can be made smaller. @@ -183,14 +185,14 @@ wGetchar(WINDOW *win) while ((c = wgetch(win)) == CTRL('T')) { if (_nc_tracing) { save_trace = _nc_tracing; - _tracef("TOGGLE-TRACING OFF"); + Trace(("TOGGLE-TRACING OFF")); _nc_tracing = 0; } else { _nc_tracing = save_trace; } trace(_nc_tracing); if (_nc_tracing) - _tracef("TOGGLE-TRACING ON"); + Trace(("TOGGLE-TRACING ON")); } #else c = wgetch(win); @@ -268,6 +270,42 @@ wGetstring(WINDOW *win, char *buffer, int limit) } #if USE_WIDEC_SUPPORT +static wchar_t +fullwidth_of(int ch) +{ + return (ch + 0xff10 - '0'); +} + +static void +make_fullwidth_text(wchar_t *target, const char *source) +{ + int ch; + while ((ch = *source++) != 0) { + *target++ = fullwidth_of(ch); + } + *target = 0; +} + +static void +make_narrow_text(wchar_t *target, const char *source) +{ + int ch; + while ((ch = *source++) != 0) { + *target++ = ch; + } + *target = 0; +} + +static void +make_fullwidth_digit(cchar_t *target, int digit) +{ + wchar_t source[2]; + + source[0] = fullwidth_of(digit + '0'); + source[1] = 0; + setcchar(target, source, A_NORMAL, 0, 0); +} + static int wGet_wchar(WINDOW *win, wint_t *result) { @@ -276,14 +314,14 @@ wGet_wchar(WINDOW *win, wint_t *result) while ((c = wget_wch(win, result)) == CTRL('T')) { if (_nc_tracing) { save_trace = _nc_tracing; - _tracef("TOGGLE-TRACING OFF"); + Trace(("TOGGLE-TRACING OFF")); _nc_tracing = 0; } else { _nc_tracing = save_trace; } trace(_nc_tracing); if (_nc_tracing) - _tracef("TOGGLE-TRACING ON"); + Trace(("TOGGLE-TRACING ON")); } #else c = wget_wch(win, result); @@ -608,6 +646,20 @@ remember_boxes(unsigned level, WINDOW *txt_win, WINDOW *box_win) winstack[level].frame = box_win; } +#if USE_SOFTKEYS && (NCURSES_VERSION_PATCH < 20071229) && NCURSES_EXT_FUNCS +static void +slk_repaint(void) +{ + /* this chunk is now done in resize_term() */ + slk_touch(); + slk_clear(); + slk_noutrefresh(); +} + +#else +#define slk_repaint() /* nothing */ +#endif + /* * For wgetch_test(), we create pairs of windows - one for a box, one for text. * Resize both and paint the box in the parent. @@ -623,12 +675,7 @@ resize_boxes(unsigned level, WINDOW *win) touchwin(stdscr); wnoutrefresh(stdscr); -#if USE_SOFTKEYS - /* FIXME: this chunk should be done in resizeterm() */ - slk_touch(); - slk_clear(); - slk_noutrefresh(); -#endif + slk_repaint(); for (n = 0; n < level; ++n) { wresize(winstack[n].frame, high, wide); @@ -829,6 +876,8 @@ static void getch_test(void) { int delay = begin_getch_test(); + + slk_restore(); wgetch_test(0, stdscr, delay); forget_boxes(); finish_getch_test(); @@ -836,10 +885,10 @@ getch_test(void) #if USE_WIDEC_SUPPORT /* - * For wgetch_test(), we create pairs of windows - one for a box, one for text. + * For wget_wch_test(), we create pairs of windows - one for a box, one for text. * Resize both and paint the box in the parent. */ -#ifdef KEY_RESIZE +#if defined(KEY_RESIZE) && HAVE_WRESIZE static void resize_wide_boxes(unsigned level, WINDOW *win) { @@ -851,12 +900,7 @@ resize_wide_boxes(unsigned level, WINDOW *win) touchwin(stdscr); wnoutrefresh(stdscr); -#if USE_SOFTKEYS - /* FIXME: this chunk should be done in resizeterm() */ - slk_touch(); - slk_clear(); - slk_noutrefresh(); -#endif + slk_repaint(); for (n = 0; n < level; ++n) { wresize(winstack[n].frame, high, wide); @@ -1018,7 +1062,7 @@ wget_wch_test(unsigned level, WINDOW *win, int delay) } else #endif /* NCURSES_MOUSE_VERSION */ if (code == KEY_CODE_YES) { -#ifdef KEY_RESIZE +#if defined(KEY_RESIZE) && HAVE_WRESIZE if (c == KEY_RESIZE) { resize_wide_boxes(level, win); } @@ -1044,6 +1088,8 @@ static void get_wch_test(void) { int delay = begin_getch_test(); + + slk_restore(); wget_wch_test(0, stdscr, delay); forget_boxes(); finish_getch_test(); @@ -1302,7 +1348,7 @@ show_attr(int row, int skip, bool arrow, chtype attr, const char *name) } /* *INDENT-OFF* */ static const struct { - attr_t attr; + chtype attr; NCURSES_CONST char * name; } attrs_to_test[] = { { A_STANDOUT, "STANDOUT" }, @@ -1368,7 +1414,7 @@ attr_getc(int *skip, short *fg, short *bg, short *tx, int *ac, unsigned *kc) case '>': adjust_attr_string(1); break; - case_QUIT: + case case_QUIT: result = FALSE; break; default: @@ -1644,7 +1690,7 @@ wide_attr_getc(int *skip, short *fg, short *bg, short *tx, int *ac, unsigned *kc case '>': wide_adjust_attr_string(1); break; - case_QUIT: + case case_QUIT: result = FALSE; break; default: @@ -1773,7 +1819,7 @@ show_color_name(int y, int x, int color, bool wide) } static void -color_legend(WINDOW *helpwin) +color_legend(WINDOW *helpwin, bool wide) { int row = 1; int col = 1; @@ -1786,18 +1832,30 @@ color_legend(WINDOW *helpwin) mvwprintw(helpwin, row++, col, "longer than one screen. Control/N and Control/P can be used"); mvwprintw(helpwin, row++, col, - "in place up up/down arrow. Use pageup/pagedown to scroll a"); + "in place of up/down arrow. Use pageup/pagedown to scroll a"); mvwprintw(helpwin, row++, col, "full screen; control/B and control/F can be used here."); ++row; mvwprintw(helpwin, row++, col, "Toggles:"); + mvwprintw(helpwin, row++, col, + " a/A toggle altcharset off/on"); mvwprintw(helpwin, row++, col, " b/B toggle bold off/on"); mvwprintw(helpwin, row++, col, " n/N toggle text/number on/off"); mvwprintw(helpwin, row++, col, " w/W toggle width between 8/16 colors"); +#if USE_WIDEC_SUPPORT + if (wide) { + mvwprintw(helpwin, row++, col, + "Wide characters:"); + mvwprintw(helpwin, row++, col, + " x/X toggle text between ASCII and wide-character"); + } +#else + (void) wide; +#endif } #define set_color_test(name, value) if (name != value) { name = value; base_row = 0; } @@ -1817,6 +1875,7 @@ color_test(void) char numbered[80]; const char *hello; bool done = FALSE; + bool opt_acsc = FALSE; bool opt_bold = FALSE; bool opt_wide = FALSE; bool opt_nums = FALSE; @@ -1868,6 +1927,8 @@ color_test(void) init_pair(pair, fg, bg); attron((attr_t) COLOR_PAIR(pair)); + if (opt_acsc) + attron((attr_t) A_ALTCHARSET); if (opt_bold) attron((attr_t) A_BOLD); @@ -1888,6 +1949,12 @@ color_test(void) } switch (wGetchar(stdscr)) { + case 'a': + opt_acsc = FALSE; + break; + case 'A': + opt_acsc = TRUE; + break; case 'b': opt_bold = FALSE; break; @@ -1900,7 +1967,7 @@ color_test(void) case 'N': opt_nums = TRUE; break; - case_QUIT: + case case_QUIT: done = TRUE; continue; case 'w': @@ -1951,7 +2018,7 @@ color_test(void) case '?': if ((helpwin = newwin(LINES - 1, COLS - 2, 0, 0)) != 0) { box(helpwin, 0, 0); - color_legend(helpwin); + color_legend(helpwin, FALSE); wGetchar(helpwin); delwin(helpwin); } @@ -1983,9 +2050,12 @@ wide_color_test(void) char numbered[80]; const char *hello; bool done = FALSE; + bool opt_acsc = FALSE; bool opt_bold = FALSE; bool opt_wide = FALSE; bool opt_nums = FALSE; + bool opt_xchr = FALSE; + wchar_t buffer[10]; WINDOW *helpwin; while (!done) { @@ -2001,6 +2071,13 @@ wide_color_test(void) hello = "Hello"; per_row = 8; } + if (opt_xchr) { + make_fullwidth_text(buffer, hello); + width *= 2; + per_row /= 2; + } else { + make_narrow_text(buffer, hello); + } row_limit = (pairs_max + per_row - 1) / per_row; @@ -2028,14 +2105,20 @@ wide_color_test(void) if (row >= 0 && move(row, col) != ERR) { init_pair(pair, i % COLORS, i / COLORS); color_set(pair, NULL); + if (opt_acsc) + attr_on((attr_t) A_ALTCHARSET, NULL); if (opt_bold) attr_on((attr_t) A_BOLD, NULL); if (opt_nums) { sprintf(numbered, "{%02X}", i); - hello = numbered; + if (opt_xchr) { + make_fullwidth_text(buffer, numbered); + } else { + make_narrow_text(buffer, numbered); + } } - printw("%-*.*s", width, width, hello); + addnwstr(buffer, width); attr_set(A_NORMAL, 0, NULL); if ((i % per_row) == 0 && (i % COLORS) == 0) { @@ -2048,6 +2131,12 @@ wide_color_test(void) } switch (c = wGetchar(stdscr)) { + case 'a': + opt_acsc = FALSE; + break; + case 'A': + opt_acsc = TRUE; + break; case 'b': opt_bold = FALSE; break; @@ -2060,7 +2149,7 @@ wide_color_test(void) case 'N': opt_nums = TRUE; break; - case_QUIT: + case case_QUIT: done = TRUE; continue; case 'w': @@ -2069,6 +2158,12 @@ wide_color_test(void) case 'W': set_color_test(opt_wide, TRUE); break; + case 'x': + opt_xchr = FALSE; + break; + case 'X': + opt_xchr = TRUE; + break; case CTRL('p'): case KEY_UP: if (base_row <= 0) { @@ -2111,7 +2206,7 @@ wide_color_test(void) case '?': if ((helpwin = newwin(LINES - 1, COLS - 2, 0, 0)) != 0) { box(helpwin, 0, 0); - color_legend(helpwin); + color_legend(helpwin, TRUE); wGetchar(helpwin); delwin(helpwin); } @@ -2328,7 +2423,7 @@ color_edit(void) refresh(); break; - case_QUIT: + case case_QUIT: break; default: @@ -2498,7 +2593,7 @@ slk_test(void) clrtobot(); break; - case_QUIT: + case case_QUIT: goto done; #if HAVE_SLK_COLOR @@ -2515,12 +2610,16 @@ slk_test(void) } break; #endif +#if defined(NCURSES_VERSION) && defined(KEY_RESIZE) && HAVE_WRESIZE + case KEY_RESIZE: + wnoutrefresh(stdscr); + break; +#endif default: beep(); } - } while - ((c = Getchar()) != EOF); + } while (!isQuit(c = Getchar())); done: slk_clear(); @@ -2627,7 +2726,7 @@ wide_slk_test(void) clrtobot(); break; - case_QUIT: + case case_QUIT: goto done; case 'F': @@ -2642,12 +2741,15 @@ wide_slk_test(void) call_slk_color(fg, bg); } break; - +#if defined(NCURSES_VERSION) && defined(KEY_RESIZE) && HAVE_WRESIZE + case KEY_RESIZE: + wnoutrefresh(stdscr); + break; +#endif default: beep(); } - } while - ((c = Getchar()) != EOF); + } while (!isQuit(c = Getchar())); done: slk_clear(); @@ -2662,12 +2764,89 @@ wide_slk_test(void) * Alternate character-set stuff * ****************************************************************************/ +/* *INDENT-OFF* */ +static struct { + chtype attr; + const char *name; +} attrs_to_cycle[] = { + { A_NORMAL, "normal" }, + { A_BOLD, "bold" }, + { A_REVERSE, "reverse" }, + { A_UNDERLINE, "underline" }, +}; +/* *INDENT-ON* */ + +static bool +cycle_attr(int ch, unsigned *at_code, chtype *attr) +{ + bool result = TRUE; + + switch (ch) { + case 'v': + if ((*at_code += 1) >= SIZEOF(attrs_to_cycle)) + *at_code = 0; + break; + case 'V': + if (*at_code == 1) + *at_code = SIZEOF(attrs_to_cycle) - 1; + else + *at_code -= 1; + break; + default: + result = FALSE; + break; + } + if (result) + *attr = attrs_to_cycle[*at_code].attr; + return result; +} + +static bool +cycle_colors(int ch, int *fg, int *bg, short *pair) +{ + bool result = FALSE; + + if (use_colors) { + result = TRUE; + switch (ch) { + case 'F': + if ((*fg -= 1) < 0) + *fg = COLORS - 1; + break; + case 'f': + if ((*fg += 1) >= COLORS) + *fg = 0; + break; + case 'B': + if ((*bg -= 1) < 0) + *bg = COLORS - 1; + break; + case 'b': + if ((*bg += 1) >= COLORS) + *bg = 0; + break; + default: + result = FALSE; + break; + } + if (result) { + *pair = (*fg != COLOR_BLACK || *bg != COLOR_BLACK); + if (*pair != 0) { + *pair = 1; + if (init_pair(*pair, *fg, *bg) == ERR) { + result = FALSE; + } + } + } + } + return result; +} /* ISO 6429: codes 0x80 to 0x9f may be control characters that cause the * terminal to perform functions. The remaining codes can be graphic. */ static void -show_upper_chars(unsigned first) +show_upper_chars(unsigned first, int repeat, attr_t attr, short pair) { bool C1 = (first == 128); unsigned code; @@ -2682,27 +2861,33 @@ show_upper_chars(unsigned first) refresh(); for (code = first; code <= last; code++) { + int count = repeat; int row = 2 + ((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); + + do { + if (C1) + nodelay(stdscr, TRUE); + echochar(code | attr | COLOR_PAIR(pair)); + if (C1) { + /* (yes, this _is_ crude) */ + while ((reply = Getchar()) != ERR) { + addch(UChar(reply)); + napms(10); + } + nodelay(stdscr, FALSE); } - nodelay(stdscr, FALSE); - } + } while (--count > 0); } } +#define PC_COLS 4 + static void -show_pc_chars(void) +show_pc_chars(int repeat, attr_t attr, short pair) { unsigned code; @@ -2713,35 +2898,41 @@ show_pc_chars(void) refresh(); for (code = 0; code < 16; ++code) { - mvprintw(2, (int) code * 3 + 8, "%X", code); + mvprintw(2, (int) code * PC_COLS + 8, "%X", code); } for (code = 0; code < 256; code++) { + int count = repeat; int row = 3 + (code / 16) + (code >= 128); - int col = 8 + (code % 16) * 3; + int col = 8 + (code % 16) * PC_COLS; if ((code % 16) == 0) mvprintw(row, 0, "0x%02x:", code); move(row, col); - switch (code) { - case '\n': - case '\r': - case '\b': - case '\f': - case '\033': - case 0x9b: - /* - * Skip the ones that do not work. - */ - break; - default: - addch(code | A_ALTCHARSET); - break; - } + do { + switch (code) { + case '\n': + case '\r': + case '\b': + case '\f': + case '\033': + case 0x9b: + /* + * Skip the ones that do not work. + */ + break; + default: + addch(code | A_ALTCHARSET | attr | COLOR_PAIR(pair)); + break; + } + } while (--count > 0); } } static void -show_box_chars(void) +show_box_chars(int repeat, attr_t attr, short pair) { + (void) repeat; + attr |= COLOR_PAIR(pair); + erase(); attron(A_BOLD); mvaddstr(0, 20, "Display of the ACS Line-Drawing Set"); @@ -2749,35 +2940,38 @@ show_box_chars(void) 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); + mvhline(LINES / 2, 0, ACS_HLINE | attr, COLS); + mvvline(0, COLS / 2, ACS_VLINE | attr, LINES); + mvaddch(0, COLS / 2, ACS_TTEE | attr); + mvaddch(LINES / 2, COLS / 2, ACS_PLUS | attr); + mvaddch(LINES - 1, COLS / 2, ACS_BTEE | attr); + mvaddch(LINES / 2, 0, ACS_LTEE | attr); + mvaddch(LINES / 2, COLS - 1, ACS_RTEE | attr); /* *INDENT-ON* */ } static int -show_1_acs(int n, const char *name, chtype code) +show_1_acs(int n, int repeat, const char *name, chtype code) { const int height = 16; int row = 2 + (n % height); int col = (n / height) * COLS / 2; + mvprintw(row, col, "%*s : ", COLS / 4, name); - addch(code); + do { + addch(code); + } while (--repeat > 0); return n + 1; } static void -show_acs_chars(void) +show_acs_chars(int repeat, attr_t attr, short pair) /* display the ACS character set */ { int n; -#define BOTH(name) #name, name +#define BOTH(name) #name, (name | attr | COLOR_PAIR(pair)) erase(); attron(A_BOLD); @@ -2785,48 +2979,48 @@ show_acs_chars(void) 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(0, repeat, BOTH(ACS_ULCORNER)); + n = show_1_acs(n, repeat, BOTH(ACS_URCORNER)); + n = show_1_acs(n, repeat, BOTH(ACS_LLCORNER)); + n = show_1_acs(n, repeat, 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, repeat, BOTH(ACS_LTEE)); + n = show_1_acs(n, repeat, BOTH(ACS_RTEE)); + n = show_1_acs(n, repeat, BOTH(ACS_TTEE)); + n = show_1_acs(n, repeat, BOTH(ACS_BTEE)); - n = show_1_acs(n, BOTH(ACS_HLINE)); - n = show_1_acs(n, BOTH(ACS_VLINE)); + n = show_1_acs(n, repeat, BOTH(ACS_HLINE)); + n = show_1_acs(n, repeat, BOTH(ACS_VLINE)); /* * HPUX's ACS definitions are broken here. Just give up. */ #if !(defined(__hpux) && !defined(NCURSES_VERSION)) - 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)); + n = show_1_acs(n, repeat, BOTH(ACS_LARROW)); + n = show_1_acs(n, repeat, BOTH(ACS_RARROW)); + n = show_1_acs(n, repeat, BOTH(ACS_UARROW)); + n = show_1_acs(n, repeat, BOTH(ACS_DARROW)); + + n = show_1_acs(n, repeat, BOTH(ACS_BLOCK)); + n = show_1_acs(n, repeat, BOTH(ACS_BOARD)); + n = show_1_acs(n, repeat, BOTH(ACS_LANTERN)); + n = show_1_acs(n, repeat, BOTH(ACS_BULLET)); + n = show_1_acs(n, repeat, BOTH(ACS_CKBOARD)); + n = show_1_acs(n, repeat, BOTH(ACS_DEGREE)); + n = show_1_acs(n, repeat, BOTH(ACS_DIAMOND)); + n = show_1_acs(n, repeat, BOTH(ACS_PLMINUS)); + n = show_1_acs(n, repeat, BOTH(ACS_PLUS)); + + n = show_1_acs(n, repeat, BOTH(ACS_GEQUAL)); + n = show_1_acs(n, repeat, BOTH(ACS_NEQUAL)); + n = show_1_acs(n, repeat, BOTH(ACS_LEQUAL)); + + n = show_1_acs(n, repeat, BOTH(ACS_STERLING)); + n = show_1_acs(n, repeat, BOTH(ACS_PI)); + n = show_1_acs(n, repeat, BOTH(ACS_S1)); + n = show_1_acs(n, repeat, BOTH(ACS_S3)); + n = show_1_acs(n, repeat, BOTH(ACS_S7)); + n = show_1_acs(n, repeat, BOTH(ACS_S9)); #endif } @@ -2838,6 +3032,14 @@ acs_display(void) const char *pch_kludge = ((term != 0 && strstr(term, "linux")) ? "p=PC, " : ""); + chtype attr = A_NORMAL; + int digit = 0; + int repeat = 1; + int fg = COLOR_BLACK; + int bg = COLOR_BLACK; + unsigned at_code = 0; + short pair = 0; + void (*last_show_acs) (int, attr_t, short) = 0; do { switch (c) { @@ -2845,29 +3047,77 @@ acs_display(void) Repaint(); break; case 'a': - show_acs_chars(); + ToggleAcs(last_show_acs, show_acs_chars); + break; + case 'p': + if (*pch_kludge) + ToggleAcs(last_show_acs, show_pc_chars); + else + beep(); break; case 'x': - show_box_chars(); + ToggleAcs(last_show_acs, show_box_chars); break; case '0': case '1': case '2': case '3': - show_upper_chars((unsigned) ((c - '0') * 32 + 128)); + digit = (c - '0'); + last_show_acs = 0; break; - case 'p': - show_pc_chars(); + case '-': + if (digit > 0) { + --digit; + last_show_acs = 0; + } else { + beep(); + } + break; + case '+': + if (digit < 3) { + ++digit; + last_show_acs = 0; + } else { + beep(); + } + break; + case '>': + if (repeat < (COLS / 4)) + ++repeat; + break; + case '<': + if (repeat > 1) + --repeat; break; default: - beep(); + if (cycle_attr(c, &at_code, &attr) + || cycle_colors(c, &fg, &bg, &pair)) { + break; + } else { + beep(); + } break; } + if (last_show_acs != 0) + last_show_acs(repeat, attr, pair); + else + show_upper_chars(digit * 32 + 128, repeat, attr, pair); + mvprintw(LINES - 3, 0, "Note: ANSI terminals may not display C1 characters."); mvprintw(LINES - 2, 0, - "Select: a=ACS, x=box, %s0=C1, 1,2,3=GR characters, ESC=quit", + "Select: a=ACS, x=box, %s0=C1, 1-3,+/- non-ASCII, repeat, ESC=quit", pch_kludge); + if (use_colors) { + mvprintw(LINES - 1, 0, + "v/V, f/F, b/B cycle through video attributes (%s) and color %d/%d.", + attrs_to_cycle[at_code].name, + fg, bg); + } else { + mvprintw(LINES - 1, 0, + "v/V cycles through video attributes (%s).", + attrs_to_cycle[at_code].name); + } refresh(); } while (!isQuit(c = Getchar())); @@ -2878,7 +3128,7 @@ acs_display(void) #if USE_WIDEC_SUPPORT static cchar_t * -merge_wide_attr(cchar_t *dst, cchar_t *src, attr_t attr, short pair) +merge_wide_attr(cchar_t *dst, const cchar_t *src, attr_t attr, short pair) { int count = getcchar(src, NULL, NULL, NULL, 0); wchar_t *wch = 0; @@ -2887,7 +3137,7 @@ merge_wide_attr(cchar_t *dst, cchar_t *src, attr_t attr, short pair) *dst = *src; if (count > 0) { - if ((wch = typeMalloc(wchar_t, count)) != 0) { + if ((wch = typeMalloc(wchar_t, count + 1)) != 0) { if (getcchar(src, wch, &ignore_attr, &ignore_pair, 0) != ERR) { attr |= (ignore_attr & A_ALTCHARSET); setcchar(dst, wch, attr, pair, 0); @@ -2950,20 +3200,23 @@ show_upper_widechars(int first, int repeat, int space, attr_t attr, short pair) } static int -show_1_wacs(int n, const char *name, const cchar_t *code) +show_1_wacs(int n, int repeat, const char *name, const cchar_t *code) { const int height = 16; int row = 2 + (n % height); int col = (n / height) * COLS / 2; + mvprintw(row, col, "%*s : ", COLS / 4, name); - add_wchnstr(code, 1); + while (repeat-- >= 0) { + add_wch(code); + } return n + 1; } #define MERGE_ATTR(wch) merge_wide_attr(&temp, wch, attr, pair) static void -show_wacs_chars(attr_t attr, short pair) +show_wacs_chars(int repeat, attr_t attr, short pair) /* display the wide-ACS character set */ { cchar_t temp; @@ -2979,45 +3232,45 @@ show_wacs_chars(attr_t attr, short pair) 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)); + n = show_1_wacs(0, repeat, BOTH2(WACS_ULCORNER)); + n = show_1_wacs(n, repeat, BOTH2(WACS_URCORNER)); + n = show_1_wacs(n, repeat, BOTH2(WACS_LLCORNER)); + n = show_1_wacs(n, repeat, BOTH2(WACS_LRCORNER)); + + n = show_1_wacs(n, repeat, BOTH2(WACS_LTEE)); + n = show_1_wacs(n, repeat, BOTH2(WACS_RTEE)); + n = show_1_wacs(n, repeat, BOTH2(WACS_TTEE)); + n = show_1_wacs(n, repeat, BOTH2(WACS_BTEE)); + + n = show_1_wacs(n, repeat, BOTH2(WACS_HLINE)); + n = show_1_wacs(n, repeat, BOTH2(WACS_VLINE)); + + n = show_1_wacs(n, repeat, BOTH2(WACS_LARROW)); + n = show_1_wacs(n, repeat, BOTH2(WACS_RARROW)); + n = show_1_wacs(n, repeat, BOTH2(WACS_UARROW)); + n = show_1_wacs(n, repeat, BOTH2(WACS_DARROW)); + + n = show_1_wacs(n, repeat, BOTH2(WACS_BLOCK)); + n = show_1_wacs(n, repeat, BOTH2(WACS_BOARD)); + n = show_1_wacs(n, repeat, BOTH2(WACS_LANTERN)); + n = show_1_wacs(n, repeat, BOTH2(WACS_BULLET)); + n = show_1_wacs(n, repeat, BOTH2(WACS_CKBOARD)); + n = show_1_wacs(n, repeat, BOTH2(WACS_DEGREE)); + n = show_1_wacs(n, repeat, BOTH2(WACS_DIAMOND)); + n = show_1_wacs(n, repeat, BOTH2(WACS_PLMINUS)); + n = show_1_wacs(n, repeat, 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)); + n = show_1_wacs(n, repeat, BOTH2(WACS_GEQUAL)); + n = show_1_wacs(n, repeat, BOTH2(WACS_NEQUAL)); + n = show_1_wacs(n, repeat, BOTH2(WACS_LEQUAL)); + + n = show_1_wacs(n, repeat, BOTH2(WACS_STERLING)); + n = show_1_wacs(n, repeat, BOTH2(WACS_PI)); + n = show_1_wacs(n, repeat, BOTH2(WACS_S1)); + n = show_1_wacs(n, repeat, BOTH2(WACS_S3)); + n = show_1_wacs(n, repeat, BOTH2(WACS_S7)); + n = show_1_wacs(n, repeat, BOTH2(WACS_S9)); #endif } @@ -3026,10 +3279,11 @@ show_wacs_chars(attr_t attr, short pair) #define MERGE_ATTR(wch) merge_wide_attr(&temp, wch, attr, pair) static void -show_wbox_chars(attr_t attr, short pair) +show_wbox_chars(int repeat, attr_t attr, short pair) { cchar_t temp; + (void) repeat; erase(); attron(A_BOLD); mvaddstr(0, 20, "Display of the Wide-ACS Line-Drawing Set"); @@ -3071,10 +3325,11 @@ show_2_wacs(int n, const char *name, const char *code, attr_t attr, short pair) #define SHOW_UTF8(n, name, code) show_2_wacs(n, name, code, attr, pair) static void -show_utf8_chars(attr_t attr, short pair) +show_utf8_chars(int repeat, attr_t attr, short pair) { int n; + (void) repeat; erase(); attron(A_BOLD); mvaddstr(0, 20, "Display of the Wide-ACS Character Set"); @@ -3121,83 +3376,6 @@ show_utf8_chars(attr_t attr, short pair) /* *INDENT-ON* */ } -/* *INDENT-OFF* */ -static struct { - attr_t attr; - const char *name; -} attrs_to_cycle[] = { - { A_NORMAL, "normal" }, - { A_BOLD, "bold" }, - { A_REVERSE, "reverse" }, - { A_UNDERLINE, "underline" }, -}; -/* *INDENT-ON* */ - -static bool -cycle_attr(int ch, unsigned *at_code, chtype *attr) -{ - bool result = TRUE; - - switch (ch) { - case 'v': - if ((*at_code += 1) >= SIZEOF(attrs_to_cycle)) - *at_code = 0; - break; - case 'V': - if (*at_code == 1) - *at_code = SIZEOF(attrs_to_cycle) - 1; - else - *at_code -= 1; - break; - default: - result = FALSE; - break; - } - if (result) - *attr = attrs_to_cycle[*at_code].attr; - return result; -} - -static bool -cycle_colors(int ch, int *fg, int *bg, short *pair) -{ - bool result = FALSE; - - if (use_colors) { - result = TRUE; - switch (ch) { - case 'F': - if ((*fg -= 1) < 0) - *fg = COLORS - 1; - break; - case 'f': - if ((*fg += 1) >= COLORS) - *fg = 0; - break; - case 'B': - if ((*bg -= 1) < 0) - *bg = COLORS - 1; - break; - case 'b': - if ((*bg += 1) < 0) - *bg = 0; - break; - default: - result = FALSE; - break; - } - if (result) { - *pair = (*fg != COLOR_BLACK || *bg != COLOR_BLACK); - if (*pair != 0) { - *pair = 1; - if (init_pair(*pair, *fg, *bg) == ERR) { - result = FALSE; - } - } - } - } - return result; -} /* display the wide-ACS character set */ static void @@ -3205,14 +3383,14 @@ wide_acs_display(void) { int c = 'a'; int digit = 0; - int repeat = 0; + int repeat = 1; int space = ' '; chtype attr = A_NORMAL; int fg = COLOR_BLACK; int bg = COLOR_BLACK; unsigned at_code = 0; short pair = 0; - void (*last_show_wacs) (attr_t, short) = 0; + void (*last_show_wacs) (int, attr_t, short) = 0; do { switch (c) { @@ -3220,27 +3398,31 @@ wide_acs_display(void) Repaint(); break; case 'a': - last_show_wacs = show_wacs_chars; + ToggleAcs(last_show_wacs, show_wacs_chars); break; case 'x': - last_show_wacs = show_wbox_chars; + ToggleAcs(last_show_wacs, show_wbox_chars); break; case 'u': - last_show_wacs = show_utf8_chars; + ToggleAcs(last_show_wacs, show_utf8_chars); break; default: if (c < 256 && isdigit(c)) { digit = (c - '0'); + last_show_wacs = 0; } else if (c == '+') { ++digit; + last_show_wacs = 0; } else if (c == '-' && digit > 0) { --digit; + last_show_wacs = 0; } else if (c == '>' && repeat < (COLS / 4)) { ++repeat; - } else if (c == '<' && repeat > 0) { + } else if (c == '<' && repeat > 1) { --repeat; } else if (c == '_') { space = (space == ' ') ? '_' : ' '; + last_show_wacs = 0; } else if (cycle_attr(c, &at_code, &attr) || cycle_colors(c, &fg, &bg, &pair)) { if (last_show_wacs != 0) @@ -3249,12 +3431,12 @@ wide_acs_display(void) beep(); break; } - last_show_wacs = 0; - show_upper_widechars(digit * 32 + 128, repeat, space, attr, pair); break; } if (last_show_wacs != 0) - last_show_wacs(attr, pair); + last_show_wacs(repeat, attr, pair); + else + show_upper_widechars(digit * 32 + 128, repeat, space, attr, pair); mvprintw(LINES - 3, 0, "Select: a WACS, x box, u UTF-8, 0-9,+/- non-ASCII, repeat, ESC=quit"); @@ -3379,12 +3561,17 @@ FRAME WINDOW *wind; }; -#if defined(NCURSES_VERSION) && !NCURSES_OPAQUE -#define keypad_active(win) (win)->_use_keypad -#define scroll_active(win) (win)->_scroll +#if defined(NCURSES_VERSION) +#if (NCURSES_VERSION_PATCH < 20070331) && NCURSES_EXT_FUNCS +#define is_keypad(win) (win)->_use_keypad +#define is_scrollok(win) (win)->_scroll +#elif !defined(is_keypad) +#define is_keypad(win) FALSE +#define is_scrollok(win) FALSE +#endif #else -#define keypad_active(win) FALSE -#define scroll_active(win) FALSE +#define is_keypad(win) FALSE +#define is_scrollok(win) FALSE #endif /* We need to know if these flags are actually set, so don't look in FRAME. @@ -3396,7 +3583,7 @@ HaveKeypad(FRAME * curp) { WINDOW *win = (curp ? curp->wind : stdscr); (void) win; - return keypad_active(win); + return is_keypad(win); } static bool @@ -3404,7 +3591,7 @@ HaveScroll(FRAME * curp) { WINDOW *win = (curp ? curp->wind : stdscr); (void) win; - return scroll_active(win); + return is_scrollok(win); } static void @@ -3542,7 +3729,7 @@ selectcell(int uli, int ulj, int lri, int lrj) case KEY_RIGHT: j++; break; - case_QUIT: + case case_QUIT: return ((pair *) 0); #ifdef NCURSES_MOUSE_VERSION case KEY_MOUSE: @@ -3667,7 +3854,7 @@ static void acs_and_scroll(void) /* Demonstrate windows */ { - int c, i; + int c; FRAME *current = (FRAME *) 0, *neww; WINDOW *usescr = stdscr; #if HAVE_PUTWIN && HAVE_GETWIN @@ -3780,7 +3967,7 @@ acs_and_scroll(void) case CTRL('X'): /* resize window */ if (current) { pair *tmp, ul, lr; - int mx, my; + int i, mx, my; move(0, 0); clrtoeol(); @@ -4034,16 +4221,6 @@ fill_panel(PANEL * pan) } #if USE_WIDEC_SUPPORT -static void -make_fullwidth_digit(cchar_t *target, int digit) -{ - wchar_t source[2]; - - source[0] = digit + 0xff10; - source[1] = 0; - setcchar(target, source, A_NORMAL, 0, 0); -} - static void init_wide_panel(void) { @@ -4639,7 +4816,7 @@ padgetch(WINDOW *win) c = KEY_DC; break; case ERR: /* FALLTHRU */ - case_QUIT: + case case_QUIT: count = 0; c = KEY_EXIT; break; @@ -4829,7 +5006,7 @@ menu_virtualize(int c) } } -static const char *animals[] = +static CONST_MENUS char *animals[] = { "Lions", "Tigers", @@ -4853,7 +5030,7 @@ menu_test(void) MENU *m; ITEM *items[SIZEOF(animals)]; ITEM **ip = items; - const char **ap; + CONST_MENUS char **ap; int mrows, mcols, c; WINDOW *menuwin; @@ -5059,7 +5236,7 @@ trace_set(void) if (item_value(*ip)) newtrace |= t_tbl[item_index(*ip)].mask; trace(newtrace); - _tracef("trace level interactively set to %s", tracetrace(_nc_tracing)); + Trace(("trace level interactively set to %s", tracetrace(_nc_tracing))); (void) mvprintw(LINES - 2, 0, "Trace level is %s\n", tracetrace(_nc_tracing)); @@ -5403,6 +5580,10 @@ demo_forms(void) int finished = 0, c; unsigned n = 0; +#ifdef NCURSES_MOUSE_VERSION + mousemask(ALL_MOUSE_EVENTS, (mmask_t *) 0); +#endif + move(18, 0); addstr("Defined edit/traversal keys: ^Q/ESC- exit form\n"); addstr("^N -- go to next field ^P -- go to previous field\n"); @@ -5476,6 +5657,10 @@ demo_forms(void) free_fieldtype(fty_passwd); noraw(); nl(); + +#ifdef NCURSES_MOUSE_VERSION + mousemask(ALL_MOUSE_EVENTS, (mmask_t *) 0); +#endif } #endif /* USE_LIBFORM */ @@ -5902,7 +6087,7 @@ do_single_test(const char c) break; #endif -#if USE_WIDEC_SUPPORT +#if USE_WIDEC_SUPPORT && USE_LIBPANEL case 'O': demo_panels(init_wide_panel, fill_wide_panel); break; @@ -6016,7 +6201,7 @@ rip_footer(WINDOW *win, int cols) wbkgd(win, A_REVERSE); werase(win); wmove(win, 0, 0); - wprintw(win, "footer: %d columns", cols); + wprintw(win, "footer: window %p, %d columns", win, cols); wnoutrefresh(win); return OK; } @@ -6027,7 +6212,7 @@ rip_header(WINDOW *win, int cols) wbkgd(win, A_REVERSE); werase(win); wmove(win, 0, 0); - wprintw(win, "header: %d columns", cols); + wprintw(win, "header: window %p, %d columns", win, cols); wnoutrefresh(win); return OK; } @@ -6166,7 +6351,7 @@ main(int argc, char *argv[]) setlocale(LC_ALL, ""); - while ((c = getopt(argc, argv, "a:de:fhmp:s:t:")) != EOF) { + while ((c = getopt(argc, argv, "a:de:fhmp:s:t:")) != -1) { switch (c) { #ifdef NCURSES_VERSION case 'a':