summaryrefslogtreecommitdiffstats
path: root/lib/libncurses/TESTS/ncurses.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libncurses/TESTS/ncurses.c')
-rw-r--r--lib/libncurses/TESTS/ncurses.c1121
1 files changed, 0 insertions, 1121 deletions
diff --git a/lib/libncurses/TESTS/ncurses.c b/lib/libncurses/TESTS/ncurses.c
deleted file mode 100644
index 9151236..0000000
--- a/lib/libncurses/TESTS/ncurses.c
+++ /dev/null
@@ -1,1121 +0,0 @@
-/****************************************************************************
-
-NAME
- ncurses.c --- ncurses library exerciser
-
-SYNOPSIS
- ncurses
-
-DESCRIPTION
- An interactive test module for the ncurses library.
-
-AUTHOR
- This software is Copyright (C) 1993 by Eric S. Raymond, all rights reserved.
-It is issued with ncurses under the same terms and conditions as the ncurses
-library source.
-
-***************************************************************************/
-/*LINTLIBRARY */
-#include <stdio.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <assert.h>
-#include <ncurses.h>
-
-#define P(s) printw("%s\n", s)
-#ifndef CTRL
-#define CTRL(x) ((x) & 0x1f)
-#endif
-
-/****************************************************************************
- *
- * Character input test
- *
- ****************************************************************************/
-
-static void getch_test(void)
-/* test the keypad feature */
-{
-char buf[BUFSIZ];
-unsigned int c;
-int incount = 0, firsttime = 0;
-bool blocking = TRUE;
-
- refresh();
-
- (void) printw("Delay in 10ths of a second (<CR> for blocking input)? ");
- echo();
- getstr(buf);
- noecho();
-
- if (isdigit(buf[0]))
- {
- timeout(atoi(buf) * 100);
- blocking = FALSE;
- }
-
- c = '?';
- for (;;)
- {
- if (firsttime++)
- {
- printw("Key pressed: %04o ", c);
- if (c >= KEY_MIN)
- {
- (void) addstr(keyname(c));
- addch('\n');
- }
- else if (c > 0x80)
- {
- if (isprint(c & ~0x80))
- (void) printw("M-%c", c);
- else
- (void) printw("M-%s", unctrl(c));
- addstr(" (high-half character)\n");
- }
- else
- {
- if (isprint(c))
- (void) printw("%c (ASCII printable character)\n", c);
- else
- (void) printw("%s (ASCII control character)\n", unctrl(c));
- }
- }
- if (c == 'x' || c == 'q')
- break;
- if (c == '?')
- addstr("Type any key to see its keypad value, `q' to quit, `?' for help.\n");
-
- while ((c = getch()) == ERR)
- if (!blocking)
- (void) printw("%05d: input timed out\n", incount++);
- }
-
- timeout(-1);
- erase();
- endwin();
-}
-
-static void attr_test(void)
-/* test text attributes */
-{
- refresh();
-
- mvaddstr(0, 20, "Character attribute test display");
-
- mvaddstr(2,8,"This is STANDOUT mode: ");
- attron(A_STANDOUT);
- addstr("abcde fghij klmno pqrst uvwxy x");
- attroff(A_STANDOUT);
-
- mvaddstr(4,8,"This is REVERSE mode: ");
- attron(A_REVERSE);
- addstr("abcde fghij klmno pqrst uvwxy x");
- attroff(A_REVERSE);
-
- mvaddstr(6,8,"This is BOLD mode: ");
- attron(A_BOLD);
- addstr("abcde fghij klmno pqrst uvwxy x");
- attroff(A_BOLD);
-
- mvaddstr(8,8,"This is UNDERLINE mode: ");
- attron(A_UNDERLINE);
- addstr("abcde fghij klmno pqrst uvwxy x");
- attroff(A_UNDERLINE);
-
- mvaddstr(10,8,"This is DIM mode: ");
- attron(A_DIM);
- addstr("abcde fghij klmno pqrst uvwxy x");
- attroff(A_DIM);
-
- mvaddstr(12,8,"This is BLINK mode: ");
- attron(A_BLINK);
- addstr("abcde fghij klmno pqrst uvwxy x");
- attroff(A_BLINK);
-
- mvaddstr(14,8,"This is BOLD UNDERLINE BLINK mode: ");
- attron(A_BOLD|A_BLINK|A_UNDERLINE);
- addstr("abcde fghij klmno pqrst uvwxy x");
- attroff(A_BOLD|A_BLINK|A_UNDERLINE);
-
- attrset(A_NORMAL);
- mvaddstr(16,8,"This is NORMAL mode: ");
- addstr("abcde fghij klmno pqrst uvwxy x");
-
- refresh();
-
- move(LINES - 1, 0);
- addstr("Press any key to continue... ");
- (void) getch();
-
- erase();
- endwin();
-}
-
-/****************************************************************************
- *
- * Color support tests
- *
- ****************************************************************************/
-
-static char *colors[] =
-{
- "black",
- "red",
- "green",
- "yellow",
- "blue",
- "magenta",
- "cyan",
- "white"
-};
-
-static void color_test(void)
-/* generate a color test pattern */
-{
- int i;
-
- refresh();
- (void) printw("There are %d color pairs\n", COLOR_PAIRS);
-
- (void) mvprintw(1, 0,
- "%dx%d matrix of foreground/background colors, bright *off*\n",
- COLORS, COLORS);
- for (i = 0; i < COLORS; i++)
- mvaddstr(2, (i+1) * 8, colors[i]);
- for (i = 0; i < COLORS; i++)
- mvaddstr(3 + i, 0, colors[i]);
- for (i = 1; i < COLOR_PAIRS; i++)
- {
- init_pair(i, i % COLORS, i / COLORS);
- attron(COLOR_PAIR(i));
- mvaddstr(3 + (i / COLORS), (i % COLORS + 1) * 8, "Hello");
- attrset(A_NORMAL);
- }
-
- (void) mvprintw(COLORS + 4, 0,
- "%dx%d matrix of foreground/background colors, bright *on*\n",
- COLORS, COLORS);
- for (i = 0; i < COLORS; i++)
- mvaddstr(5 + COLORS, (i+1) * 8, colors[i]);
- for (i = 0; i < COLORS; i++)
- mvaddstr(6 + COLORS + i, 0, colors[i]);
- for (i = 1; i < COLOR_PAIRS; i++)
- {
- init_pair(i, i % COLORS, i / COLORS);
- attron(COLOR_PAIR(i) | A_BOLD);
- mvaddstr(6 + COLORS + (i / COLORS), (i % COLORS + 1) * 8, "Hello");
- attrset(A_NORMAL);
- }
-
- move(LINES - 1, 0);
- addstr("Press any key to continue... ");
- (void) getch();
-
- erase();
- endwin();
-}
-
-static void color_edit(void)
-/* display the color test pattern, without trying to edit colors */
-{
- int i, c, value = 0, current = 0, field = 0, usebase = 0;
-
- refresh();
-
- for (i = 0; i < COLORS; i++)
- init_pair(i, COLOR_WHITE, i);
-
- do {
- short red, green, blue;
-
- attron(A_BOLD);
- mvaddstr(0, 20, "Color RGB Value Editing");
- attroff(A_BOLD);
-
- for (i = 0; i < COLORS; i++)
- {
- mvprintw(2 + i, 0, "%c %-8s:",
- (i == current ? '>' : ' '),
- (i < sizeof(colors)/sizeof(colors[0]) ? colors[i] : ""));
- attrset(COLOR_PAIR(i));
- addstr(" ");
- attrset(A_NORMAL);
-
- /*
- * Note: this refresh should *not* be necessary! It works around
- * a bug in attribute handling that apparently causes the A_NORMAL
- * attribute sets to interfere with the actual emission of the
- * color setting somehow. This needs to be fixed.
- */
- refresh();
-
- color_content(i, &red, &green, &blue);
- addstr(" R = ");
- if (current == i && field == 0) attron(A_STANDOUT);
- printw("%04d", red);
- if (current == i && field == 0) attrset(A_NORMAL);
- addstr(", G = ");
- if (current == i && field == 1) attron(A_STANDOUT);
- printw("%04d", green);
- if (current == i && field == 1) attrset(A_NORMAL);
- addstr(", B = ");
- if (current == i && field == 2) attron(A_STANDOUT);
- printw("%04d", blue);
- if (current == i && field == 2) attrset(A_NORMAL);
- attrset(A_NORMAL);
- addstr(")");
- }
-
- mvaddstr(COLORS + 3, 0,
- "Use up/down to select a color, left/right to change fields.");
- mvaddstr(COLORS + 4, 0,
- "Modify field by typing nnn=, nnn-, or nnn+. ? for help.");
-
- move(2 + current, 0);
-
- switch (c = getch())
- {
- case KEY_UP:
- current = (current == 0 ? (COLORS - 1) : current - 1);
- value = 0;
- break;
-
- case KEY_DOWN:
- current = (current == (COLORS - 1) ? 0 : current + 1);
- value = 0;
- break;
-
- case KEY_RIGHT:
- field = (field == 2 ? 0 : field + 1);
- value = 0;
- break;
-
- case KEY_LEFT:
- field = (field == 0 ? 2 : field - 1);
- value = 0;
- break;
-
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- do {
- value = value * 10 + (c - '0');
- c = getch();
- } while
- (isdigit(c));
- if (c != '+' && c != '-' && c != '=')
- beep();
- else
- ungetch(c);
- break;
-
- case '+':
- usebase = 1;
- goto changeit;
-
- case '-':
- value = -value;
- usebase = 1;
- goto changeit;
-
- case '=':
- usebase = 0;
- changeit:
- color_content(current, &red, &green, &blue);
- if (field == 0)
- red = red * usebase + value;
- else if (field == 1)
- green = green * usebase + value;
- else if (field == 2)
- blue = blue * usebase + value;
- init_color(current, red, green, blue);
- break;
-
- case '?':
- erase();
- P(" RGB Value Editing Help");
- P("");
- P("You are in the RGB value editor. Use the arrow keys to select one of");
- P("the fields in one of the RGB triples of the current colors; the one");
- P("currently selected will be reverse-video highlighted.");
- P("");
- P("To change a field, enter the digits of the new value; they won't be");
- P("echoed. Finish by typing `='; the change will take effect instantly.");
- P("To increment or decrement a value, use the same procedure, but finish");
- P("with a `+' or `-'.");
- P("");
- P("To quit, do `x' or 'q'");
-
- move(LINES - 1, 0);
- addstr("Press any key to continue... ");
- (void) getch();
- erase();
- break;
-
- case 'x':
- case 'q':
- break;
-
- default:
- beep();
- break;
- }
- } while
- (c != 'x' && c != 'q');
-
- erase();
- endwin();
-}
-
-/****************************************************************************
- *
- * Soft-key label test
- *
- ****************************************************************************/
-
-static void slk_test(void)
-/* exercise the soft keys */
-{
- int c, fmt = 1;
- char buf[9];
-
- c = CTRL('l');
- do {
- switch(c)
- {
- case CTRL('l'):
- erase();
- attron(A_BOLD);
- mvaddstr(0, 20, "Soft Key Exerciser");
- attroff(A_BOLD);
-
- move(2, 0);
- P("Available commands are:");
- P("");
- P("^L -- refresh screen");
- P("a -- activate or restore soft keys");
- P("d -- disable soft keys");
- P("c -- set centered format for labels");
- P("l -- set left-justified format for labels");
- P("r -- set right-justified format for labels");
- P("[12345678] -- set label; labels are numbered 1 through 8");
- P("e -- erase stdscr (should not erase labels)");
- P("s -- test scrolling of shortened screen");
- P("x, q -- return to main menu");
- P("");
- P("Note: if activating the soft keys causes your terminal to");
- P("scroll up one line, your terminal auto-scrolls when anything");
- P("is written to the last screen position. The ncurses code");
- P("does not yet handle this gracefully.");
- refresh();
- /* fall through */
-
- case 'a':
- slk_restore();
- break;
-
- case 'e':
- wclear(stdscr);
- break;
-
- case 's':
- move(20, 0);
- while ((c = getch()) != 'Q')
- addch(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(20, 0, "Please enter the label value: ");
- wgetnstr(stdscr, buf, 8);
- slk_set((c - '0'), buf, fmt);
- slk_refresh();
- break;
-
- case 'x':
- case 'q':
- goto done;
-
- default:
- beep();
- }
- } while
- ((c = getch()) != EOF);
-
- done:
- erase();
- endwin();
-}
-
-/****************************************************************************
- *
- * Alternate character-set stuff
- *
- ****************************************************************************/
-
-static void acs_display()
-/* display the ACS character set */
-{
- int i, j;
-
- erase();
- attron(A_BOLD);
- mvaddstr(0, 20, "Display of the ACS Character Set");
- attroff(A_BOLD);
- refresh();
-
-#define ACSY 2
- mvaddstr(ACSY + 0, 0, "ACS_ULCORNER: "); addch(ACS_ULCORNER);
- mvaddstr(ACSY + 1, 0, "ACS_LLCORNER: "); addch(ACS_LLCORNER);
- mvaddstr(ACSY + 2, 0, "ACS_URCORNER: "); addch(ACS_URCORNER);
- mvaddstr(ACSY + 3, 0, "ACS_LRCORNER: "); addch(ACS_LRCORNER);
- mvaddstr(ACSY + 4, 0, "ACS_RTEE: "); addch(ACS_RTEE);
- mvaddstr(ACSY + 5, 0, "ACS_LTEE: "); addch(ACS_LTEE);
- mvaddstr(ACSY + 6, 0, "ACS_BTEE: "); addch(ACS_BTEE);
- mvaddstr(ACSY + 7, 0, "ACS_TTEE: "); addch(ACS_TTEE);
- mvaddstr(ACSY + 8, 0, "ACS_HLINE: "); addch(ACS_HLINE);
- mvaddstr(ACSY + 9, 0, "ACS_VLINE: "); addch(ACS_VLINE);
- mvaddstr(ACSY + 10,0, "ACS_PLUS: "); addch(ACS_PLUS);
- mvaddstr(ACSY + 11,0, "ACS_S1: "); addch(ACS_S1);
- mvaddstr(ACSY + 12,0, "ACS_S9: "); addch(ACS_S9);
-
- mvaddstr(ACSY + 0, 40, "ACS_DIAMOND: "); addch(ACS_DIAMOND);
- mvaddstr(ACSY + 1, 40, "ACS_CKBOARD: "); addch(ACS_CKBOARD);
- mvaddstr(ACSY + 2, 40, "ACS_DEGREE: "); addch(ACS_DEGREE);
- mvaddstr(ACSY + 3, 40, "ACS_PLMINUS: "); addch(ACS_PLMINUS);
- mvaddstr(ACSY + 4, 40, "ACS_BULLET: "); addch(ACS_BULLET);
- mvaddstr(ACSY + 5, 40, "ACS_LARROW: "); addch(ACS_LARROW);
- mvaddstr(ACSY + 6, 40, "ACS_RARROW: "); addch(ACS_RARROW);
- mvaddstr(ACSY + 7, 40, "ACS_DARROW: "); addch(ACS_DARROW);
- mvaddstr(ACSY + 8, 40, "ACS_UARROW: "); addch(ACS_UARROW);
- mvaddstr(ACSY + 9, 40, "ACS_BOARD: "); addch(ACS_BOARD);
- mvaddstr(ACSY + 10,40, "ACS_LANTERN: "); addch(ACS_LANTERN);
- mvaddstr(ACSY + 11,40, "ACS_BLOCK: "); addch(ACS_BLOCK);
-
-#define HYBASE (ACSY + 13)
- mvprintw(HYBASE + 1, 0, "High-half characters via echochar:\n");
- for (i = 0; i < 4; i++)
- {
- move(HYBASE + i + 3, 24);
- for (j = 0; j < 32; j++)
- echochar(128 + 32 * i + j);
- }
-
- move(LINES - 1, 0);
- addstr("Press any key to continue... ");
- (void) getch();
-
- erase();
- endwin();
-}
-
-/****************************************************************************
- *
- * Windows and scrolling tester.
- *
- ****************************************************************************/
-
-typedef struct
-{
- int y, x;
-}
-pair;
-
-static void report(void)
-/* report on the cursor's current position, then restore it */
-{
- int y, x;
-
- getyx(stdscr, y, x);
- move(LINES - 1, COLS - 17);
- printw("Y = %2d X = %2d", y, x);
- move(y, x);
-}
-
-static pair *selectcell(uli, ulj, lri, lrj)
-/* arrows keys move cursor, return location at current on non-arrow key */
-int uli, ulj, lri, lrj; /* co-ordinates of corners */
-{
- static pair res; /* result cell */
- int si = lri - uli + 1; /* depth of the select area */
- int sj = lrj - ulj + 1; /* width of the select area */
- int i = 0, j = 0; /* offsets into the select area */
-
- for (;;)
- {
- move(LINES - 1, COLS - 17);
- printw("Y = %2d X = %2d", uli + i, ulj + j);
- move(uli + i, ulj + j);
-
- switch(getch())
- {
- case KEY_UP: i += si - 1; break;
- case KEY_DOWN: i++; break;
- case KEY_LEFT: j += sj - 1; break;
- case KEY_RIGHT: j++; break;
- case '\004': return((pair *)NULL);
- default: res.y = uli + i; res.x = ulj + j; return(&res);
- }
- i %= si;
- j %= sj;
- }
-}
-
-static WINDOW *getwindow(void)
-/* Ask user for a window definition */
-{
- WINDOW *rwindow, *bwindow;
- pair ul, lr, *tmp;
-
- move(0, 0); clrtoeol();
- addstr("Use arrows to move cursor, anything else to mark corner 1");
- refresh();
- if ((tmp = selectcell(1, 0, LINES-1, COLS-1)) == (pair *)NULL)
- return((WINDOW *)NULL);
- memcpy(&ul, tmp, sizeof(pair));
- addch(ACS_ULCORNER);
- move(0, 0); clrtoeol();
- addstr("Use arrows to move cursor, anything else to mark corner 2");
- refresh();
- if ((tmp = selectcell(ul.y, ul.x, LINES-1, COLS-1)) == (pair *)NULL)
- return((WINDOW *)NULL);
- memcpy(&lr, tmp, sizeof(pair));
-
- rwindow = newwin(lr.y - ul.y + 1, lr.x - ul.x + 1, ul.y, ul.x);
-
- bwindow = newwin(lr.y - ul.y + 3, lr.x - ul.x + 3, ul.y - 1, ul.x - 1);
- wborder(bwindow, ACS_VLINE, ACS_VLINE, ACS_HLINE, ACS_HLINE,
- 0, 0, 0, 0);
- wrefresh(bwindow);
- delwin(bwindow);
-
- scrollok(rwindow, TRUE);
-/* immedok(rwindow); */
- wrefresh(rwindow);
-
- return(rwindow);
-}
-
-static void acs_and_scroll()
-/* Demonstrate windows */
-{
- int c;
- struct frame
- {
- struct frame *next, *last;
- WINDOW *wind;
- }
- *oldw = (struct frame *)NULL, *current = (struct frame *)NULL, *neww;
-
- refresh();
- mvaddstr(LINES - 2, 0,
- "F1 = make new window, F2 = next window, F3 = previous window, Ctrl-D = exit");
- mvaddstr(LINES - 1, 0,
- "All other characters are echoed, windows should scroll.");
-
- c = KEY_F(1);
- do {
- report();
- if (current)
- wrefresh(current->wind);
-
- switch(c)
- {
- case KEY_F(1):
- neww = (struct frame *) malloc(sizeof(struct frame));
- if ((neww->wind = getwindow()) == (WINDOW *)NULL)
- goto breakout;
- if (oldw == NULL) /* First element, */
- {
- neww->next = neww; /* so point it at itself */
- neww->last = neww;
- current = neww;
- }
- else
- {
- neww->last = oldw; oldw->next = neww;
- neww->next = current; current->last = neww;
- }
- oldw = neww;
- keypad(neww->wind, TRUE);
- break;
-
- case KEY_F(2):
- current = current->next;
- break;
-
- case KEY_F(3):
- current = current->last;
- break;
-
- case KEY_F(4): /* undocumented --- use this to test area clears */
- selectcell(0, 0, LINES - 1, COLS - 1);
- clrtobot();
- refresh();
- break;
-
- case '\r':
- c = '\n';
- /* FALLTHROUGH */
-
- default:
- waddch(current->wind, c);
- break;
- }
- report();
- wrefresh(current->wind);
- } while
- ((c = wgetch(current->wind)) != '\004');
-
- breakout:
- erase();
- endwin();
-}
-
-#define GRIDSIZE 5
-
-static void panner(WINDOW *pad, int iy, int ix, int (*pgetc)(void))
-{
- static int porty, portx, basex = 0, basey = 0;
- int pxmax, pymax, c;
- WINDOW *vscroll = (WINDOW *)NULL, *hscroll = (WINDOW *)NULL;
-
- porty = iy; portx = ix;
-
- getmaxyx(pad, pymax, pxmax);
-
- if (pymax > porty)
- vscroll = newwin(porty - (pxmax > ix), 1, 0, portx - (pymax > iy));
- if (pxmax > portx)
- hscroll = newwin(1, portx - (pymax > iy), porty - (pxmax > ix), 0);
-
- c = KEY_REFRESH;
- do {
- switch(c)
- {
- case KEY_REFRESH:
- /* do nothing */
- break;
-
- case KEY_IC:
- if (portx >= pxmax || portx >= ix)
- beep();
- else
- {
- mvwin(vscroll, 0, ++portx - 1);
- delwin(hscroll);
- hscroll = newwin(1, portx - (pymax > porty),
- porty - (pxmax > portx), 0);
- }
- break;
-
- case KEY_IL:
- if (porty >= pymax || porty >= iy)
- beep();
- else
- {
- mvwin(hscroll, ++porty - 1, 0);
- delwin(vscroll);
- vscroll = newwin(porty - (pxmax > portx), 1,
- 0, portx - (pymax > porty));
- }
- break;
-
- case KEY_DC:
- if (portx <= 0)
- beep();
- else
- {
- mvwin(vscroll, 0, --portx - 1);
- delwin(hscroll);
- hscroll = newwin(1, portx - (pymax > porty),
- porty - (pxmax > portx), 0);
- }
- break;
-
- case KEY_DL:
- if (porty <= 0)
- beep();
- else
- {
- mvwin(hscroll, --porty - 1, 0);
- delwin(vscroll);
- vscroll = newwin(porty - (pxmax > portx), 1,
- 0, portx - (pymax > porty));
- }
- break;
-
- case KEY_LEFT:
- if (basex > 0)
- basex--;
- else
- beep();
- break;
-
- case KEY_RIGHT:
- if (basex + portx < pxmax)
- basex++;
- else
- beep();
- break;
-
- case KEY_UP:
- if (basey > 0)
- basey--;
- else
- beep();
- break;
-
- case KEY_DOWN:
- if (basey + porty < pymax)
- basey++;
- else
- beep();
- break;
- }
-
- prefresh(pad,
- basey, basex,
- 0, 0,
- porty - (hscroll != (WINDOW *)NULL) - 1,
- portx - (vscroll != (WINDOW *)NULL) - 1);
- if (vscroll)
- {
- int lowend, i, highend;
-
- lowend = basey * ((float)porty / (float)pymax);
- highend = (basey + porty) * ((float)porty / (float)pymax);
-
- touchwin(vscroll);
- for (i = 0; i < lowend; i++)
- mvwaddch(vscroll, i, 0, ACS_VLINE);
- wattron(vscroll, A_REVERSE);
- for (i = lowend; i <= highend; i++)
- mvwaddch(vscroll, i, 0, ' ');
- wattroff(vscroll, A_REVERSE);
- for (i = highend + 1; i < porty; i++)
- mvwaddch(vscroll, i, 0, ACS_VLINE);
- wrefresh(vscroll);
- }
- if (hscroll)
- {
- int lowend, j, highend;
-
- lowend = basex * ((float)portx / (float)pxmax);
- highend = (basex + portx) * ((float)portx / (float)pxmax);
-
- touchwin(hscroll);
- for (j = 0; j < lowend; j++)
- mvwaddch(hscroll, 0, j, ACS_HLINE);
- wattron(hscroll, A_REVERSE);
- for (j = lowend; j <= highend; j++)
- mvwaddch(hscroll, 0, j, ' ');
- wattroff(hscroll, A_REVERSE);
- for (j = highend + 1; j < portx; j++)
- mvwaddch(hscroll, 0, j, ACS_HLINE);
- wrefresh(hscroll);
- }
- mvaddch(porty - 1, portx - 1, ACS_LRCORNER);
-
- } while
- ((c = pgetc()) != KEY_EXIT);
-}
-
-int padgetch(void)
-{
- int c;
-
- switch(c = getch())
- {
- case 'u': return(KEY_UP);
- case 'd': return(KEY_DOWN);
- case 'r': return(KEY_RIGHT);
- case 'l': return(KEY_LEFT);
- case '+': return(KEY_IL);
- case '-': return(KEY_DL);
- case '>': return(KEY_IC);
- case '<': return(KEY_DC);
- default: return(c);
- }
-}
-
-static void demo_pad(void)
-/* Demonstrate pads. */
-{
- int i, j, gridcount = 0;
- WINDOW *panpad = newpad(200, 200);
-
- for (i = 0; i < 200; i++)
- {
- for (j = 0; j < 200; j++)
- if (i % GRIDSIZE == 0 && j % GRIDSIZE == 0)
- {
- if (i == 0 || j == 0)
- waddch(panpad, '+');
- else
- waddch(panpad, 'A' + (gridcount++ % 26));
- }
- else if (i % GRIDSIZE == 0)
- waddch(panpad, '-');
- else if (j % GRIDSIZE == 0)
- waddch(panpad, '|');
- else
- waddch(panpad, ' ');
- }
- mvprintw(LINES - 3, 0, "Use arrow keys to pan over the test pattern");
- mvprintw(LINES - 2, 0, "Use +,- to grow/shrink the panner vertically.");
- mvprintw(LINES - 1, 0, "Use <,> to grow/shrink the panner horizontally.");
- panner(panpad, LINES - 4, COLS, padgetch);
-
- endwin();
- erase();
-}
-
-/****************************************************************************
- *
- * Tests from John Burnell's PDCurses tester
- *
- ****************************************************************************/
-
-static void Continue (WINDOW *win)
-{
- wmove(win, 10, 1);
- mvwaddstr(win, 10, 1, " Press any key to continue");
- wrefresh(win);
- wgetch(win);
-}
-
-static void input_test(WINDOW *win)
-/* Input test, adapted from John Burnell's PDCurses tester */
-{
- int w, h, bx, by, sw, sh, i;
- WINDOW *subWin;
- wclear (win);
-#ifdef FOO
- char buffer [80];
- int num;
-#endif /* FOO */
-
- w = win->_maxx;
- h = win->_maxy;
- bx = win->_begx;
- by = win->_begy;
- sw = w / 3;
- sh = h / 3;
- if((subWin = subwin(win, sh, sw, by + h - sh - 2, bx + w - sw - 2)) == NULL)
- return;
-
-#ifdef A_COLOR
- if (has_colors())
- {
- init_pair(2,COLOR_CYAN,COLOR_BLUE);
- wattrset(subWin, COLOR_PAIR(2) | A_BOLD);
- }
- else
- wattrset(subWin, A_BOLD);
-#else
- wattrset(subWin, A_BOLD);
-#endif
- box(subWin, ACS_VLINE, ACS_HLINE);
-#ifdef FOO
- mvwaddstr(subWin, 2, 1, "This is a subwindow");
-#endif /* FOO */
- wrefresh(win);
-
- nocbreak();
- mvwaddstr(win, 1, 1, "Type random keys for 5 seconds.");
- mvwaddstr(win, 2, 1,
- "These should be discarded (not echoed) after the subwindow goes away.");
- wrefresh(win);
-
- for (i = 0; i < 5; i++)
- {
- mvwprintw (subWin, 1, 1, "Time = %d", i);
- wrefresh(subWin);
- sleep(1);
- flushinp();
- }
-
- delwin (subWin);
- werase(win);
- flash();
- wrefresh(win);
- sleep(1);
-
- mvwaddstr(win, 2, 1, "Press a key");
- wmove(win, 9, 10);
- wrefresh(win);
- echo();
- wgetch(win);
- flushinp();
- mvwaddstr(win, 12, 0,
- "If you see any key other than what you typed, flushinp() is broken.");
- Continue(win);
-
- wmove(win, 9, 10);
- wdelch(win);
- wrefresh(win);
- wmove(win, 12, 0);
- clrtoeol();
- waddstr(win,
- "What you typed should now have been deleted; if not, wdelch() failed.");
- Continue(win);
-
-#ifdef FOO
- /*
- * This test won't be portable until vsscanf() is
- */
- mvwaddstr(win, 6, 2, "Enter a number then a string separated by space");
- echo();
- mvwscanw(win, 7, 6, "%d %s", &num,buffer);
- mvwprintw(win, 8, 6, "String: %s Number: %d", buffer,num);
-#endif /* FOO */
-
- Continue(win);
-}
-
-/****************************************************************************
- *
- * Main sequence
- *
- ****************************************************************************/
-
-bool do_single_test(const char c)
-/* perform a single specified test */
-{
- switch (c)
- {
- case 'a':
- getch_test();
- return(TRUE);
-
- case 'b':
- attr_test();
- return(TRUE);
-
- case 'c':
- if (!has_colors())
- (void) printf("This %s terminal does not support color.\n",
- getenv("TERM"));
- else
- color_test();
- return(TRUE);
-
- case 'd':
- if (!has_colors())
- (void) printf("This %s terminal does not support color.\n",
- getenv("TERM"));
- else if (!can_change_color())
- (void) printf("This %s terminal has hardwired color values.\n",
- getenv("TERM"));
- else
- color_edit();
- return(TRUE);
-
- case 'e':
- slk_test();
- return(TRUE);
-
- case 'f':
- acs_display();
- return(TRUE);
-
- case 'g':
- acs_and_scroll();
- return(TRUE);
-
- case 'p':
- demo_pad();
- return(TRUE);
-
- case 'i':
- input_test(stdscr);
- return(TRUE);
-
- case '?':
- (void) puts("This is the ncurses capability tester.");
- (void) puts("You may select a test from the main menu by typing the");
- (void) puts("key letter of the choice (the letter to left of the =)");
- (void) puts("at the > prompt. The commands `x' or `q' will exit.");
- return(TRUE);
- }
-
- return(FALSE);
-}
-
-int main(const int argc, const char *argv[])
-{
- char buf[BUFSIZ];
-
- /* enable debugging */
- trace(TRACE_ORDINARY);
-
- /* tell it we're going to play with soft keys */
- slk_init(1);
-
- /* we must initialize the curses data structure only once */
- initscr();
-
- /* tests, in general, will want these modes */
- start_color();
- cbreak();
- noecho();
- scrollok(stdscr, TRUE);
- keypad(stdscr, TRUE);
-
- /*
- * Return to terminal mode, so we're guaranteed of being able to
- * select terminal commands even if the capabilities are wrong.
- */
- endwin();
-
- (void) puts("Welcome to ncurses. Press ? for help.");
-
- do {
- (void) puts("This is the ncurses main menu");
- (void) puts("a = character input test");
- (void) puts("b = character attribute test");
- (void) puts("c = color test pattern");
- (void) puts("d = edit RGB color values");
- (void) puts("e = exercise soft keys");
- (void) puts("f = display ACS characters");
- (void) puts("g = display windows and scrolling");
- (void) puts("p = exercise pad features");
- (void) puts("i = subwindow input test");
- (void) puts("? = get help");
-
- (void) fputs("> ", stdout);
- (void) fflush(stdout); /* necessary under SVr4 curses */
- (void) fgets(buf, BUFSIZ, stdin);
-
- if (do_single_test(buf[0])) {
- clear();
- refresh();
- endwin();
- continue;
- }
- } while
- (buf[0] != 'q' && buf[0] != 'x');
-
- exit(0);
-}
-
-/* ncurses.c ends here */
OpenPOWER on IntegriCloud