/* * newdemo.c - A demo program using PDCurses. The program * illustrates the use of colors for text output. * * Hacks by jbuhler@cs.washington.edu on 12/29/96 * * $Id: newdemo.c,v 1.39 2008/07/13 16:08:17 wmcbrine Exp $ */ #include #include #include #include #include #include int WaitForUser(void); int SubWinTest(WINDOW *); int BouncingBalls(WINDOW *); void trap(int); /* An ASCII map of Australia */ char *AusMap[17] = { " A ", " AA AA ", " N.T. AAAAA AAAA ", " AAAAAAAAAAA AAAAAAAA ", " AAAAAAAAAAAAAAAAAAAAAAAAA Qld.", " AAAAAAAAAAAAAAAAAAAAAAAAAAAA ", " AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ", " AAAAAAAAAAAAAAAAAAAAAAAAAAAA ", " AAAAAAAAAAAAAAAAAAAAAAAAA N.S.W.", "W.A. AAAAAAAAA AAAAAA Vic.", " AAA S.A. AA", " A Tas.", "" }; /* Funny messages for the scroller */ char *messages[] = { "Hello from the Land Down Under", "The Land of crocs, and a big Red Rock", "Where the sunflower runs along the highways", "The dusty red roads lead one to loneliness", "Blue sky in the morning and", "Freezing nights and twinkling stars", NULL }; int WaitForUser(void) { chtype ch; nodelay(stdscr, TRUE); halfdelay(50); ch = getch(); nodelay(stdscr, FALSE); nocbreak(); /* Reset the halfdelay() value */ cbreak(); return (ch == '\033') ? ch : 0; } int SubWinTest(WINDOW *win) { WINDOW *swin1, *swin2, *swin3; int w, h, sw, sh, bx, by; wattrset(win, 0); getmaxyx(win, h, w); getbegyx(win, by, bx); sw = w / 3; sh = h / 3; if ((swin1 = derwin(win, sh, sw, 3, 5)) == NULL) return 1; if ((swin2 = subwin(win, sh, sw, by + 4, bx + 8)) == NULL) return 1; if ((swin3 = subwin(win, sh, sw, by + 5, bx + 11)) == NULL) return 1; init_pair(8, COLOR_RED, COLOR_BLUE); wbkgd(swin1, COLOR_PAIR(8)); werase(swin1); mvwaddstr(swin1, 0, 3, "Sub-window 1"); wrefresh(swin1); init_pair(9, COLOR_CYAN, COLOR_MAGENTA); wbkgd(swin2, COLOR_PAIR(9)); werase(swin2); mvwaddstr(swin2, 0, 3, "Sub-window 2"); wrefresh(swin2); init_pair(10, COLOR_YELLOW, COLOR_GREEN); wbkgd(swin3, COLOR_PAIR(10)); werase(swin3); mvwaddstr(swin3, 0, 3, "Sub-window 3"); wrefresh(swin3); delwin(swin1); delwin(swin2); delwin(swin3); WaitForUser(); return 0; } int BouncingBalls(WINDOW *win) { chtype c1, c2, c3, ball1, ball2, ball3; int w, h, x1, y1, xd1, yd1, x2, y2, xd2, yd2, x3, y3, xd3, yd3, c; curs_set(0); wbkgd(win, COLOR_PAIR(1)); wrefresh(win); wattrset(win, 0); init_pair(11, COLOR_RED, COLOR_GREEN); init_pair(12, COLOR_BLUE, COLOR_RED); init_pair(13, COLOR_YELLOW, COLOR_WHITE); ball1 = 'O' | COLOR_PAIR(11); ball2 = '*' | COLOR_PAIR(12); ball3 = '@' | COLOR_PAIR(13); getmaxyx(win, h, w); x1 = 2 + rand() % (w - 4); y1 = 2 + rand() % (h - 4); x2 = 2 + rand() % (w - 4); y2 = 2 + rand() % (h - 4); x3 = 2 + rand() % (w - 4); y3 = 2 + rand() % (h - 4); xd1 = 1; yd1 = 1; xd2 = 1; yd2 = -1; xd3 = -1; yd3 = 1; nodelay(stdscr, TRUE); while ((c = getch()) == ERR) { x1 += xd1; if (x1 <= 1 || x1 >= w - 2) xd1 *= -1; y1 += yd1; if (y1 <= 1 || y1 >= h - 2) yd1 *= -1; x2 += xd2; if (x2 <= 1 || x2 >= w - 2) xd2 *= -1; y2 += yd2; if (y2 <= 1 || y2 >= h - 2) yd2 *= -1; x3 += xd3; if (x3 <= 1 || x3 >= w - 2) xd3 *= -1; y3 += yd3; if (y3 <= 1 || y3 >= h - 2) yd3 *= -1; c1 = mvwinch(win, y1, x1); c2 = mvwinch(win, y2, x2); c3 = mvwinch(win, y3, x3); mvwaddch(win, y1, x1, ball1); mvwaddch(win, y2, x2, ball2); mvwaddch(win, y3, x3, ball3); wmove(win, 0, 0); wrefresh(win); mvwaddch(win, y1, x1, c1); mvwaddch(win, y2, x2, c2); mvwaddch(win, y3, x3, c3); napms(150); } nodelay(stdscr, FALSE); ungetch(c); return 0; } /* Trap interrupt */ void trap(int sig) { if (sig == SIGINT) { endwin(); exit(0); } } int main(int argc, char **argv) { WINDOW *win; chtype save[80], ch; int width, height, w, x, y, i, j, seed; #ifdef XCURSES Xinitscr(argc, argv); #else initscr(); #endif seed = time((time_t *)0); srand(seed); start_color(); # if defined(NCURSES_VERSION) || (defined(PDC_BUILD) && PDC_BUILD > 3000) use_default_colors(); # endif cbreak(); noecho(); curs_set(0); #if !defined(__TURBOC__) && !defined(OS2) signal(SIGINT, trap); #endif noecho(); /* refresh stdscr so that reading from it will not cause it to overwrite the other windows that are being created */ refresh(); /* Create a drawing window */ width = 48; height = 15; win = newwin(height, width, (LINES - height) / 2, (COLS - width) / 2); if (win == NULL) { endwin(); return 1; } for (;;) { init_pair(1, COLOR_WHITE, COLOR_BLUE); wbkgd(win, COLOR_PAIR(1)); werase(win); init_pair(2, COLOR_RED, COLOR_RED); wattrset(win, COLOR_PAIR(2)); box(win, ' ', ' '); wrefresh(win); wattrset(win, 0); /* Do random output of a character */ ch = 'a'; nodelay(stdscr, TRUE); for (i = 0; i < 5000; ++i) { x = rand() % (width - 2) + 1; y = rand() % (height - 2) + 1; mvwaddch(win, y, x, ch); wrefresh(win); if (getch() != ERR) break; if (i == 2000) { ch = 'b'; init_pair(3, COLOR_CYAN, COLOR_YELLOW); wattrset(win, COLOR_PAIR(3)); } } nodelay(stdscr, FALSE); SubWinTest(win); /* Erase and draw green window */ init_pair(4, COLOR_YELLOW, COLOR_GREEN); wbkgd(win, COLOR_PAIR(4)); wattrset(win, A_BOLD); werase(win); wrefresh(win); /* Draw RED bounding box */ wattrset(win, COLOR_PAIR(2)); box(win, ' ', ' '); wrefresh(win); /* Display Australia map */ wattrset(win, A_BOLD); i = 0; while (*AusMap[i]) { mvwaddstr(win, i + 1, 8, AusMap[i]); wrefresh(win); napms(100); ++i; } init_pair(5, COLOR_BLUE, COLOR_WHITE); wattrset(win, COLOR_PAIR(5) | A_BLINK); mvwaddstr(win, height - 2, 3, " PDCurses 3.4 - DOS, OS/2, Win32, X11, SDL"); wrefresh(win); /* Draw running messages */ init_pair(6, COLOR_BLACK, COLOR_WHITE); wattrset(win, COLOR_PAIR(6)); w = width - 2; nodelay(win, TRUE); /* jbuhler's re-hacked scrolling messages */ for (j = 0; messages[j] != NULL; j++) { char *message = messages[j]; int msg_len = strlen(message); int scroll_len = w + 2 * msg_len; char *scrollbuf = malloc(scroll_len); char *visbuf = scrollbuf + msg_len; int stop = 0; int i; for (i = w + msg_len; i > 0; i--) { memset(visbuf, ' ', w); strncpy(scrollbuf + i, message, msg_len); mvwaddnstr(win, height / 2, 1, visbuf, w); wrefresh(win); if (wgetch(win) != ERR) { flushinp(); stop = 1; break; } napms(100); } free(scrollbuf); if (stop) break; } j = 0; /* Draw running 'A's across in RED */ init_pair(7, COLOR_RED, COLOR_GREEN); wattron(win, COLOR_PAIR(7)); for (i = 2; i < width - 4; ++i) { ch = mvwinch(win, 5, i); save[j++] = ch; ch = ch & 0x7f; mvwaddch(win, 5, i, ch); } wrefresh(win); /* Put a message up; wait for a key */ i = height - 2; wattrset(win, COLOR_PAIR(5)); mvwaddstr(win, i, 3, " Type a key to continue or ESC to quit "); wrefresh(win); if (WaitForUser() == '\033') break; /* Restore the old line */ wattrset(win, 0); for (i = 2, j = 0; i < width - 4; ++i) mvwaddch(win, 5, i, save[j++]); wrefresh(win); BouncingBalls(win); /* BouncingBalls() leaves a keystroke in the queue */ if (WaitForUser() == '\033') break; } endwin(); return 0; }