]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - test/ncurses.c
ncurses 6.0 - patch 20151226
[ncurses.git] / test / ncurses.c
index fce36630ab0ff2fccd586bebb3ada7024e6f9cc4..9fb47f1254568634849465a7b568a732b45b9565 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc.              *
+ * Copyright (c) 1998-2014,2015 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 <esr@snark.thyrsus.com> 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.425 2015/11/29 01:26:41 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 (<CR> 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);
 
@@ -2235,13 +2256,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);
@@ -2446,11 +2467,11 @@ wide_color_test(void)
                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);
@@ -2651,7 +2672,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 +3630,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 +3663,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 +5162,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 +5184,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 +5198,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 +5246,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 +5533,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 +5542,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 +5562,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 +6440,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 +6826,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 +6871,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 +6986,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 +7094,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